web-dev-qa-db-ja.com

JenkinsがSNIの仮想ホストを使用するApacheでリバースプロキシのセットアップが正しくないことを報告する

Apacheの背後にあるTomcatで実行するために、Jenkinsサーバーをセットアップしています。私はSNIを使用してSSLで仮想ホストを使用しているため、 https://jenkins.example.com でそれにアクセスし、他のサービスを提供できます http:// www .example.com

起動して実行していますが、[Manage 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がhttpsではなくhttpへのポインターを取得することがわかります。これがなぜ起こっているのか、または関連しているかはわかりませんが、正しくリダイレ​​クトされます。

---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で実行しています。

6
Lorin Hochstein

私があなたの設定で見る1つの問題はそれです:

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>からanotherリダイレクト応答を取得します。彼らの有効性チェッカーは正しくないこととエラーを知っていますが、curlはもう1つのリダイレクトに従い、有効な応答を取得します。

上記のhttp://ProxyPassReverseを追加してください。そうすれば、問題が解決するはずです。

6
Shane Madden

Apacheをリバースプロキシとして使用する場合は、少なくとも2.2.18で、オプションAllowEncodedSlashes NoDecodeを設定する必要があります(以前のバージョンには、オンとオフの値しかありませんが、どちらも間違っています)。 nocanonディレクティブのProxyPassも同様です。

AllowEncodedSlashesは継承されないため、どちらもVirtualHost内で設定する必要があります。

<VirtualHost *:80>
        AllowEncodedSlashes NoDecode
        ServerName build.example.org
        ProxyPass         /  http://localhost:8080/ nocanon
        ProxyPassReverse  /  http://localhost:8080/
        ProxyRequests     Off
</VirtualHost>
2
Anil

https://stackoverflow.com/a/33179008/92356 経由:

システム構成で構成されたJenkins URLが、Jenkinsへのアクセスに使用しているURLと一致していることを確認してください。

システム構成にアクセスするには:

  1. Jenkinsページに移動
  2. [ジェンキンスの管理]をクリックします
  3. [システムの構成]をクリックします
  4. Jenkins Locationまでスクロールして、Jenkins URLを見つけます。

マシンのJenkinsフォルダーにあるjenkins.xmlファイルの<arguments>セクションで設定されているポート値とポート値が一致することを確認します。

0
Abdull