Jenkins 使用帶有 SNI 的虛擬主機報告反向代理設置不正確
我正在設置一個 Jenkins 伺服器,在 Apache 後面的 Tomcat 下執行。我正在使用 SNI 使用 SSL 的虛擬主機,因此我可以在https://jenkins.example.com訪問它,並在http://www.example.com上提供其他服務。
我已經啟動並執行它,但是當我點擊“管理 Jenkins”時,它告訴我您的反向代理設置似乎已損壞。
請注意,我使用的是自簽名 SSL 證書,而 jenkins.example.com 不是預設虛擬主機。
相關的 apache 配置如下所示:
<VirtualHost *:80> ServerName jenkins.example.com Redirect / https://jenkins.example.com/ </VirtualHost> <VirtualHost *:443> ServerName jenkins.example.com SSLEngine on SSLCertificateFile /etc/ssl/certs/jenkins.example.com.crt SSLCertificateKeyFile /etc/ssl/private/jenkins.example.com.key <Location /> AuthType Digest AuthName "Jenkins" AuthUserFile "/etc/htpasswords" Require valid-user </Location> ProxyRequests Off ProxyPreserveHost On <Proxy http://localhost:8080*> Order deny,allow Allow from all </Proxy> ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ ProxyPassReverse / https://jenkins.example.com </VirtualHost>
如果我做:
curl --user "username:password" --digest -k https://jenkins.example.com/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/test -L
然後我看到輸出:
<div/>
如果我使用調試執行 wget,那麼我會在某個時候看到 wget 獲得指向 http 而不是 https 的指針,不確定為什麼會發生這種情況或是否相關,但它確實正確重定向:
---response begin--- HTTP/1.1 302 Moved Temporarily Date: Tue, 17 Jan 2012 19:47:16 GMT Server: Apache-Coyote/1.1 Location: http://jenkins.example.com/administrativeMonitor/hudson.diagnosis.ReverseProxySetupMonitor/test-for-reverse-proxy-setup Content-Length: 0 Keep-Alive: timeout=15, max=99 Connection: Keep-Alive Content-Type: text/plain
我在 Ubuntu 11.04、Apache 2.2.17、Tomcat 6.0.28、Jenkins 1.448 上執行。
我在您的配置中看到的一個問題是:
ProxyPassReverse / https://jenkins.example.com
應該:
ProxyPassReverse / https://jenkins.example.com/
似乎該服務正在發送
http://
而不是https://
位置標頭(可能是因為您從 Apache 到其偵聽器的連接在 localhost 偵聽器上未加密),在這種情況下您需要添加:ProxyPassReverse / http://jenkins.example.com/
因此,目前可能發生的情況是 API 呼叫失敗,因為它在重定向
http://
的標頭中獲得了一個地址(因為它不是,所以在未翻譯時錯過了該地址)。Location:``ProxyPassReverse``http
它將請求發送到該位置並從您的
<VirtualHost *:80>
. 他們的有效性檢查器知道這是不對的和錯誤的,同時curl
又進行了一次重定向並獲得了有效的響應。添加上面的
ProxyPassReverse
forhttp://
,如果我是對的,這應該可以解決問題。