Jenkins ve Sonar için SSL ile Apache ters proxy yapılandırmasını düzeltin


11

Bir Apache sunucusunun arkasında iki hizmet çalıştırıyorum: Jenkins (Port 8080) ve SonarQube (Port 9000).

Apache yapılandırmam şöyle görünüyor:

<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'in bu mesajla şikayet etmesi dışında her şey iyi çalışıyor gibi görünüyor: Görünüşe göre ters proxy kurulumunuz bozuldu.

Jenkins tarafından sağlanan ReverseProxySetupMonitor sınamasını çalıştırdığımda, hata iletisi, ters proxy'ye sahip bir şeyin doğru şekilde ayarlanmadığını, http'yi https ile değiştirmediğini gösterir:

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

Bu yalnızca sunucuda SSL'yi etkinleştirdikten sonra ortaya çıktı (şu anda kendinden imzalı bir sertifika kullanıyor).

Soru: Jenkins'in mutlu olması için ters proxy kurulumunu nasıl düzeltirim? Apache yapılandırma dosyasının nasıl geliştirileceğine dair ipuçları için bonus puanlar.

Aşağıdaki iki ilgili soruyu zaten kontrol ettim:

Yanıtlar:


9

Wiki Jenkins'teki bu sayfa , Temmuz 2014'e göre Jenkins ters proxy'si için önerilen yapılandırmadan bahsetti . Eksik parametre RequestHeader set X-Forwarded-Proto "https"veRequestHeader set X-Forwarded-Port "443"

Böylece yapılandırma

<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
Harika, mükemmel çalıştı! Ayrıca yapmak zorunda kaldım sudo a2enmod headers, aksi takdirde alacağımInvalid command 'RequestHeader'
friederbluemle

ProxyPassReverseAynı yol ( /) için neden iki yönerge kullandığınızı açıklayabilir misiniz ?
Ortomala Lokni

1

Jenkins için Windows Apache Ön uç kurulumu

Buradaki ana farklar şunlardır:

  • Geçici sertifika nasıl ayarlanır
  • herhangi bir ssl önbelleğine sahip olmamakla ilgili kanatlılığı durdurmak

Kurulumum:

  • Yükleme, d: \ (c: \ değil - bunu ihtiyaçlarınıza uyarlayın)

  • Jenkins 8080 numaralı bağlantı noktasında

  • Httpd-2.4.18-win64-VC14.zip dosyasını ( http://www.apachelounge.com/download/ adresinden ) d: \ e kadar açın.

  • OpenSSL Win64OpenSSL_Light-1_0_2f.exe'yi ( http://slproweb.com/products/Win32OpenSSL.html ) d: \ OpenSSL-Win64 dizinine yükleyin

  • SSL sertifikasını oluşturun:

    • cd'yi OpenSSL bin dizinine taşıyın ve sihri çalıştırın:

       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
      
  • Sunucuyu. * Dosyalarını d: \ OpenSSL-Win64 \ bin dizininden D: \ Apache24 \ conf dizinine kopyalayın

  • D: \ Apache24 \ conf \ httpd.conf dosyasını düzenleyin:

    • "C: /" ile "d: /" yazın ve değiştirin

    • "Listen 443" satırını ekleyerek "Listen 80" satırından sonra değiştirin:

      Listen 80
      Listen 443
      
    • Bu satırları kaldır:

      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
      
    • "#SunucuAdı www.example.com:80" değerini şu şekilde güncelleyin:

      ServerName myserver.mydomain:80
      
    • Bunu sonuna ekleyin:

      <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'in 8080 bağlantı noktasını dinlemesini durdurmadım, bu yüzden apache başarısız olursa hala bağlanabiliyorum. Https kullanımındaki amacım parametreleri gizlemektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.