Trình tạo cấu hình Nginx

Loại website
Tiếp theo

Viết cấu hình Nginx từ đầu đồng nghĩa với việc phải nhớ từng dòng proxy_set_header, từng kiểu MIME cần gzip nén, và phân biệt được try_files $uri/ /index.php?$args với phiên bản âm thầm làm hỏng định tuyến. Trình tạo này hỏi bạn tên miền, upstream, trình xử lý PHP và đường dẫn tới các tệp SSL, rồi xuất ra một server block với các giá trị mặc định hợp lý cho TLS, HTTP/2, bộ nhớ đệm tệp tĩnh và nén dữ liệu.

Cách tạo server block của bạn

  1. 1

    Chọn một mẫu dựng sẵn

    Trang tĩnh, PHP-FPM (Laravel, WordPress), reverse proxy cho Node.js, hoặc một chuyển hướng 301 đơn thuần.

  2. 2

    Nhập tên miền

    Ghi đủ danh sách server_name, thường gồm cả biến thể có www và không có www.

  3. 3

    Thiết lập thông tin SSL

    Trỏ tới tệp fullchain và privkey của bạn, hoặc bỏ qua bước này nếu chỉ dùng HTTP.

  4. 4

    Điều chỉnh upstream

    Cổng, đường dẫn socket hoặc URL backend cho các trường hợp dùng proxy_pass.

  5. 5

    Sao chép và triển khai

    Đặt kết quả vào /etc/nginx/sites-available, chạy nginx -t rồi reload lại Nginx.

Một server block tốt trông ra sao

Một virtual host Nginx hiện đại thường gồm những phần sau:

Thành phần Vai trò
listen 443 ssl http2 Nhận kết nối HTTPS với HTTP/2 được bật
ssl_certificate + ssl_certificate_key Trỏ tới tệp chứng chỉ và khóa riêng TLS
ssl_protocols TLSv1.2 TLSv1.3 Loại bỏ các phiên bản TLS cũ
gzip on + danh sách kiểu tệp Nén văn bản/HTML/JSON/JS/CSS ngay khi trả về
Header expires cho tệp tĩnh Giảm số lần tải lại của khách quay lại
try_files Chuyển tiếp tới front controller (PHP, Laravel, v.v.)
HSTS + các header bảo mật Buộc trình duyệt luôn dùng TLS

Những điều cốt lõi của reverse proxy

Với các ứng dụng Node.js, Python, Ruby chạy phía sau Nginx:

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $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_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

Quên X-Forwarded-For là cách kinh điển khiến nhật ký ứng dụng của bạn mất dấu địa chỉ IP thật của người dùng.

Những lỗi thường gặp

  • Thiếu server block dự phòng cho server_name. Nếu không tên nào khớp, Nginx sẽ lấy server block đầu tiên làm mặc định. Hãy thêm một block server_name _ bắt mọi trường hợp và trả về mã 444 để tránh tấn công qua header Host.
  • Sai thứ tự chứng chỉ. Tệp ssl_certificate phải chứa chuỗi đầy đủ (fullchain: chứng chỉ của trang và các chứng chỉ trung gian), chứ không chỉ riêng chứng chỉ của trang.
  • Đặt bộ nhớ đệm quá lâu. Gửi expires 1y cho /index.html sẽ khiến các lần triển khai sau không có hiệu lực. Thay vào đó, hãy gắn số phiên bản vào URL của tệp tĩnh.
  • Reload mà không kiểm tra. Luôn chạy nginx -t trước systemctl reload nginx: chỉ một lỗi cú pháp cũng đủ làm cả trang web ngừng hoạt động.

Câu hỏi thường gặp

HTTP/2 đã ổn định và được hỗ trợ rộng rãi từ Nginx 1.25 trở lên. HTTP/3 (QUIC) cũng có mặt từ Nginx 1.25 nhưng vẫn ở dạng thử nghiệm. Với một cấu hình chạy thật hiện nay, hãy bật HTTP/2 và, nếu muốn, bổ sung HTTP/3 bằng các chỉ thị http3quic.

Theo thông lệ, chuỗi chứng chỉ công khai nằm ở /etc/ssl/certs/ còn khóa riêng nằm ở /etc/ssl/private/. Let’s Encrypt thì đặt mọi thứ trong /etc/letsencrypt/live/domain/. Hãy theo đúng đường dẫn mà công cụ gia hạn chứng chỉ của bạn mong đợi.

Có, với hầu hết các trang web. Hãy thêm một server block riêng ở cổng 80 trả về 301 https://$host$request_uri. Khi kết hợp với HSTS, block HTTP này gần như không còn được gọi tới sau yêu cầu đầu tiên.

Chạy sudo nginx -t để phân tích cấu hình mà không cần reload. Nếu kết quả in ra “syntax is ok” và “test is successful”, hãy reload bằng sudo systemctl reload nginx. Tuyệt đối không dùng restart trên máy chủ đang chạy thật, vì reload áp dụng cấu hình mà không làm gián đoạn dịch vụ.

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác