10

下面是我的 Jenkins 的 nginx 配置文件。其中大部分与我在文档中阅读的完全一致。

配置文件:

upstream app_server {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {
    listen 80;
    listen [::]:80 default ipv6only=on;
    server_name sub.mydomain.net;

location ^~ /jenkins/ {

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    if (!-f $request_filename) {
        proxy_pass http://app_server;
        break;
    }

    auth_basic "[....] Please confirm identity...";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

}

导航到http://sub.mydomain.net/jenkins时,我收到提示我的基本身份验证服务器说:[....] 请确认识别...。

这是正确的,但是一旦我输入了正确的凭据,我就会再次得到PROMPTED AGAIN进行基本身份验证,但这一次:Server says: Jenkins

这第二个隐藏的 basic_auth 是从哪里来的?!这对我来说没有任何意义。

在第一个提示上点击CANCEL,然后我正确地收到401 authentication required错误。

在第二个基本身份验证上点击取消( “服务器说:詹金斯”)我得到:

HTTP ERROR 401

Problem accessing /jenkins/. Reason:

Invalid password/token for user: _____
Powered by Jetty://

有谁知道可能发生了什么?

4

2 回答 2

38

通过使用 basic_auth 搜索用作任何其他应用程序的反向代理的 Nginx,找到了我的问题的解决方案。

解决方案是在这里找到的答案: https ://serverfault.com/questions/511846/basic-auth-for-a-tomcat-app-jira-with-nginx-as-reverse-proxy

我的 nginx 配置中缺少的行是:

 # Don't forward auth to Tomcat
 proxy_set_header   Authorization "";

默认情况下,在基本身份验证之后,Nginx 似乎还会将身份验证标头转发给 Jenkins,这就是导致我的问题的原因。Jenkins 收到转发的 auth 标头,然后认为它也需要授权自己?!

如果我们将反向代理设置为不转发任何授权标头,如上所示,那么一切都会正常运行。Nginx 将提示 basic_auth 并且在成功验证后,我们在转发到反向代理时明确清除(重置?)验证标头。

于 2016-02-26T20:30:26.343 回答
0

我也遇到了这个问题,在我的情况下,这是由于在 jenkins 本身中启用了安全性引起的,禁用安全性解决了这个问题。

根据他们的文档:

如果您在 Apache 中进行访问控制,请不要在 Jenkins 中启用安全性,因为这两件事会相互干扰。

https://wiki.jenkins-ci.org/display/JENKINS/Apache+frontend+for+security

似乎正在发生的事情是 nginx 将 auth_basic 响应转发给 jenkins,jenkins 尝试执行 auth_basic 作为响应。我还没有找到令人满意的解决方案。

于 2016-02-24T21:50:24.070 回答