具有替代端口号反向代理的 Jenkins
Jenkins with reverse proxy to alternative port number
我有一个 jenkins builder 服务器,我正在尝试使用 nginx 设置反向代理。我遵循了 jenkins 网站上的所有 howto 和文档,但唯一不同的是我需要服务器可以在不同的端口上访问,然后是 standerd https 端口。
必须可以在 https://jenkins.example.com:9090
访问服务器,该服务器现在可以正常工作,但我仍然遇到一些问题。在“管理詹金斯”中,我不断收到消息
It appears that your reverse proxy set up is broken
同样,当我登录或应用或保存一些配置更改时,我不断被重定向到 https://jenkins.example.com
而没有端口号。
当我检查 curl 并在 header 中查找某些页面时,它一直将位置 header 设置为正确的 url 但没有端口号。
我在nginx中有如下配置
server {
listen 443 ssl spdy;
server_name jenkins.example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
add_header X-Frame-Options "DENY";
ssl on;
ssl_certificate /etc/nginx/ssl/server.chain.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-$
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# enable ocsp stapling (mechanism by which a site can convey certificate revocation information to visitors in a privacy-preserving, scalable manner)
# http://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
resolver 8.8.8.8;
ssl_stapling on;
ssl_trusted_certificate /etc/nginx/ssl/server.crt;
access_log /var/log/nginx/jenkins.access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Fix the "It appears that your reverse proxy set up is broken" error.
proxy_pass http://127.0.0.1:8080/;
proxy_read_timeout 90;
proxy_redirect http://127.0.0.1:8080 https://jenkins.example.com:9090;
}
}
在 jenkins 的默认配置中,我添加了 --httpListenAddress=127.0.0.1
,在管理 Jenkins --> 配置系统中,我添加了正确的 url 和端口号 https://jenkins.example.com:9090/
到 Jenkins 位置。
这些是我用curl检查时的header。
curl -I https://jenkins.example.com:9090/scriptApproval
HTTP/1.1 302 Found
Server: nginx/1.9.4
Date: Thu, 24 Sep 2015 13:17:56 GMT
Content-Length: 0
Connection: keep-alive
X-Content-Type-Options: nosniff
Location: https://jenkin.example.com/scriptApproval/
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
X-Frame-Options: DENY
更新 1
将 proxy_set_header X-Forwarded-Port 9090;
添加到 nginx 配置时,这似乎修复了设置页面上的错误 It appears that your reverse proxy set up is broken
。
更新 2
可能与尾部斜杠有关。当我用 curl 调用 https://build.example.com:9090/pluginManager/
时,我从 jenkins 得到了 403 Forbidden repsonse 但是当调用 https://build.example.com:9090/pluginManager
没有尾部斜杠时,我得到了 302 Found 响应,位置为 header设置为 https://build.example.com/pluginManager/
更新 3
此服务器连接到共享互联网上,连接到我无法控制的更多服务器 运行。它只有 运行 Jenkins CI 和 nginx 应该是反向代理。路由器上的 WAN 端口列出了端口 9090,它转发到端口 443 上的服务器,它应该是 Nginx,它应该将所有内容代理到正在侦听端口 8080 的 Jenkins-CI。
更新 4
这是我试过的当前配置。这似乎也不起作用。
upstream jenkins {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 9090 default ssl http2;
server_name build.pixplicity.com;
ssl on;
ssl_certificate /etc/nginx/ssl/server.chain.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
access_log /var/log/nginx/jenkins.access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forward-Port 9090;
# Fix the "It appears that your reverse proxy set up is broken" error.
proxy_pass http://127.0.0.1:8080;
proxy_read_timeout 90;
proxy_redirect http://127.0.0.1:8080 https://build.pixplicity.com:9090;
#proxy_redirect default;
}
}
这通常是由于 proxy_redirect
设置的值不正确(大多数人经常尝试将其从默认值 default
更改,导致无法正常工作)。
我不确定我是否理解您的配置 — 为什么您的 listen
指令仅提及 443
,而没有提及 9090
,而在 proxy_redirect
中您正在为 9090
做一个 replacement
吗?
您可能应该将 proxy_redirect
设置为默认值 default
,正确设置 listen
(而不是通过防火墙进行重定向?),然后问题可能会消失离开。
如果以上没有帮助,那么你必须找出 Location
jenkins 在回复 nginx 请求时提供了什么,并在 proxy_redirect
指令中指定这样的前缀.我会推荐类似 sudo tcpdump -A -ilo port 8080
的东西,同时执行上面的 curl
查询,以找出 Jenkins returns 到底是什么,以确保在请求时考虑到所有额外变量从 nginx 内部制作,比如额外的 X-
headers 等等。
如果所有其他方法都失败了,并且您并不真正关心复杂的配置,并且您知道您不打算从此 jenkins 服务器重定向到任何外部主机,那么也许像下面这样的东西值得一试也试试:
proxy_redirect ~^https?://[^/]+/(?<u>.*)$ https://jenkins.example.com:9090/$u;
(或者,当然,你也可以使用一些额外的正则表达式,这取决于 jenkins returns 在它的 Location
headers 返回给 nginx 的内容。)
但是,为了确保人们不会 copy-paste 在没有阅读所有先前的免责声明的情况下进行上述操作,让我们重申真正的建议仍然如下:
proxy_redirect default;
第 1 步:将 listen 443 ssl spdy;
更改为 listen 9090 ssl spdy
;
第 2 步:将 proxy_pass http://127.0.0.1:8080/;
更改为 proxy_pass http://127.0.0.1:8080;
我可能还会尝试去掉第 4 行和第 5 行中那些奇怪的 headers,但这只是一个猜测。
如果不行,我会从头开始,边读边读Digital Ocean tutorial,真的很好。
你正在使用 nginx 侦听端口 443 但期望它在端口 9090 上服务,这让我很震惊。很可能,当你 curl 9090 时,你正在直接访问 jenkins。或者你 copy-pasted SO 中的错误块。
无论如何,您可能需要更清楚哪个服务器在哪个端口上服务,以及订单请求是通过的。在我看来,应该是这两个之一:
1) https://jenkins.example.com:9090 转到监听端口 9090 的 nginx,它将它代理到 jenkins,它位于 http(s)://127.0.0.1:8080(不同的应用程序,相同的服务器)。
2) https://jenkins.example.com 转到监听端口 443 的 nginx,它将它代理到位于 http(s)://127.0.0.1:9090 的 jenkins。
更新 Update 4 配置中的以下几行:
listen 443 default ssl http2;
proxy_set_header Host $host:9090;
我有一个 jenkins builder 服务器,我正在尝试使用 nginx 设置反向代理。我遵循了 jenkins 网站上的所有 howto 和文档,但唯一不同的是我需要服务器可以在不同的端口上访问,然后是 standerd https 端口。
必须可以在 https://jenkins.example.com:9090
访问服务器,该服务器现在可以正常工作,但我仍然遇到一些问题。在“管理詹金斯”中,我不断收到消息
It appears that your reverse proxy set up is broken
同样,当我登录或应用或保存一些配置更改时,我不断被重定向到 https://jenkins.example.com
而没有端口号。
当我检查 curl 并在 header 中查找某些页面时,它一直将位置 header 设置为正确的 url 但没有端口号。
我在nginx中有如下配置
server {
listen 443 ssl spdy;
server_name jenkins.example.com;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
add_header X-Frame-Options "DENY";
ssl on;
ssl_certificate /etc/nginx/ssl/server.chain.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-$
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
# enable ocsp stapling (mechanism by which a site can convey certificate revocation information to visitors in a privacy-preserving, scalable manner)
# http://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/
resolver 8.8.8.8;
ssl_stapling on;
ssl_trusted_certificate /etc/nginx/ssl/server.crt;
access_log /var/log/nginx/jenkins.access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Fix the "It appears that your reverse proxy set up is broken" error.
proxy_pass http://127.0.0.1:8080/;
proxy_read_timeout 90;
proxy_redirect http://127.0.0.1:8080 https://jenkins.example.com:9090;
}
}
在 jenkins 的默认配置中,我添加了 --httpListenAddress=127.0.0.1
,在管理 Jenkins --> 配置系统中,我添加了正确的 url 和端口号 https://jenkins.example.com:9090/
到 Jenkins 位置。
这些是我用curl检查时的header。
curl -I https://jenkins.example.com:9090/scriptApproval
HTTP/1.1 302 Found
Server: nginx/1.9.4
Date: Thu, 24 Sep 2015 13:17:56 GMT
Content-Length: 0
Connection: keep-alive
X-Content-Type-Options: nosniff
Location: https://jenkin.example.com/scriptApproval/
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
X-Frame-Options: DENY
更新 1
将 proxy_set_header X-Forwarded-Port 9090;
添加到 nginx 配置时,这似乎修复了设置页面上的错误 It appears that your reverse proxy set up is broken
。
更新 2
可能与尾部斜杠有关。当我用 curl 调用 https://build.example.com:9090/pluginManager/
时,我从 jenkins 得到了 403 Forbidden repsonse 但是当调用 https://build.example.com:9090/pluginManager
没有尾部斜杠时,我得到了 302 Found 响应,位置为 header设置为 https://build.example.com/pluginManager/
更新 3
此服务器连接到共享互联网上,连接到我无法控制的更多服务器 运行。它只有 运行 Jenkins CI 和 nginx 应该是反向代理。路由器上的 WAN 端口列出了端口 9090,它转发到端口 443 上的服务器,它应该是 Nginx,它应该将所有内容代理到正在侦听端口 8080 的 Jenkins-CI。
更新 4
这是我试过的当前配置。这似乎也不起作用。
upstream jenkins {
server 127.0.0.1:8080 fail_timeout=0;
}
server {
listen 9090 default ssl http2;
server_name build.pixplicity.com;
ssl on;
ssl_certificate /etc/nginx/ssl/server.chain.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
access_log /var/log/nginx/jenkins.access.log;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forward-Port 9090;
# Fix the "It appears that your reverse proxy set up is broken" error.
proxy_pass http://127.0.0.1:8080;
proxy_read_timeout 90;
proxy_redirect http://127.0.0.1:8080 https://build.pixplicity.com:9090;
#proxy_redirect default;
}
}
这通常是由于 proxy_redirect
设置的值不正确(大多数人经常尝试将其从默认值 default
更改,导致无法正常工作)。
我不确定我是否理解您的配置 — 为什么您的 listen
指令仅提及 443
,而没有提及 9090
,而在 proxy_redirect
中您正在为 9090
做一个 replacement
吗?
您可能应该将 proxy_redirect
设置为默认值 default
,正确设置 listen
(而不是通过防火墙进行重定向?),然后问题可能会消失离开。
如果以上没有帮助,那么你必须找出 Location
jenkins 在回复 nginx 请求时提供了什么,并在 proxy_redirect
指令中指定这样的前缀.我会推荐类似 sudo tcpdump -A -ilo port 8080
的东西,同时执行上面的 curl
查询,以找出 Jenkins returns 到底是什么,以确保在请求时考虑到所有额外变量从 nginx 内部制作,比如额外的 X-
headers 等等。
如果所有其他方法都失败了,并且您并不真正关心复杂的配置,并且您知道您不打算从此 jenkins 服务器重定向到任何外部主机,那么也许像下面这样的东西值得一试也试试:
proxy_redirect ~^https?://[^/]+/(?<u>.*)$ https://jenkins.example.com:9090/$u;
(或者,当然,你也可以使用一些额外的正则表达式,这取决于 jenkins returns 在它的 Location
headers 返回给 nginx 的内容。)
但是,为了确保人们不会 copy-paste 在没有阅读所有先前的免责声明的情况下进行上述操作,让我们重申真正的建议仍然如下:
proxy_redirect default;
第 1 步:将 listen 443 ssl spdy;
更改为 listen 9090 ssl spdy
;
第 2 步:将 proxy_pass http://127.0.0.1:8080/;
更改为 proxy_pass http://127.0.0.1:8080;
我可能还会尝试去掉第 4 行和第 5 行中那些奇怪的 headers,但这只是一个猜测。
如果不行,我会从头开始,边读边读Digital Ocean tutorial,真的很好。
你正在使用 nginx 侦听端口 443 但期望它在端口 9090 上服务,这让我很震惊。很可能,当你 curl 9090 时,你正在直接访问 jenkins。或者你 copy-pasted SO 中的错误块。
无论如何,您可能需要更清楚哪个服务器在哪个端口上服务,以及订单请求是通过的。在我看来,应该是这两个之一:
1) https://jenkins.example.com:9090 转到监听端口 9090 的 nginx,它将它代理到 jenkins,它位于 http(s)://127.0.0.1:8080(不同的应用程序,相同的服务器)。
2) https://jenkins.example.com 转到监听端口 443 的 nginx,它将它代理到位于 http(s)://127.0.0.1:9090 的 jenkins。
更新 Update 4 配置中的以下几行:
listen 443 default ssl http2;
proxy_set_header Host $host:9090;