以下是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时,我会通过服务器提示我的基本身份验证:[....]请确认身份确认... 。
这是正确的,但是一旦我输入正确的凭据,我就会再次再次提示进行基本身份验证,但这一次:服务器说:Jenkins 。
第二个隐藏的basic_auth来自哪里?!这对我没有任何意义。
在第一次提示时按 CANCEL 然后我正确收到 401授权错误。
在第二个基本身份验证中点击 CANCEL ("服务器说:Jenkins" )我得到:
HTTP ERROR 401
Problem accessing /jenkins/. Reason:
Invalid password/token for user: _____
Powered by Jetty://
有谁知道可能会发生什么?
答案 0 :(得分:29)
通过搜索Nginx找到我的问题的解决方案,该Nginx用作具有basic_auth的任何其他应用程序的反向代理。
解决方案是这里找到的答案: 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会将auth标头转发给Jenkins,这就是导致我的问题。 Jenkins接收转发的auth标头,然后认为它也需要自己授权?!
如果我们将反向代理设置为不转发任何授权标头,如上所示,则一切正常。 Nginx将提示basic_auth,在成功验证后,我们在转发到我们的反向代理时明确清除(重置?)auth标头。
答案 1 :(得分:0)
我也有这个问题,在我的情况下,这是由于jenkins本身启用了安全性,禁用安全性解决了这个问题。
根据他们的文件:
如果您在Apache中进行访问控制,请不要在Jenkins中启用安全性,因为这两件事会相互干扰。
https://wiki.jenkins-ci.org/display/JENKINS/Apache+frontend+for+security
似乎正在发生的是nginx将auth_basic响应转发给jenkins,后者尝试在响应中执行auth_basic。我还没有找到令人满意的解决方案。