แก้ไข Apache reverse proxy config ด้วย SSL สำหรับ Jenkins และ Sonar


11

ฉันใช้งานสองบริการหลังเซิร์ฟเวอร์ Apache: Jenkins (พอร์ต 8080) และ SonarQube (พอร์ต 9000)

config apache ของฉันดูเหมือนว่า:

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

ดูเหมือนว่าทุกอย่างจะทำงานได้ดียกเว้นว่าเจนกินส์กำลังบ่นกับข้อความนี้: ดูเหมือนว่าการตั้งค่าพร็อกซีย้อนกลับของคุณเสีย

เมื่อฉันรันการทดสอบReverseProxySetupMonitor ที่จัดทำโดยเจนกินส์ข้อความแสดงข้อผิดพลาดระบุว่ามีการตั้งค่าบางอย่างที่มีพร็อกซีย้อนกลับไม่ถูกต้องเนื่องจากไม่ได้แทนที่ http ด้วย 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
[...]

สิ่งนี้จะปรากฏหลังจากที่ฉันเปิดใช้งาน SSL บนเซิร์ฟเวอร์ (ซึ่งตอนนี้ใช้ใบรับรองแบบลงนามด้วยตนเอง)

คำถาม: ฉันจะแก้ไขการตั้งค่าพร็อกซีย้อนกลับได้อย่างไรเพื่อให้เจนกินส์มีความสุข? คะแนนโบนัสสำหรับเคล็ดลับเกี่ยวกับวิธีการปรับปรุงไฟล์ apache config

ฉันตรวจสอบคำถามที่เกี่ยวข้องสองข้อต่อไปนี้แล้ว:

คำตอบ:


9

หน้านี้ในวิกิพีเดียเจนกินส์บอกว่าเป็นต่อกรกฎาคม 2014การกำหนดค่าแนะนำสำหรับเจนกิ้นส์พร็อกซี่กลับ พารามิเตอร์ที่หายไปคือRequestHeader set X-Forwarded-Proto "https"และRequestHeader set X-Forwarded-Port "443"

ดังนั้นการกำหนดค่าจึงกลายเป็น

<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
เยี่ยมมากมันทำงานได้อย่างสมบูรณ์แบบ! ฉันต้องทำไม่เช่นsudo a2enmod headersนั้นฉันจะได้รับInvalid command 'RequestHeader'
Friederbluemle

คุณอธิบายได้ไหมว่าเพราะเหตุใดคุณจึงใช้สองProxyPassReverseแนวทางสำหรับเส้นทางเดียวกัน ( /)
Ortomala Lokni

1

การตั้งค่า Windows Apache Front-end สำหรับ Jenkins

ความแตกต่างหลักที่นี่คือ:

  • วิธีตั้งค่าใบรับรองชั่วคราว
  • การหยุด apache winging เกี่ยวกับการไม่มีแคช ssl

การตั้งค่าของฉัน:

  • การติดตั้งคือการ d: \ (ไม่ใช่ c: \ - ปรับให้เหมาะกับความต้องการของคุณ)

  • เจนกินส์อยู่ที่พอร์ต 8080

  • Unzip Apache httpd-2.4.18-win64-VC14.zip (จากhttp://www.apachelounge.com/download/ ) ไปยัง d: \

  • ติดตั้ง OpenSSL Win64OpenSSL_Light-1_0_2f.exe ( http://slproweb.com/products/Win32OpenSSL.html ) ไปที่ d: \ OpenSSL-Win64

  • สร้างใบรับรอง ssl:

    • cd ไปที่ไดเรคทอรี่ OpenSSL และเรียกใช้เวทมนต์:

       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
      
  • คัดลอกไฟล์เซิร์ฟเวอร์ * จาก d: \ OpenSSL-Win64 \ bin ไปยัง D: \ Apache24 \ conf

  • แก้ไข d: \ Apache24 \ conf \ httpd.conf:

    • ค้นหาและแทนที่ "c: /" ด้วย "d: /"

    • เปลี่ยนหลังจากบรรทัด "Listen 80" เพิ่ม "Listen 443":

      Listen 80
      Listen 443
      
    • ยกเลิกหมายเหตุบรรทัดเหล่านี้:

      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
      
    • อัปเดต "#ServerName www.example.com:80" เป็น:

      ServerName myserver.mydomain:80
      
    • เพิ่มในตอนท้าย:

      <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 ที่กำลังฟังที่พอร์ต 8080 ดังนั้นฉันยังคงสามารถเชื่อมต่อได้หาก apache ล้มเหลว วัตถุประสงค์ของฉันในการใช้ https คือการซ่อนพารามิเตอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.