为 Jenkins 和 Sonar 配置带有 SSL 的 Apache 反向代理

为 Jenkins 和 Sonar 配置带有 SSL 的 Apache 反向代理

我在 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

相关内容