Apache-2.2

Jenkins 使用帶有 SNI 的虛擬主機報告反向代理設置不正確

  • January 7, 2016

我正在設置一個 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又進行了一次重定向並獲得了有效的響應。

添加上面的ProxyPassReversefor http://,如果我是對的,這應該可以解決問題。

引用自:https://serverfault.com/questions/350780