Skip to content

Use nginx as a Reverse-Proxy with letsencrypt (support SSL)

Giải pháp là chúng ta sẽ tạo một Ngixn server đóng vai trò reverse proxy, nó sẽ phân giải các tên miền và chuyển đến các dịch vụ khác xử lý.

Các dịch vụ ở đây có thể là : web server, services, image resource ... được triển khai bằng **hệ thống docker** hay khác ...
Ngoài ra ta cũng có thể dùng **hệ thống docker** để phát triển giải pháp này với [Nginx Proxy Manager](https://thuanbui.me/nginx-proxy-manager/).

**Requirements**
# -- Install nginx
# -- Thêm kho lưu trữ phần mềm EPEL
sudo yum install epel-release
# -- Cài đặt Nginx
sudo yum install nginx

# -- Stop nginx
sudo systemtcl stop nginx
Install letsencrypt **certbot**
sudo yum install snapd && sudo snap install --classic certbot

this example shows how to add a new app, served locally (via docker) on 127.0.0.1:8080 for the subdomain app1.example.com.
**Adding a new app (subdomain)**

Đây là ví dụ ta sẽ thêm một ứng dụng mới, `service chạy local (via docker)` với port `127.0.0.1:8080` cho subdomain là `app1.example.com`

Tạo file cấu hình `app1.example.com.conf`
# -- create a new file app1.example.com.conf. Dùng YOUR_SUBDOMAIN cho dễ copy/paste sau này
sudo touch /etc/nginx/sites-available/YOUR_SUBDOMAIN.conf
# -- Activate this file
sudo ln -s /etc/nginx/sites-available/YOUR_SUBDOMAIN.conf /etc/nginx/sites-enabled/YOUR_SUBDOMAIN.conf
# -- Edit file .conf
sudo nano /etc/nginx/sites-available/YOUR_SUBDOMAIN.conf

```/etc/nginx/sites-available/YOUR_SUBDOMAIN.conf server { server_name app1.example.com;

# HTTP configuration
listen 80;
listen [::]:80;

# HTTP to HTTPS
if ($scheme != "https") {
    return 301 https://$host$request_uri;
} # managed by Certbot

# HTTPS configuration
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/app1.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/app1.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

location / {
    proxy_pass  http://127.0.0.1:8080;
    proxy_redirect                      off;
    proxy_set_header  Host              $http_host;
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_read_timeout                  900;
}

}


> Không cần lo lắng những file chưa tồn tại, nó sẽ được tạo ra tự động khi ta chạy lệnh `certbot`
> Nhớ thay đổi
>   `app1.example.com` bởi subdomain đúng
>   `proxy_pass` là thông tin cổng dịch vụ

    **Generating letsencrypt certificates**

-- Run the next command to generate your certificates

sudo certbot --nginx


    Sau khi chạy lệnh này, `certbot` sẽ tự động đọc cấu hình file Nginx và giao tiếp với server **Let’s Encrypt** , chứng thực và tạo ra các file SSL Certificate tại `/etc/letsencrypt/live/[YOUR_SUBDOMAIN]`

    **Tạo multiple apps**

    Để thêm các services/subdomain. Ta chỉ cần lập lại các bước trong `Adding a new app (subdomain)`.

    **Automatic certificates refreshing**

    Do chứng chỉ Let’s Encrypt’s chỉ có hiệu lực trong 90 ngày. Nên khi hết hiệu lực ta phải chạy để làm mới chứng chỉ.

-- Create a new file in /etc/cron.weekly with content

sudo vi /etc/cron.weekly/certbot


```/etc/cron.weekly/certbot
#!/bin/sh
certbot renew
# -- Make it executable
sudo chmod +x /etc/cron.weekly/certbot
Để kiểm tra quá trình gia hạn, bạn có thể chạy lệnh
sudo certbot renew --dry-run

Use nginx as a reverse-proxy with letsencrypt