# gw-routes.conf — các route dùng chung cho cả cổng HTTP và HTTPS của gateway. # # Tách ra file riêng để hai khối `server` (8081 HTTP và 8443 HTTPS) dùng CHÍNH XÁC # cùng một đường xử lý. Nếu copy-paste hai bản, chênh lệch đo được giữa HTTP và HTTPS # sẽ lẫn cả khác biệt cấu hình vào, không còn là chi phí TLS thuần nữa. # ---- 1. File tĩnh: gateway tự phục vụ, KHÔNG chạm tới app ---- # Đây là lợi ích rẻ nhất của gateway: mỗi request tĩnh được phục vụ ở đây là một # request app không phải xử lý. location /static/ { alias /usr/share/nginx/static/; add_header X-Served-By "gateway" always; expires 1h; # CẠM BẪY ĐO ĐƯỢC (Bài 4, mục 4.3): nếu KHÔNG có open_file_cache, mỗi request # tĩnh đều gọi lại stat() + open() + read(). Trên Docker Desktop (macOS/Windows) # thư mục này là bind-mount đi qua ranh giới máy ảo, nên mỗi lời gọi hệ thống đó # đắt hơn hẳn — đo được 8.600–9.300 rps, CHẬM HƠN cả việc proxy về app (~22.700). # Bật cache metadata + file descriptor thì nginx không phải mở lại file mỗi lần. open_file_cache max=1000 inactive=60s; open_file_cache_valid 60s; open_file_cache_min_uses 1; open_file_cache_errors on; } # ---- 2. API: chuyển tiếp về pool app ---- location /api/ { # Cắt tiền tố /api/ trước khi chuyển tiếp: app không biết gì về tiền tố này. # CẠM BẪY: dấu / ở cuối `proxy_pass` chính là thứ thực hiện việc cắt. Thiếu nó, # app sẽ nhận /api/fast thay vì /fast và trả 404. proxy_pass http://api_pool/; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; # ---- Header chuyển tiếp (Bài 4, mục 4.2) ---- # `$proxy_add_x_forwarded_for` = giá trị client gửi lên + "," + IP thật của kết nối. # Nó GIỮ LẠI phần do client gửi, nên app PHẢI đọc từ bên phải chuỗi (xem # TRUST_PROXY_HOPS trong app.js). Nếu app đọc phần tử đầu tiên, client giả được IP. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # $remote_addr là IP thật của kết nối TCP tới gateway — client KHÔNG giả được. proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_next_upstream error timeout http_502 http_503 http_504; proxy_connect_timeout 2s; proxy_send_timeout 10s; proxy_read_timeout 10s; } # ---- 3. Biến thể AN TOÀN: ghi đè hoàn toàn X-Forwarded-For ---- # Dùng khi gateway là chặng đầu tiên tiếp xúc Internet: xoá sạch mọi thứ client gửi # và chỉ ghi IP thật. Đây là mặc định an toàn nhất. location /safe-api/ { proxy_pass http://api_pool/; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; # GHI ĐÈ (không dùng $proxy_add_x_forwarded_for) => client không chèn được gì. proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 2s; proxy_read_timeout 10s; } location = /gw-health { access_log off; return 200 "gateway ok\n"; }