Cách cấu hình Jenkins với SSL bằng cách sử dụng Nginx Reverse Proxy
Theo mặc định, Jenkins đi kèm với web server Winstone tích hợp của riêng nó đang nghe trên cổng 8080, thuận tiện cho việc bắt đầu. Tuy nhiên, ngay khi bạn thực sự nghiêm túc về việc sử dụng Jenkins, nó nên được bảo mật bằng SSL để bảo vệ password và dữ liệu nhạy cảm khác được truyền qua giao diện web.Trong hướng dẫn này, ta sẽ trình bày cách cấu hình Nginx làm Reverse Proxy để hướng các yêu cầu của khách hàng đến Jenkins. Để bắt đầu, bạn cần hoàn thành từng yêu cầu bên dưới.
Yêu cầu
Một server Ubuntu 16.04 được cấu hình với user sudo
không phải root và firewall theo hướng dẫn cài đặt server ban đầu Ubuntu 16.04 với Jenkins và Nginx được cài đặt và cấu hình bằng cách sử dụng các hướng dẫn sau:
- Cách cài đặt Jenkins trên Ubuntu 16.04
- Cách cài đặt Nginx trên Ubuntu 16.04
- Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 16.04 . Lưu ý hướng dẫn này yêu cầu domain đã đăng ký mà bạn sở hữu hoặc kiểm soát.
Khi bạn đã hoàn thành các yêu cầu này, bạn đã sẵn sàng để bắt đầu.
Bước một - Cấu hình Nginx
Trong hướng dẫn yêu cầu , Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 16.04 , ta đã cấu hình Nginx để sử dụng SSL trong file /etc/nginx/sites-available/default
, vì vậy ta sẽ mở file đó để thêm cài đặt Reverse Proxy của ta .
- sudo nano /etc/nginx/sites-available/default
Trước tiên, ta sẽ thêm các bản ghi lỗi và truy cập cụ thể vào khối server
với cài đặt cấu hình SSL:
. . . server { # SSL Configuration # # listen 443 ssl default_server; # listen [::]:443 ssl default_server; access_log /var/log/nginx/jenkins.access.log; error_log /var/log/nginx/jenkins.error.log;
Sau đó, ta sẽ cấu hình cài đặt proxy. Vì ta đang gửi tất cả các yêu cầu đến Jenkins, ta sẽ comment dòng try_files
mặc định, như đã viết, sẽ trả về lỗi 404 trước khi yêu cầu đến được Jenkins.
. . . location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; } . . .
Sau đó, ta sẽ thêm cài đặt proxy thực tế. Cấu hình bắt đầu bằng cách bao gồm proxy_params
do Nginx cung cấp đảm bảo thông tin như tên server , giao thức của yêu cầu client và địa chỉ IP client được giữ lại sẽ có sẵn trong file log của ta . Tiếp theo, proxy_pass
đặt giao thức và địa chỉ của server được ủy quyền, trong trường hợp của ta là server Jenkins được truy cập trên server local trên cổng 8080. Sau đó, ta tăng proxy_read_timeout
từ mặc định 60 giây của Nginx lên giá trị 90 giây được đề xuất của dự án. Và cuối cùng, ta thêm proxy_redirect
đảm bảo rằng cácphản hồi được viết lại đúng cách để bao gồm tên server thích hợp.
Đảm bảo thay thế domain được bảo mật SSL của bạn trong dòng proxy_redirect
bên dưới:
Location / . . . location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. # try_files $uri $uri/ =404; include /etc/nginx/proxy_params; proxy_pass http://localhost:8080; proxy_read_timeout 90s; # Fix potential "It appears that your reverse proxy set up is broken" error. proxy_redirect http://localhost:8080 https://your.ssl.domain.name;
Khi bạn đã thực hiện những thay đổi này, hãy lưu và thoát khỏi file . Ta sẽ không khởi động lại Nginx cho đến khi ta đã cấu hình Jenkins nhưng ta sẽ kiểm tra cấu hình của bạn ngay bây giờ:
- sudo nginx -t
Nếu tất cả đều ổn, lệnh sẽ trả về:
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Nếu không, hãy sửa bất kỳ lỗi nào được báo cáo cho đến khi quá trình kiểm tra vượt qua.
Ghi chú:
Nếu bạn cấu hình sai proxy_pass
(ví dụ: bằng cách thêm dấu gạch chéo), bạn sẽ nhận được một cái gì đó tương tự như sau trong trang Cấu hình Jenkins của bạn.
Nếu bạn thấy lỗi này, hãy kiểm tra proxy_redirect
cài đặt proxy_redirect
và proxy_pass
của bạn trong cấu hình Nginx.
Bước hai - Cấu hình Jenkins
Để Jenkins làm việc với Nginx, ta cần cập nhật cấu hình Jenkins để server Jenkins chỉ lắng nghe trên giao diện localhost
thay vì tất cả các giao diện ( 0.0.0.0
). Nếu Jenkins lắng nghe trên tất cả các giao diện, thì nó có khả năng có thể truy cập được trên cổng ban đầu, không được mã hóa ( 8080
).
Ta sẽ sửa đổi file cấu hình /etc/default/jenkins
để thực hiện những điều chỉnh này.
- sudo nano /etc/default/jenkins
Định vị dòng JENKINS_ARGS
và thêm --httpListenAddress=127.0.0.1
vào các đối số hiện có:
. . . JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"
Lưu và thoát khỏi file .
Để sử dụng cài đặt cấu hình mới, ta sẽ khởi động lại Jenkins và Nginx.
- sudo systemctl restart jenkins
Vì systemctl
không hiển thị kết quả , ta sẽ kiểm tra trạng thái:
- sudo systemctl status jenkins
Ta sẽ thấy trạng thái active (exited)
trong dòng Active
:
Output● jenkins.service - LSB: Start Jenkins at boot time Loaded: loaded (/etc/init.d/jenkins; bad; vendor preset: enabled) Active: active (exited) since Tue 2017-04-25 22:37:29 UTC; 5s ago Docs: man:systemd-sysv-generator(8) Process: 11360 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS) Process: 11391 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)
Ta sẽ lặp lại các bước này cho Nginx:
- sudo systemctl restart nginx
- sudo systemctl status nginx
Output● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2017-04-25 22:36:08 UTC; 2min 51s ago Process: 11339 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code= Process: 11349 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 11345 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUC Main PID: 11353 (nginx)
Bây giờ ta đã khởi động lại cả hai server , ta sẽ có thể truy cập domain bằng HTTP hoặc HTTPS. Các yêu cầu HTTP sẽ tự động được chuyển hướng đến HTTPS và trang Jenkins sẽ được phân phát một cách an toàn.
Bước 3 - Kiểm tra cấu hình
Ta sẽ kiểm tra cấu hình bằng cách đặt lại password quản trị khi ta đã bật mã hóa. Ta sẽ bắt đầu bằng cách truy cập trang web qua http
để xác minh ta liên hệ với Jenkins và được chuyển hướng đến https
như ta mong đợi:
Trong trình duyệt web , hãy nhập “http: // your.ssl.domain.name ”, thay thế domain của bạn cho your.ssl.domain.name
. Sau khi bạn nhấn enter, URL sẽ bắt đầu bằng https
và thanh vị trí sẽ cho biết rằng kết nối được bảo mật.
Ta sẽ nhập admin
vào trường " User " và password được tạo tự động mà Jenkins đã tạo và lưu trữ khi ta cài đặt nó.
- sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Nếu bạn đã đặt lại password của admin-user , hãy nhập password đó. Dù bằng cách nào, khi ta đăng nhập, ta sẽ thay đổi password đảm bảo rằng nó an toàn.
Nhấp vào "admin" ở phía trên bên phải và chọn “ Cấu hình ” từ menu thả xuống. Nhập và xác nhận password mới và nhấp vào "Lưu". Đến đây bạn có thể sử dụng giao diện web Jenkins một cách an toàn.
Kết luận
Trong hướng dẫn này, sau khi hoàn thành các yêu cầu , ta đã cấu hình Nginx làm Reverse Proxy cho web server tích hợp sẵn của Jenkins để bảo mật thông tin đăng nhập của ta và các thông tin khác được truyền qua giao diện Web. Bây giờ Jenkins đã được bảo mật, bạn có thể học cách cài đặt một đường dẫn tích hợp liên tục để tự động kiểm tra các thay đổi mã. Các tài nguyên khác cần xem xét nếu bạn mới sử dụng Jenkins là “Bắt đầu: Tạo hướng dẫn Đường ống đầu tiên của bạn hoặc thư viện các plugin do cộng đồng đóng góp .
Các tin liên quan
Cách tạo chứng chỉ SSL tự ký cho Nginx trên CentOS 72017-01-09
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Debian 8
2016-12-22
Cách tạo chứng chỉ SSL tự ký cho Nginx trên Debian 8
2016-12-20
Cách bảo mật Nginx bằng Let's Encrypt trên Debian 8
2016-12-19
Cách cung cấp các ứng dụng Django với uWSGI và Nginx trên Debian 8
2016-12-19
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Nginx
2016-12-19
Cách thêm module gzip vào Nginx trên Ubuntu 16.04
2016-12-02
Cơ sở hạ tầng SaltStack: Tạo Salt State cho web server Nginx
2016-11-07
Cách thêm module log vào Nginx trên Ubuntu 16.04
2016-10-31
Cách thêm module log vào Nginx trên CentOS 7
2016-10-31