Trình tạo cấu hình Nginx
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
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
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
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
Đ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
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_certificatephả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 1ycho/index.htmlsẽ 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 -ttrướcsystemctl 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ị http3 và quic.
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
Bảng tham chiếu ASCII
Bảng ASCII đầy đủ từ 0 đến 127 với giá trị thập phân, thập lục phân, bát phân, nhị phân và ký hiệu tham chiếu ký tự số HTML, gồm NUL, LF và DEL.
Tham chiếu ký tự HTML
Danh sách có thể tìm kiếm các thực thể HTML, mã tên và mã số tương ứng của chúng, cùng chức năng sao chép chỉ với một cú nhấp cho các ký tự đặc biệt và biểu tượng.
Bảng tham khảo phím tắt
Tìm phím tắt mặc định theo tài liệu của VS Code, Chrome và Bash dùng GNU Readline trên macOS, Windows và Linux.
Trình giải mã mã JavaScript (JavaScript Deobfuscator)
Giải mã mã JavaScript đã được rút gọn hoặc nén bằng cách đổi tên biến, giải mã chuỗi và mảng, đảo ngược cấu trúc dòng điều khiển và làm đẹp mã.
Trình định dạng HTML
Định dạng HTML cục bộ trong trình duyệt với thụt lề hai hoặc bốn khoảng trắng. HTML không được tải lên hoặc xác thực.
Bảng tra cứu nhanh Markdown
Tài liệu Markdown thực dụng với bản xem trước thực tế và ví dụ có thể sao chép cho tiêu đề, danh sách, bảng, mã, liên kết, hình ảnh và cú pháp GFM.
Công cụ này có phiên bản bằng các ngôn ngữ khác
- Nginx Konfigurationsgenerator [DE]
- Generador de Configuración de Nginx [ES]
- ตัวสร้างไฟล์ config ของ Nginx [TH]
- Generator konfiguracji Nginx [PL]
- Générateur de configuration Nginx [FR]
- Generator Konfigurasi Nginx [ID]
- مولّد إعدادات Nginx [AR]
- Gerador de Configuração Nginx [PT]
- Nginx 設定ジェネレーター [JA]
- Nginx-konfigurationsgenerator [SV]
- Nginx 설정 생성기 [KO]
- Nginx-configuratiegenerator [NL]
- Nginx Yapılandırma Üreteci [TR]
- Nginx 配置生成器 [ZH]
- Nginx Config Generator [EN]
- Generatore di Configurazione Nginx [IT]
- Генератор конфигураций Nginx [RU]