![为 Jenkins 和 Sonar 配置带有 SSL 的 Apache 反向代理](https://linux22.com/image/648210/%E4%B8%BA%20Jenkins%20%E5%92%8C%20Sonar%20%E9%85%8D%E7%BD%AE%E5%B8%A6%E6%9C%89%20SSL%20%E7%9A%84%20Apache%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86.png)
我在 Apache 服务器后面运行两个服务:Jenkins(端口 8080)和 SonarQube(端口 9000)。
我的 apache 配置如下所示:
<VirtualHost *:80>
ServerName server
Redirect permanent / https://server.domain.com/
</VirtualHost>
<VirtualHost *:80>
ServerName server.domain.com
Redirect permanent / https://server.domain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName server.domain.com
SSLEngine on
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
ProxyPass /jenkins http://localhost:8080/jenkins nocanon
ProxyPassReverse /jenkins http://localhost:8080/jenkins
ProxyPassReverse /jenkins http://server.domain.com/jenkins
ProxyPassReverse /jenkins https://server.domain.com/jenkins
ProxyPass /sonar http://localhost:9000/sonar nocanon
ProxyPassReverse /sonar http://localhost:9000/sonar
AllowEncodedSlashes NoDecode
ProxyRequests Off
ProxyPreserveHost On
<Proxy http://localhost:8080/*>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
一切似乎都运行良好,除了詹金斯抱怨这个消息:看起来你的反向代理设置已损坏。
当我运行反向代理设置监控Jenkins 提供的测试,错误消息表明反向代理设置不正确,因为它没有用 https 替换 http:
$ curl -iLk -e https://server.domain.com/jenkins/manage https://server.domain.com/jenkins/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/test
[...]
404 http://server.domain.com/jenkins/manage vs. https://server.domain.com/jenkins/manage
[...]
这只出现了后我在服务器上启用了 SSL(现在使用自签名证书)。
问题: 我该如何修复反向代理设置才能让 Jenkins 满意?有关如何改进 apache 配置文件的提示可获得加分。
我已经检查了以下两个相关问题:
答案1
这一页在维基百科中,詹金斯提到2014 年 7 月,Jenkins 反向代理的推荐配置。缺少的参数是RequestHeader set X-Forwarded-Proto "https"
和RequestHeader set X-Forwarded-Port "443"
因此配置变成了
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/cert.pem
ServerAdmin webmaster@localhost
ProxyRequests Off
ProxyPreserveHost On
AllowEncodedSlashes NoDecode
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/ nocanon
ProxyPassReverse / http://localhost:8080/
ProxyPassReverse / http://www.example.com/
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
</VirtualHost>
答案2
Jenkins 的 Windows Apache 前端设置
这里的主要区别是:
- 如何设置临时证书
- 停止 apache 关于没有任何 SSL 缓存的抱怨
我的设置:
安装到 d:\(不是 c:\ - 根据您的需要进行调整)
Jenkins 在端口 8080
解压 Apache httpd-2.4.18-win64-VC14.zip(来自http://www.apachelounge.com/download/) 到 d:\ 。
安装 OpenSSL Win64OpenSSL_Light-1_0_2f.exe (http://slproweb.com/products/Win32OpenSSL.html)到 d:\OpenSSL-Win64
创建 SSL 证书:
cd 到 OpenSSL bin 目录并运行魔法:
pushd d:\OpenSSL-Win64\bin set OPENSSL_CONF=openssl.cfg openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
将 server.* 文件从 d:\OpenSSL-Win64\bin 复制到 D:\Apache24\conf
编辑 d:\Apache24\conf\httpd.conf:
搜索并将“c:/”替换为“d:/”
在“Listen 80”行后进行更改,添加“Listen 443”:
Listen 80 Listen 443
取消注释以下行:
LoadModule headers_module modules/mod_headers.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule socache_shmcb_module modules/mod_socache_shmcb.so LoadModule ssl_module modules/mod_ssl.so LoadModule vhost_alias_module modules/mod_vhost_alias.so
将“#ServerName www.example.com:80”更新为:
ServerName myserver.mydomain:80
在最后添加:
<IfModule socache_shmcb_module> SSLSessionCache "shmcb:logs/ssl_scache(512000)" </IfModule> <VirtualHost *:80> ServerName myserver Redirect permanent / https://myserver.mydomain/ </VirtualHost> <VirtualHost *:80> ServerName myserver.mydomain Redirect permanent / https://myserver.mydomain/ </VirtualHost> <VirtualHost *:443> SSLEngine on SSLCertificateFile conf/server.crt SSLCertificateKeyFile conf/server.key ServerAdmin me@mydomain ProxyRequests Off ProxyPreserveHost On AllowEncodedSlashes NoDecode <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://localhost:8080/ nocanon ProxyPassReverse / http://localhost:8080/ ProxyPassReverse / http://myserver.mydomain/ RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-Port "443" </VirtualHost>
我没有停止 Jenkins 在端口 8080 上的监听,因此如果 Apache 出现故障,我仍然可以连接。我使用 https 的目的是为了隐藏参数。
答案3
我创建了一个 Docker 容器来运行 Apache2 作为同一主机上 Sonarqube 的反向代理。
遵循源代码。 https://github.com/clebermasters/sonarqube-https-apache2