# edge.conf — nginx làm tầng "edge" (một PoP của CDN) đứng TRƯỚC app, cho Bài 6. # # Khác gì lb.conf và gw.conf? Hai file đó chuyển tiếp MỌI request về app. File này # LƯU LẠI phản hồi và trả từ đĩa của chính nó, nghĩa là phần lớn request không đi tới # app chút nào. Đó chính là việc một PoP của CDN làm. # # proxy_cache_path phải nằm ở tầng http, và file này được include vào http block qua # conf.d nên đặt ở đây là đúng chỗ. # # levels=1:2 chia thư mục 2 tầng, tránh một thư mục chứa quá nhiều file # keys_zone vùng nhớ chia sẻ giữ METADATA của các key (10m ≈ 80.000 key) # max_size trần dung lượng trên đĩa; vượt thì nginx tự evict theo LRU # inactive key không được đọc trong 10 phút thì bị xoá dù TTL còn hạn proxy_cache_path /var/cache/nginx/edge levels=1:2 keys_zone=edge_zone:10m max_size=200m inactive=10m use_temp_path=off; upstream edge_origin { server app1:3000; server app2:3000; server app3:3000; keepalive 32; } server { listen 8082; server_name _; access_log /var/log/nginx/access.log lbfmt; # X-Cache là header quan trọng nhất của bài này. $upstream_cache_status nhận các # giá trị: MISS, HIT, EXPIRED, STALE, UPDATING, REVALIDATED, BYPASS. # Không phơi header này ra thì bạn đang đoán chứ không phải đo. add_header X-Cache $upstream_cache_status always; # ---- 1. CACHE KEY THÔ: gồm TOÀN BỘ query string ---- # Đây là mặc định của nginx ($scheme$proxy_host$request_uri). Hệ quả: # ?utm_source=facebook tạo ra một bản cache RIÊNG cho đúng cùng một nội dung. location /cacheable { proxy_cache_key "$scheme$proxy_host$request_uri"; proxy_pass http://edge_origin; include /etc/nginx/snippets/edge-common.conf; } # ---- 2. CACHE KEY CHUẨN HOÁ: chỉ những tham số THẬT SỰ quyết định nội dung ---- # Danh sách CHO PHÉP, không phải danh sách chặn (xem Bài 5 mục 5.5): tham số lạ # như utm_source, fbclid, gclid bị bỏ qua vì đơn giản là chúng không có trong key. # nginx không có vòng lặp, nên "danh sách cho phép" ở đây là việc liệt kê tường # minh từng $arg_* mình chấp nhận. location /norm/cacheable { proxy_cache_key "norm|$uri|key=$arg_key|ttl=$arg_ttl|vary=$arg_vary"; proxy_pass http://edge_origin/cacheable$is_args$args; include /etc/nginx/snippets/edge-common.conf; } location = /edge-health { access_log off; return 200 "edge ok\n"; } # Xoá cache của toàn tầng edge (chỉ dùng trong lab — đừng phơi ra ngoài). # Đây cũng là minh hoạ cho mục 6.5: purge thật ở CDN không đơn giản như vậy. location = /edge-purge-all { access_log off; return 200 "hay dung: docker compose exec edge sh -c 'rm -rf /var/cache/nginx/edge/*'\n"; } }