Tạo file server block cho Nginx: SSL, gzip, cache tệp tĩnh và reverse proxy
Công cụ dựng sẵn một hoặc nhiều khối server hoàn chỉnh cho Nginx từ các ô nhập tên miền, đường dẫn gốc, đường dẫn chứng chỉ và danh sách location. Nội dung file cập nhật ngay theo từng ký tự bạn gõ, có nút chép và nút tải về thành tệp đặt tên theo tên miền để bạn đưa thẳng vào thư mục cấu hình trên máy chủ.
Tính năng nổi bật
- Nhập tên miền, thư mục gốc và danh sách tệp index, khối server hiện ra tức thì ở khung bên phải
- Bật SSL để sinh kèm khối chuyển hướng cổng 80 sang HTTPS và khối riêng đưa www về tên miền chính
- Ô đường dẫn chứng chỉ và khóa điền sẵn theo cấu trúc thư mục của Certbot, kèm bộ tham số TLS 1.2 và 1.3
- Công tắc bật bốn header bảo mật: X-Frame-Options, X-Content-Type-Options, X-XSS-Protection và Referrer-Policy
- Công tắc bật gzip cho nhóm tệp văn bản, kèm ngưỡng dung lượng tối thiểu và gzip_vary
- Khối cache tệp tĩnh theo biểu thức chính quy với thời hạn expires tự đặt và header Cache-Control
- Thêm bao nhiêu location tùy ý, mỗi cái chọn một trong ba kiểu: chuyển tiếp ngược, phục vụ tệp tĩnh hoặc chuyển hướng 301
- Chỉnh client_max_body_size và ba mốc thời gian chờ của proxy, chép hoặc tải file với tên đặt theo tên miền
Vì sao nên dựng khung config trước rồi mới sửa trực tiếp trên máy chủ
Cú pháp Nginx không dài nhưng có nhiều chỗ dễ sai theo cách không báo lỗi ngay: quên dấu chấm phẩy cuối dòng, đặt directive vào sai khối, viết proxy_pass thiếu giao thức, hoặc bỏ sót nhóm header khi chuyển tiếp ngược khiến ứng dụng phía sau nhận nhầm địa chỉ IP của khách. Khi bạn gõ trực tiếp trên máy chủ qua SSH, mỗi lần thử là một lần chạy nginx -t rồi reload, và nếu file đang phục vụ website thật thì khoảng thời gian sai sót đó là thời gian khách truy cập gặp lỗi. Dựng khung trước trên trình duyệt cho phép bạn nhìn toàn bộ file cùng lúc, đối chiếu từng khối với ý định của mình, rồi mới dán lên máy chủ đúng một lần. Cách này đặc biệt hữu ích khi bạn quản lý nhiều site trên cùng một máy chủ và muốn tất cả dùng chung một khuôn: cùng bộ tham số TLS, cùng nhóm header, cùng thời hạn cache, chỉ khác tên miền và thư mục gốc. Việc thống nhất khuôn giúp lúc gỡ lỗi bạn biết chắc khác biệt nằm ở đâu.
Lợi ích khi sử dụng
- Nhìn thấy toàn bộ file trước khi đụng vào máy chủ đang chạy, không phải sửa mò qua từng lần reload
- Bộ tham số TLS và nhóm header được điền sẵn nên không cần tra lại tài liệu mỗi lần dựng site mới
- Khối chuyển tiếp ngược đã kèm đủ các header cần thiết để ứng dụng phía sau nhận đúng địa chỉ IP và giao thức gốc
- Cùng một khuôn cho mọi site trên máy chủ, lúc so sánh để gỡ lỗi thì khác biệt lộ ra ngay
- Tệp tải về đặt tên theo tên miền nên bỏ vào thư mục cấu hình là dùng được, không phải đổi tên thủ công
Cách tạo file cấu hình Nginx bằng công cụ này
- 1Ở thẻ Basic, nhập tên miền vào ô Server Name, sửa Root Path thành thư mục chứa mã nguồn và điều chỉnh danh sách tệp index nếu bạn chạy PHP.
- 2Sang thẻ SSL, bật công tắc SSL rồi sửa hai đường dẫn chứng chỉ cho khớp tên miền thật, bật thêm HTTP/2 và nhóm header bảo mật nếu cần.
- 3Sang thẻ Perf, bật gzip và cache tệp tĩnh, đặt thời hạn cache, rồi chỉnh client_max_body_size cho vừa dung lượng tệp mà người dùng được tải lên.
- 4Sang thẻ Locations, bấm Thêm Location cho từng đường dẫn cần xử lý riêng, chọn kiểu Proxy nếu chuyển tiếp sang ứng dụng chạy ở cổng nội bộ, Static nếu trỏ vào thư mục, Redirect nếu muốn trả về 301.
- 5Bấm Download để tải tệp đặt theo tên miền, đưa lên máy chủ vào thư mục cấu hình, chạy nginx -t để kiểm tra cú pháp rồi mới reload dịch vụ.
Đọc hiểu file mà công cụ sinh ra: thứ tự các khối và ý nghĩa từng directive
File sinh ra có thể chứa tới ba khối server. Khối thứ nhất chỉ xuất hiện khi bạn bật SSL, nó lắng nghe cổng 80 trên cả IPv4 lẫn IPv6 và trả về mã 301 đưa mọi yêu cầu sang HTTPS, trong đó biến $request_uri giữ nguyên phần đường dẫn cùng chuỗi truy vấn nên khách không bị rơi về trang chủ. Khối thứ hai cũng chỉ xuất hiện khi bật SSL, nó phục vụ tên miền có www, khai báo lại chứng chỉ vì bắt tay TLS diễn ra trước khi Nginx đọc được đường dẫn, rồi chuyển hướng về tên miền chính. Khối thứ ba là khối phục vụ thật: nó chứa tham số TLS gồm hai phiên bản giao thức được giữ lại là 1.2 và 1.3, bộ mã hóa dùng trao đổi khóa ECDHE, bộ nhớ đệm phiên chia sẻ mười megabyte và thời hạn phiên một ngày. Tiếp đó là nhóm header bảo mật gắn cờ always để áp dụng cả cho trang lỗi, phần nén gzip với ngưỡng tối thiểu 1024 byte, rồi mới tới root, index và giới hạn dung lượng tải lên. Cuối file là location mặc định dùng try_files và hai dòng error_page. Biết thứ tự này giúp bạn chèn thêm directive vào đúng chỗ khi cần mở rộng.
Vì sao khối cache tệp tĩnh có thể nuốt mất location proxy của bạn
Đây là cái bẫy phổ biến nhất với file mà công cụ sinh ra, và nó không phải lỗi cú pháp nên nginx -t vẫn báo thành công. Nginx chọn location theo thứ tự ưu tiên chứ không theo thứ tự xuất hiện trong file: trước hết là so khớp chính xác bằng dấu bằng, kế đến là tiền tố có ký hiệu ^~, sau đó mới tới các biểu thức chính quy theo thứ tự trong file, và cuối cùng mới là tiền tố thường. Khối cache tệp tĩnh mà công cụ sinh ra là một biểu thức chính quy bắt các phần mở rộng ảnh, css, js và font. Nếu bạn thêm một location kiểu proxy ở đường dẫn /api rồi ứng dụng phía sau lại trả về tệp có đuôi .js hoặc .png dưới đường dẫn đó, yêu cầu sẽ rơi vào khối biểu thức chính quy chứ không vào khối proxy, và Nginx đi tìm tệp thật trong thư mục gốc rồi trả 404. Triệu chứng điển hình là ứng dụng chạy được nhưng thiếu ảnh hoặc thiếu tệp mã nguồn phía trước. Cách xử lý là sửa location proxy thành dạng có ký hiệu ^~ ở đầu để nó thắng biểu thức chính quy, hoặc thu hẹp biểu thức chính quy lại cho khỏi chạm vào đường dẫn của ứng dụng.
Chứng chỉ, cú pháp listen và những thay đổi theo phiên bản Nginx
Hai đường dẫn chứng chỉ điền sẵn theo cấu trúc thư mục mà Certbot tạo ra, trong đó fullchain.pem gồm chứng chỉ của bạn nối với chứng chỉ trung gian, còn privkey.pem là khóa riêng. Đừng dùng cert.pem thay cho fullchain.pem vì thiếu chứng chỉ trung gian sẽ khiến một số trình duyệt di động và nhiều thư viện gọi API báo lỗi không tin cậy, trong khi trình duyệt máy tính vẫn hiển thị bình thường nên lỗi dễ bị bỏ sót. Về cú pháp listen, công cụ sinh ra dạng đặt http2 ngay sau ssl trên cùng dòng. Dạng này đúng với các bản Nginx cũ, nhưng từ bản 1.25.1 trở đi nó bị đánh dấu là lối viết cũ và Nginx sẽ ghi cảnh báo vào log khi khởi động, cách viết mới là để dòng listen chỉ khai báo ssl rồi thêm một dòng riêng bật http2. Cảnh báo này không làm dịch vụ dừng nên bạn có thể để nguyên, nhưng nếu muốn log sạch thì sửa lại sau khi dán file lên máy chủ. Cũng lưu ý file này không kèm header HSTS, không bật OCSP stapling và không khai báo ssl_dhparam, đó là những thứ bạn tự thêm nếu muốn đạt điểm cao ở các trang chấm cấu hình TLS.
Nginx và Apache khác nhau chỗ nào, và khi nào bạn cần tệp .htaccess thay vì file này
Hai phần mềm cùng phục vụ web nhưng khác nhau ở chỗ đặt cấu hình. Nginx đọc toàn bộ cấu hình đúng một lần lúc khởi động hoặc lúc reload, mọi quy tắc nằm tập trung trong file cấu hình mà chỉ người có quyền quản trị máy chủ mới sửa được, và người dùng bình thường không thể thay đổi hành vi máy chủ bằng cách đặt tệp vào thư mục web. Apache thì ngoài file cấu hình chính còn cho phép đặt tệp .htaccess ở từng thư mục, và với mỗi yêu cầu nó quét ngược lên cây thư mục để gom các tệp đó lại. Hệ quả thực tế rất rõ: trên Apache bạn sửa quy tắc chuyển hướng rồi lưu tệp là có hiệu lực ngay, không cần quyền root và không cần reload dịch vụ, đổi lại phải trả giá bằng thao tác đọc đĩa thêm ở mỗi lần truy cập. Trên Nginx bạn phải có quyền vào máy chủ và phải chạy reload, đổi lại cấu hình chỉ được đọc một lần nên nhanh hơn. Cú pháp cũng không chuyển đổi qua lại được: Apache dùng RewriteCond với RewriteRule, còn Nginx dùng location cùng try_files và return. Nếu bạn đang thuê hosting chia sẻ chạy Apache và không có quyền quản trị, hãy dùng công cụ tạo tệp .htaccess tại /vi/tools/htaccess-generator thay cho trang này.
Đưa file lên máy chủ: kiểm tra cú pháp, tạo liên kết, tải lại và cách quay lui
Trên các bản Linux họ Debian và Ubuntu, thư mục quy ước là sites-available để chứa file và sites-enabled để chứa liên kết tượng trưng trỏ tới file đã bật. Bạn đặt tệp tải về vào thư mục thứ nhất rồi tạo liên kết sang thư mục thứ hai. Trên các bản họ Red Hat như AlmaLinux hay Rocky Linux thì không có cặp thư mục này, file cấu hình đặt thẳng vào conf.d và Nginx nạp mọi tệp có đuôi .conf trong đó. Trước khi tải lại dịch vụ, luôn chạy lệnh kiểm tra cú pháp: nó không chỉ bắt lỗi dấu chấm phẩy mà còn phát hiện chứng chỉ không đọc được hoặc cổng bị chiếm. Khi kiểm tra đã sạch, hãy dùng reload chứ đừng dùng restart, vì reload cho tiến trình cũ phục vụ nốt các kết nối đang mở rồi mới nhường chỗ, còn restart cắt đứt tất cả. Nếu website hỏng sau khi tải lại, cách quay lui nhanh nhất là xóa liên kết tượng trưng của site vừa thêm rồi reload lại, hệ thống trở về đúng trạng thái trước đó. Vì vậy hãy giữ lại bản cũ của file thay vì ghi đè, và nếu máy chủ chạy nhiều site như trường hợp một máy chủ dùng chung cho hàng chục tên miền, hãy đặt tên file theo tên miền để lúc cần tìm không phải mở từng tệp.
Câu hỏi thường gặp (FAQ)
Tôi bật chuyển hướng www nhưng tắt SSL, sao file không có khối xử lý www?
Vì cả hai khối chuyển hướng trong công cụ đều gắn với điều kiện bật SSL. Khi tắt SSL, file chỉ còn đúng một khối server nghe cổng 80 cho tên miền chính. Nếu bạn cần chuyển hướng www mà chưa có chứng chỉ, hãy tự thêm một khối server nghe cổng 80 với server_name là tên miền có www và một dòng return 301.
Nginx báo cảnh báo dòng listen dùng lối viết cũ, có sao không?
Không ảnh hưởng hoạt động. Từ bản 1.25.1, cách đặt http2 ngay trên dòng listen bị coi là lối viết cũ, Nginx vẫn chạy nhưng ghi một dòng cảnh báo mỗi lần khởi động. Muốn log sạch thì bỏ chữ http2 khỏi dòng listen và thêm một dòng riêng bật http2 bên trong khối server.
Đặt file này vào thư mục nào trên máy chủ?
Trên Ubuntu và Debian, đặt vào sites-available rồi tạo liên kết tượng trưng sang sites-enabled. Trên AlmaLinux, Rocky Linux hay CentOS thì đặt thẳng vào conf.d với đuôi .conf. Nếu bạn tự biên dịch Nginx, hãy mở nginx.conf xem dòng include trỏ tới thư mục nào.
Vì sao ảnh và tệp js dưới đường dẫn proxy lại trả về 404?
Vì khối cache tệp tĩnh là biểu thức chính quy và nó được ưu tiên hơn location dạng tiền tố. Yêu cầu tới ảnh trong đường dẫn của ứng dụng bị khối này bắt trước, Nginx đi tìm tệp thật trong thư mục gốc rồi trả 404. Sửa bằng cách thêm ký hiệu ^~ vào đầu location proxy.
Công cụ có sinh khối upstream để cân bằng tải không?
Không. Location kiểu Proxy chỉ trỏ tới đúng một địa chỉ đích. Muốn phân tải cho nhiều máy chủ ứng dụng, bạn phải tự thêm khối upstream ở cấp http bên ngoài khối server rồi đổi đích của proxy_pass thành tên của khối upstream đó.
root và alias trong hai kiểu location khác nhau thế nào?
Với root, Nginx nối đường dẫn gốc với toàn bộ đường dẫn yêu cầu. Với alias mà công cụ dùng cho location kiểu Static, phần đường dẫn khớp với location bị cắt bỏ rồi mới nối phần còn lại vào thư mục đích. Vì vậy khi dùng alias, hãy chú ý dấu gạch chéo cuối cả hai vế phải nhất quán.
Giới hạn dung lượng tải lên mặc định 10m có đủ không?
Đủ cho ảnh và tài liệu thông thường. Nếu người dùng cần tải video hoặc tệp nén lớn, hãy tăng con số này và nhớ chỉnh cả giới hạn tương ứng phía ứng dụng. Khi vượt ngưỡng, Nginx trả về mã 413 và yêu cầu bị chặn ngay tại máy chủ web trước khi tới ứng dụng.
File có kèm header HSTS không?
Không. Nhóm header bảo mật gồm bốn dòng và không có Strict-Transport-Security. Muốn thêm, bạn tự chèn một dòng add_header vào khối server chính. Hãy cân nhắc kỹ vì khi đã bật, trình duyệt sẽ từ chối mở site qua HTTP trong suốt thời hạn khai báo, kể cả lúc chứng chỉ có sự cố.
Location mặc định dùng try_files có chạy được với WordPress không?
Không đúng hoàn toàn. Dòng mặc định đưa mọi yêu cầu không khớp tệp về index.html, đó là khuôn cho ứng dụng một trang. WordPress cần đưa về index.php kèm chuỗi truy vấn và cần thêm một location chuyển tệp .php sang PHP-FPM, hai phần này bạn phải tự thêm sau khi tải file về.
Sau khi sửa cấu hình nên reload hay restart?
Dùng reload. Lệnh này nạp cấu hình mới, khởi động tiến trình con mới và để tiến trình cũ phục vụ nốt các kết nối đang mở, nên khách không bị ngắt giữa chừng. Restart dừng hẳn dịch vụ rồi bật lại, mọi kết nối đang mở đều đứt và website gián đoạn vài giây.
Có cần khai báo gzip trong từng khối server không?
Không bắt buộc. Bạn có thể đặt các dòng gzip một lần ở cấp http trong nginx.conf để mọi site cùng dùng. Công cụ này đặt chúng trong khối server để file mang theo đủ tham số, tiện khi mỗi site cần một danh sách kiểu nội dung khác nhau. Nếu đã khai ở cấp http, hãy xóa phần trùng cho gọn.
Chép nhiều tên miền vào ô Server Name có được không?
Ô này được ghép thẳng vào dòng server_name, mà Nginx cho phép liệt kê nhiều tên cách nhau bằng dấu cách, nên về kỹ thuật là được. Nhưng khi bật SSL, các khối chuyển hướng sẽ ghép chữ www vào cả chuỗi và cho ra kết quả sai. An toàn nhất là mỗi tên miền một file riêng.
Từ khóa liên quan
- nginx config generator
- tạo file cấu hình nginx
- nginx server block
- cấu hình nginx ssl
- nginx reverse proxy nodejs
- chuyển hướng http sang https nginx
- nginx chuyển hướng www sang non www
- nginx gzip
- nginx cache tệp tĩnh expires
- nginx security headers
- nginx proxy_pass là gì
- nginx try_files spa
- nginx client_max_body_size 413
- nginx -t kiểm tra cấu hình
- sites-available sites-enabled
- nginx listen 443 ssl http2 deprecated
- nginx location ưu tiên biểu thức chính quy
- cấu hình nginx cho vps
