Web 22/09/2026 6 phút

Nginx phục vụ tĩnh và tối ưu hiệu năng: sendfile, cache, và đo bằng ab

Nginx phục vụ file tĩnh nhanh đến mức nào? Bài cuối sê-ri đo thật: sendfile (zero-copy) cho thông lượng ~281 MB/s và 4301 request/giây trên file 68KB, Cache-Control để trình duyệt khỏi tải lại, gzip nén 156 KB xuống 1.2 KB. Kèm một cái bẫy đo lường: ab mặc định HTTP/1.0 nên không nhận gzip — phải đo tỉ lệ nén bằng curl.

Web 22/09/2026 5 phút

HTTP/3 và QUIC: vì sao web bỏ TCP sang UDP — và điều nó sửa mà HTTP/2 không

HTTP/2 multiplex nhiều luồng trên một kết nối TCP, nhưng mất một gói TCP là mọi luồng bị giữ lại (TCP head-of-line blocking). HTTP/3 chạy trên QUIC (UDP) để mỗi luồng độc lập ở tầng vận chuyển. Bài này đo thật: curl lab không có h3 (báo trung thực), site thật quảng cáo h3 qua Alt-Svc, và chi phí bắt tay TCP+TLS hai vòng mà QUIC gộp còn một.

Web 22/09/2026 7 phút

CORS không phải bảo mật server: hiểu cross-origin qua preflight và header thật

Nhiều người tưởng CORS bảo vệ server, hoặc cứ thấy lỗi CORS là tại backend chặn. Thực ra CORS là cơ chế của TRÌNH DUYỆT: same-origin policy chặn JS đọc chéo origin, còn server chủ động mở qua header Access-Control-Allow-*. Bài này dựng server thật chỉ cho một origin, đo preflight OPTIONS, và chứng minh origin lạ vẫn nhận 200 nhưng bị trình duyệt chặn.

Web 22/09/2026 6 phút

Xác thực HTTP: Basic, Bearer và API key — ai giữ bí mật, ai chỉ mã hoá kiểu Base64

Nhiều người tưởng Basic auth 'mã hoá' mật khẩu vì thấy chuỗi Base64 lạ mắt. Thực ra Base64 giải ngược được trong một lệnh. Bài này dựng server thật cho cả ba scheme — Basic, Bearer token, API key — đo bằng curl: thử thách 401 WWW-Authenticate, token bị sửa một ký tự thành invalid_token, và giải ngược Base64 lộ nguyên mật khẩu.

Web 22/09/2026 5 phút

Range request: cách tua video, tải tiếp file dở và tải song song hoạt động

Vì sao kéo thanh tua video nhảy ngay tới giữa phim mà không tải lại từ đầu? Vì sao tải file 2GB đứt mạng rồi nối tiếp được? Câu trả lời là Range request. Bài này dựng nginx thật phục vụ một file, đo bằng curl: 206 Partial Content, Content-Range, suffix range, lỗi 416, và ghép hai phần lại md5 khớp file gốc.

Web 22/09/2026 6 phút

WebSocket: HTTP nâng cấp thành kênh hai chiều — mổ xẻ cái bắt tay 101

WebSocket không phải một giao thức tách rời HTTP mà mọc lên TỪ HTTP: một request GET với header Upgrade, đáp lại là 101 Switching Protocols chứ không phải 200. Bài này tự dựng cả server lẫn client WebSocket bằng socket thuần, đo output thật: cách tính Sec-WebSocket-Accept từ key + GUID, và frame hai chiều mà frame từ client bắt buộc mask.