Sửa cấu hình proxy ngược Apache với SSL cho Jenkins và Sonar


11

Tôi đang chạy hai dịch vụ phía sau máy chủ Apache: Jenkins (Cổng 8080) và SonarQube (Cổng 9000).

Cấu hình apache của tôi trông như thế này:

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

Mọi thứ dường như đang hoạt động tốt, ngoại trừ việc Jenkins đang phàn nàn với thông báo này: Có vẻ như thiết lập proxy ngược của bạn bị hỏng.

Khi tôi chạy thử nghiệm ReverseProxySetupMonitor do Jenkins cung cấp, thông báo lỗi cho biết rằng một cái gì đó với proxy ngược không được thiết lập chính xác, vì nó không thay thế http bằng 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
[...]

Điều này chỉ xuất hiện sau khi tôi kích hoạt SSL trên máy chủ (hiện đang sử dụng chứng chỉ tự ký).

Câu hỏi: Làm cách nào để sửa lỗi thiết lập proxy ngược để Jenkins hài lòng? Điểm thưởng cho lời khuyên về cách cải thiện tệp cấu hình apache.

Tôi đã kiểm tra hai câu hỏi liên quan sau đây:

Câu trả lời:


9

Trang này trên wiki Jenkins đã đề cập rằng vào tháng 7 năm 2014 , cấu hình được đề xuất cho proxy ngược Jenkins. Tham số còn thiếu là RequestHeader set X-Forwarded-Proto "https"RequestHeader set X-Forwarded-Port "443"

Vì vậy, cấu hình đã trở thành

<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
Tuyệt vời, điều đó đã làm việc hoàn hảo! Tôi cũng phải làm sudo a2enmod headers, nếu không tôi sẽ nhận đượcInvalid command 'RequestHeader'
Friederbluemle 19/12/14

Bạn có thể giải thích tại sao bạn sử dụng hai ProxyPassReversechỉ thị cho cùng một đường dẫn ( /) không?
Ortomala Lokni ngày

1

Thiết lập giao diện người dùng Windows Apache cho Jenkins

Sự khác biệt chính ở đây là:

  • Cách thiết lập chứng chỉ tạm thời
  • Ngừng apache winging về việc không có bất kỳ bộ nhớ cache ssl

Thiết lập của tôi:

  • Cài đặt là để d: \ (không phải c: \ - thích ứng với nhu cầu của bạn)

  • Jenkins đang ở cảng 8080

  • Giải nén Apache httpd-2.4.18-win64-VC14.zip (từ http://www.apachelounge.com/doad/ ) sang d: \.

  • Cài đặt OpenSSL Win64OpenSSL_Light-1_0_2f.exe ( http://slproweb.com/products/Win32OpenSSL.html ) để d: \ OpenSSL-Win64

  • Tạo chứng chỉ ssl:

    • cd vào thư mục bin OpenSSL và chạy phép thuật:

       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
      
  • Sao chép máy chủ. * Các tệp từ d: \ OpenSSL-Win64 \ bin sang D: \ Apache24 \ conf

  • Chỉnh sửa d: \ Apache24 \ conf \ httpd.conf:

    • Tìm kiếm và thay thế "c: /" bằng "d: /"

    • Thay đổi sau dòng "Nghe 80", thêm "Nghe 443":

      Listen 80
      Listen 443
      
    • Bỏ ghi chú những dòng này:

      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
      
    • Cập nhật "#ServerName www.example.com:80" thành:

      ServerName myserver.mydomain:80
      
    • Thêm phần này vào cuối:

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

Tôi đã không dừng Jenkins nghe trên cổng 8080, vì vậy tôi vẫn có thể kết nối nếu apache thất bại. Mục tiêu của tôi khi sử dụng https là ẩn các tham số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.