Konfigurasi proxy reverse Apache yang benar dengan SSL untuk Jenkins dan Sonar

11

Saya menjalankan dua layanan di belakang server Apache: Jenkins (Port 8080) dan SonarQube (Port 9000).

Konfigurasi apache saya terlihat seperti ini:

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

Semuanya tampaknya berfungsi dengan baik, kecuali bahwa Jenkins mengeluh dengan pesan ini: Tampaknya pengaturan proxy terbalik Anda rusak.

Ketika saya menjalankan tes ReverseProxySetupMonitor yang disediakan oleh Jenkins, pesan kesalahan menunjukkan bahwa sesuatu dengan proxy terbalik tidak diatur dengan benar, karena tidak menggantikan http dengan https:

$ 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
[...]

Ini hanya muncul setelah saya mengaktifkan SSL di server (yang sekarang menggunakan sertifikat yang ditandatangani sendiri).

Pertanyaan: Bagaimana cara saya memperbaiki pengaturan proxy terbalik sehingga Jenkins senang? Poin bonus untuk kiat tentang cara meningkatkan file konfigurasi apache.

Saya sudah memeriksa dua pertanyaan terkait berikut:

friederbluemle
sumber

Jawaban:

9

Halaman ini di wiki Jenkins menyebutkan bahwa per Juli 2014 , konfigurasi yang disarankan untuk proxy terbalik Jenkins. Parameter yang hilang adalah RequestHeader set X-Forwarded-Proto "https"danRequestHeader set X-Forwarded-Port "443"

Jadi konfigurasi menjadi

<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>
masegaloeh
sumber
2
Luar biasa, itu bekerja dengan sempurna! Saya juga harus melakukan sudo a2enmod headers, kalau tidak saya akan mendapatkanInvalid command 'RequestHeader'
friederbluemle
Bisakah Anda menjelaskan mengapa Anda menggunakan dua ProxyPassReversearahan untuk jalur yang sama ( /)?
Ortomala Lokni
1

Pengaturan Windows Apache Front-end untuk Jenkins

Perbedaan utama di sini adalah:

  • Cara mengatur sertifikat sementara
  • menghentikan sayap apache tentang tidak memiliki cache ssl

Pengaturan saya:

  • Instal adalah ke d: \ (bukan c: \ - sesuaikan ini dengan kebutuhan Anda)

  • Jenkins ada di port 8080

  • Unzip Apache httpd-2.4.18-win64-VC14.zip (dari http://www.apachelounge.com/download/ ) ke d: \.

  • Instal OpenSSL Win64OpenSSL_Light-1_0_2f.exe ( http://slproweb.com/products/Win32OpenSSL.html ) ke d: \ OpenSSL-Win64

  • Buat sertifikat ssl:

    • cd ke direktori OpenSSL bin dan jalankan magic:

       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
      
  • Salin server. * File dari d: \ OpenSSL-Win64 \ bin ke D: \ Apache24 \ conf

  • Edit d: \ Apache24 \ conf \ httpd.conf:

    • Cari dan ganti "c: /" dengan "d: /"

    • Ubah setelah baris "Dengarkan 80", tambahkan "Dengarkan 443":

      Listen 80
      Listen 443
      
    • Batalkan komentar pada baris ini:

      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
      
    • Perbarui "#ServerName www.example.com:80" ke:

      ServerName myserver.mydomain:80
      
    • Tambahkan ini di akhir:

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

Saya tidak berhenti Jenkins mendengarkan pada port 8080, jadi saya masih dapat terhubung jika apache gagal. Tujuan saya dalam menggunakan https adalah untuk menyembunyikan parameter.

David Robson
sumber