Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CNTT" các nội dung bạn quan tâm.

Bài 8.2. Chuẩn hóa snippets và cấu hình dùng chung cho hàng trăm website

ICT

1. Vì sao bắt buộc phải dùng snippets khi số lượng website lớn

Trong hệ thống chỉ vài website, việc lặp lại các đoạn cấu hình như:

  • SSL,

  • Header,

  • Proxy parameters,

  • Security rules,

trong từng file .conf có thể chấp nhận được.

Tuy nhiên, với hệ thống:

  • Hàng trăm website,

  • Hàng trăm web application,

  • Nhiều nhóm cấu hình khác nhau,

việc copy–paste cấu hình sẽ dẫn đến các rủi ro nghiêm trọng:

  • Sai lệch cấu hình giữa các website.

  • Khó cập nhật đồng loạt khi thay đổi chính sách.

  • Dễ sinh lỗi ngầm, khó truy vết.

  • Tăng thời gian vận hành và bảo trì.

Snippets là cơ chế chuẩn của Nginx cho phép tách các cấu hình dùng chung thành các file nhỏ, tái sử dụng nhiều lần, giúp hệ thống đồng nhất – dễ kiểm soát – dễ mở rộng.


2. Nguyên tắc thiết kế snippets

Trước khi tạo snippets, cần thống nhất các nguyên tắc sau:

  1. Mỗi snippet chỉ giải quyết một nhóm chức năng

  2. Tên snippet phản ánh đúng vai trò

  3. Không đặt logic theo domain trong snippet

  4. Snippet phải có thể dùng cho nhiều website

  5. Ưu tiên ổn định hơn “tối ưu quá mức”


3. Cấu trúc thư mục snippets đề xuất

Thư mục chuẩn:

/etc/nginx/snippets/ 

 

Cấu trúc đề xuất cho hệ thống lớn:

 

1. Nhóm SSL – HTTPS

ssl-common.conf

Vai trò

  • Thiết lập chuẩn giao thức TLS dùng chung cho toàn hệ thống.

  • Đảm bảo mức độ an toàn tối thiểu, đồng nhất cho tất cả website HTTPS.

Khi nào dùng

  • Bắt buộc cho mọi website chạy HTTPS.

  • Dùng cho cả:

    • Website thông thường

    • Website chuyên ngành

    • Web application

Khi không dùng

  • Website chỉ chạy HTTP nội bộ (rất hiếm trong production).

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

ssl-params.conf

Vai trò

  • Bổ sung các tham số nâng cao cho HTTPS:

    • SSL stapling

    • Resolver

  • Giảm độ trễ handshake và tăng độ tin cậy chứng chỉ.

Khi nào dùng

  • Dùng chung với ssl-common.conf cho website public.

  • Đặc biệt nên dùng cho:

    • Website có nhiều user

    • Website truy cập từ Internet

Khi không dùng

  • Website nội bộ hoàn toàn, không public (có thể bỏ).

ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 5s;

ssl-cloudflare.conf

Vai trò

  • Khôi phục IP thật của client khi website đứng sau Cloudflare.

  • Tránh tình trạng toàn bộ log chỉ thấy IP Cloudflare.

Khi nào dùng

  • Chỉ dùng khi:

    • Domain bật Cloudflare proxy (mây cam).

  • Dùng cho:

    • Website public

    • Web app public

Khi không dùng

  • Website không đi qua Cloudflare.

  • Website nội bộ.

real_ip_header CF-Connecting-IP;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
# (Danh sách IP Cloudflare cập nhật định kỳ)

2. Nhóm Proxy – Reverse Proxy

proxy-common.conf

Vai trò

  • Chuẩn hóa header giữa client → proxy → backend.

  • Đảm bảo backend:

    • Biết đúng domain

    • Biết IP thật client

    • Biết giao thức (HTTP/HTTPS)

Khi nào dùng

  • Bắt buộc cho mọi website hoặc web app chạy reverse proxy.

Khi không dùng

  • Website serve static trực tiếp trên proxy (không proxy).

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

proxy-webapp.conf

Vai trò

  • Điều chỉnh timeout và upload cho web application.

  • Tránh lỗi:

    • 504 Gateway Timeout

    • Upload file lớn bị ngắt

    • API xử lý lâu

Khi nào dùng

  • Web application:

    • QLCL, KHTH, Nhân sự

    • Dashboard, API

    • Hệ thống báo cáo

Khi không dùng

  • Website giới thiệu đơn giản, CMS nhẹ.

proxy_read_timeout 300s;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
client_max_body_size 200M;

proxy-websocket.conf

Vai trò

  • Cho phép WebSocket hoạt động qua reverse proxy.

  • Bắt buộc với các ứng dụng realtime.

Khi nào dùng

  • Web app dùng:

    • WebSocket

    • Long polling

    • Realtime dashboard

Khi không dùng

  • Website tĩnh hoặc web app không realtime.

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

3. Nhóm Headers – Chuẩn hóa phản hồi

security-headers.conf

Vai trò

  • Thiết lập các HTTP security headers cơ bản.

  • Giảm nguy cơ:

    • Clickjacking

    • MIME sniffing

    • XSS cơ bản

Khi nào dùng

  • Nên dùng cho:

    • Website public

    • Web app quản trị

Khi không dùng

  • Chỉ bỏ khi:

    • Ứng dụng đặc thù bị xung đột (hiếm).

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;

real-ip.conf

Vai trò

  • Cho phép Nginx xử lý IP thật khi có proxy nhiều tầng.

  • Hỗ trợ log, rate limit chính xác.

Khi nào dùng

  • Khi có:

    • Cloudflare

    • Proxy tầng trước proxy này

Khi không dùng

  • Client kết nối trực tiếp proxy.

real_ip_recursive on;

4. Nhóm Security – Kiểm soát truy cập

basic-protection.conf (nếu có)

Vai trò

  • Các rule bảo vệ cơ bản:

    • Chặn method nguy hiểm

    • Chặn request bất thường

Khi nào dùng

  • Website public

  • Web app quản trị

Khi không dùng

  • Ứng dụng legacy dễ xung đột (test kỹ).


deny-internal.conf

Vai trò

  • Chặn truy cập từ các dải IP nội bộ hoặc không mong muốn.

  • Dùng như lớp bảo vệ bổ sung.

Khi nào dùng

  • Endpoint public nhưng:

    • Không cho phép truy cập từ LAN

    • Không cho truy cập trực tiếp backend

Khi không dùng

  • Web app nội bộ cần truy cập từ LAN.

deny 10.0.0.0/8;
deny 172.16.0.0/12;
deny 192.168.0.0/16;

rate-limit.conf

Vai trò

  • Giới hạn số request từ một IP.

  • Giảm:

    • Brute force

    • DDoS nhẹ

Khi nào dùng

  • API public

  • Trang login

  • Endpoint nhạy cảm

Khi không dùng

  • API nội bộ, batch processing.

limit_req zone=req_limit burst=20 nodelay;

5. Nhóm Performance – Hiệu năng

gzip.conf

Vai trò

  • Giảm băng thông truyền tải.

  • Tăng tốc độ load website.

Khi nào dùng

  • Website public

  • CMS, frontend nhiều tài nguyên

Khi không dùng

  • Backend API nội bộ tốc độ cao (có thể bỏ).

gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_vary on;

buffers.conf

Vai trò

  • Điều chỉnh buffer cho proxy response.

  • Tránh lỗi buffer overflow hoặc response bị cắt.

Khi nào dùng

  • Web app trả JSON lớn

  • Report, export

Khi không dùng

  • Website nhỏ, response nhẹ.

proxy_buffers 16 32k;
proxy_buffer_size 64k;

timeouts.conf

Vai trò

  • Chuẩn hóa timeout cho toàn hệ thống.

  • Tránh timeout không đồng nhất.

Khi nào dùng

  • Web app xử lý lâu

  • Backend nặng (report, AI)

Khi không dùng

  • Website tĩnh, phản hồi nhanh.


6. Bảng tóm tắt nhanh (Checklist)

SnippetWebsite thườngWeb appCloudflare
ssl-commonBắt buộcBắt buộcBắt buộc
ssl-paramsNên dùngNên dùngNên dùng
ssl-cloudflareKhôngKhôngBắt buộc
proxy-commonNếu proxyBắt buộcBắt buộc
proxy-webappKhôngBắt buộcBắt buộc
websocketKhôngKhi cầnKhi cần
security-headersNênNênNên
rate-limitKhi publicKhi publicKhi public

7. Cách sử dụng snippets trong site config

Ví dụ một web app:

server {
   listen 443 ssl;
   server_name qlcl.example.com;
   include snippets/ssl/ssl-common.conf;
   include snippets/ssl/ssl-params.conf;
   include snippets/headers/security-headers.conf;
   include snippets/proxy/proxy-common.conf;
   include snippets/proxy/proxy-webapp.conf;
   location / {
       proxy_pass http://10.10.10.66;
   }
}

8. Nguyên tắc vàng khi sử dụng snippets

  1. Không include vì “cho đủ” – chỉ include khi cần.

  2. Website càng phức tạp → snippets càng nhiều.

  3. Thay đổi snippets = thay đổi toàn hệ thống → test kỹ.

  4. Ghi chú rõ trong file .conf:

    # Uses: proxy-common, proxy-webapp, security-headers 

Kết luận

Snippets không chỉ là tiện ích cấu hình, mà là công cụ quản trị rủi ro cho hệ thống Nginx quy mô lớn.
Hiểu rõ vai trò – phạm vi – thời điểm sử dụng từng snippet là điều kiện bắt buộc để vận hành ổn định hàng trăm website và web application.