---
title: "Cách định cấu hình Jenkins bằng SSL bằng Nginx Reverse Proxy trên Ubuntu 18.04"
description: "Cách định cấu hình Jenkins bằng SSL bằng Nginx Reverse Proxy trên Ubuntu 18.04"
url: https://cloudfly.vn/techblog/cach-dinh-cau-hinh-jenkins-bang-ssl-bang-nginx-reverse-proxy-tren-ubuntu-1804
image: https://media.cloudfly.vn/posts/techblog_2E2oouy.jpg
---

# Cách định cấu hình Jenkins bằng SSL bằng Nginx Reverse Proxy trên Ubuntu 18.04

## Giới thiệu

Theo mặc định, Jenkins đi kèm với máy chủ web Winstone tích hợp sẵn listen trên cổng `8080`, thuận tiện cho việc bắt đầu. Tuy nhiên, bạn cũng nên bảo mật Jenkins bằng SSL để bảo vệ mật khẩu và dữ liệu nhạy cảm được truyền qua giao diện web.

Trong hướng dẫn này, bạn sẽ định cấu hình Nginx làm reverse proxy để chuyển các yêu cầu của khách hàng đến Jenkins.

## Điều kiện tiên quyết

Để bắt đầu, bạn sẽ cần những thứ sau:

* Một máy chủ Ubuntu 18.04 được định cấu hình với tường lửa và non-root sudo user, làm theo hướng dẫn thiết lập máy chủ ban đầu Ubuntu 18.04.
* Đã cài đặt Jenkins, làm theo các bước trong Cách cài đặt Jenkins trên Ubuntu 18.04
* Đã cài đặt Nginx, làm theo các bước trong Cách cài đặt Nginx trên Ubuntu 18.04
* Chứng chỉ SSL cho miền do Let's Encrypt cung cấp. Làm theo Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 18.04 để nhận chứng chỉ này. Lưu ý rằng bạn sẽ cần một tên miền đã đăng ký mà bạn sở hữu hoặc kiểm soát. Hướng dẫn này sẽ sử dụng tên miền **example.com** xuyên suốt.

## Bước 1 - Định cấu hình Nginx

Trong hướng dẫn tiên quyết Cách bảo mật Nginx bằng Let's Encrypt trên Ubuntu 18.04, bạn đã định cấu hình Nginx để sử dụng SSL trong tệp `/etc/nginx/sites-available/<^>example.com<^>`. Mở tệp này để thêm cài đặt reverse proxy của bạn:
```command
sudo nano /etc/nginx/sites-available/<^>example.com<^>
```

Trong khối `server` có cài đặt cấu hình SSL, hãy thêm nhật ký lỗi và quyền truy cập dành riêng cho Jenkins:
```nginx
[label /etc/nginx/sites-available/example.com]
. . . 
server {
        . . .
        # SSL Configuration
        #
        listen [::]:443 ssl ipv6only=on; # managed by Certbot
        listen 443 ssl; # managed by Certbot
        <^>access_log            /var/log/nginx/jenkins.access.log;<^>
        <^>error_log             /var/log/nginx/jenkins.error.log;<^>
        . . .
        }
```

Tiếp theo, hãy định cấu hình cài đặt proxy. Vì chúng tôi đang gửi tất cả các yêu cầu đến Jenkins nên chúng tôi sẽ nhận xét dòng `try_files` mặc định, nếu không sẽ trả về lỗi 404 trước khi yêu cầu đến được Jenkins:
```nginx
[label /etc/nginx/sites-available/example.com]
. . .
           location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                <^>#<^> try_files $uri $uri/ =404;        }
. . . 
```

Bây giờ hãy thêm cài đặt proxy, bao gồm:

* `proxy_params`: Tệp `/etc/nginx/proxy_params` được Nginx cung cấp và đảm bảo rằng thông tin quan trọng, bao gồm tên máy chủ, giao thức của request máy khách và địa chỉ IP của máy khách, được giữ lại và có sẵn trong tệp nhật ký.
* `proxy_pass`: Điều này đặt giao thức và địa chỉ của máy chủ proxy, trong trường hợp này sẽ là máy chủ Jenkins được truy cập qua `localhost` trên cổng `8080`.
* `proxy_read_timeout`: Điều này cho phép tăng từ mặc định 60 giây của Nginx lên giá trị 90 giây được Jenkins đề xuất.
* `proxy_redirect`: Điều này đảm bảo rằng các phản hồi được viết lại chính xác để bao gồm tên máy chủ phù hợp.

Hãy nhớ thay thế tên miền được bảo mật SSL của bạn cho `<^>example.com<^>` trong dòng `proxy_redirect` bên dưới:
```nginx
[label /etc/nginx/sites-available/example.com]
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 setup is broken" error.<^>
                <^>proxy_redirect      http://localhost:8080 https://example.com;<^>
```

Khi bạn đã thực hiện những thay đổi này, hãy lưu tệp và thoát khỏi trình chỉnh sửa. Chúng tôi sẽ tạm dừng khởi động lại Nginx cho đến khi chúng tôi đã định cấu hình Jenkins, nhưng chúng tôi có thể kiểm tra cấu hình của mình ngay bây giờ:
```command
sudo nginx -t
```

Nếu tất cả đều ổn, lệnh sẽ trả về:
```
[secondary_label Output]
nginx: 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 mọi lỗi được báo cáo cho đến khi bài kiểm tra vượt qua.

<$>[note]
**Lưu ý:** Nếu bạn định cấu hình sai `proxy_pass` (ví dụ: bằng cách thêm dấu gạch chéo ở cuối), bạn sẽ nhận được nội dung tương tự như sau trong trang Jenkins Configuration của mình.

![description image](https://media.cloudfly.vn/posts/1_KMr45Oq.jpg)

Nếu bạn thấy lỗi này, hãy kiểm tra kỹ cài đặt `proxy_pass` và `proxy_redirect` trong cấu hình Nginx.
<$>

## Bước 2 - Định cấu hình Jenkins

Để Jenkins hoạt động với Nginx, bạn sẽ cần cập nhật cấu hình Jenkins để máy chủ Jenkins chỉ listen trên giao diện `localhost` chứ không phải trên 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 truy cập được trên cổng ban đầu, không được mã hóa (`8080`).

Hãy sửa đổi tệp cấu hình `/etc/default/jenkins` để thực hiện những điều chỉnh sau:
```command
sudo nano /etc/default/jenkins
```

Xác định vị trí dòng `JENKINS_ARGS` và thêm `--httpListenAddress=127.0.0.1` vào các đối số hiện có:
```nginx
[label /etc/default/jenkins]
. . .
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT <^>--httpListenAddress=127.0.0.1<^>"
```

Lưu và thoát tập tin.

Để sử dụng cài đặt cấu hình mới, hãy khởi động lại Jenkins:
```command
sudo systemctl restart jenkins
```

Vì `systemctl` không hiển thị đầu ra, hãy kiểm tra trạng thái:
```command
sudo systemctl status jenkins
```

Bạn sẽ thấy trạng thái `active (exited)` trong dòng `Active`:
```
[secondary_label Output]
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: <^>active (exited)<^> since Mon 2018-07-09 20:26:25 UTC; 11s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 29766 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 29812 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)
```

Khởi động lại Nginx:
```command
sudo systemctl restart nginx
```

Kiểm tra trạng thái:
```command
sudo systemctl status nginx
```

```
[secondary_label 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 Mon 2018-07-09 20:27:23 UTC; 31s ago
     Docs: man:nginx(8)
  Process: 29951 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
  Process: 29963 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 29952 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 29967 (nginx)
```

Khi cả hai máy chủ được khởi động lại, bạn sẽ có thể truy cập miền bằng HTTP hoặc HTTPS. Các yêu cầu HTTP sẽ được tự động chuyển hướng đến HTTPS và trang web Jenkins sẽ được cung cấp một cách an toàn.

## Bước 3 - Kiểm tra cấu hình

Bây giờ bạn đã kích hoạt mã hóa, bạn có thể kiểm tra cấu hình bằng cách đặt lại mật khẩu quản trị. Hãy bắt đầu bằng cách truy cập trang web qua HTTP để xác minh rằng bạn có thể truy cập Jenkins và được chuyển hướng đến HTTPS.

Trong trình duyệt web của bạn, nhập `http://<^>example.com<^>`, thay thế tên miền của bạn cho `<^>example.com<^>`. Sau khi bạn nhấn `ENTER`, URL sẽ bắt đầu bằng `https` và thanh vị trí sẽ cho biết kết nối này an toàn.

Bạn có thể nhập tên người dùng quản trị mà bạn đã tạo trong Cách cài đặt Jenkins trên Ubuntu 18.04 vào trường **User** và mật khẩu bạn đã chọn trong trường **Password**.

Sau khi đăng nhập, bạn có thể thay đổi mật khẩu để đảm bảo an toàn.

Nhấp vào tên người dùng của bạn ở góc trên bên phải màn hình. Trên trang hồ sơ chính, chọn **Configure** từ danh sách ở bên trái trang:

![description image](https://media.cloudfly.vn/posts/configure_password_hDeUYof.png)

Thao tác này sẽ đưa bạn đến một trang mới, nơi bạn có thể nhập và xác nhận mật khẩu mới:

![description image](https://media.cloudfly.vn/posts/password_page_ligQwtZ.png)

Xác nhận mật khẩu mới bằng cách nhấp vào **Save**. Bây giờ 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, bạn đã định cấu hình Nginx làm reverse proxy cho máy chủ web tích hợp của Jenkins để bảo mật thông tin đăng nhập của bạn và các thông tin khác được truyền qua giao diện web. Giờ đây, Jenkins đã được bảo mật, bạn có thể tìm hiểu cách thiết lập quy trình 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 là người mới làm quen với Jenkins là hướng dẫn “Tạo Pipeline đầu tiên của bạn” của dự án Jenkins hoặc thư viện các plugin do cộng đồng đóng góp.
