Khoá học ngắn về Caddy

Caddy: thứ tự route và reverse_proxy

Caddy giải cùng một bài toán với nginx — request này do khối nào xử lý, và backend nhận đường dẫn nào — nhưng bằng hai cơ chế khác hẳn. Khoá này đo cả hai trên Caddy v2.11.4 trong container caddy:2-alpine, và ở chỗ nào có thể thì đặt cạnh số đo tương ứng của nginx 1.27.5.

Khác biệt lớn nhất so với nginx nginx chạy năm bước cố định trên danh sách location theo đúng thứ tự bạn viết. Caddy thì sắp lại danh sách route ngay lúc đọc Caddyfile, rồi chạy tuyến tính: lấy route đầu tiên khớp. Hệ quả đo được: đổi chỗ hai dòng trong Caddyfile có thể đổi kết quả, còn đổi chỗ hai khối location của nginx thì không.

Lộ trình

Mỗi bài khoảng 10–15 phút đọc, kèm một phòng thí nghiệm chạy ngay trên trình duyệt.

Cách đo

Mỗi bài dựng một container caddy:2-alpine. Với bài 1, mỗi khối handle trả về tên của chính nó rồi gọi curl qua từng đường dẫn; ngoài ra chạy caddy adapt để đọc thứ tự route trong cấu hình JSON mà Caddy thực sự dùng. Với bài 2, một server thứ hai trong cùng container đóng vai backend và in lại {http.request.uri} mà nó nhận.

docker run -d --name cdlab -p 8097:80 \
  -v "$PWD/Caddyfile:/etc/caddy/Caddyfile:ro" \
  caddy:2-alpine

curl -s http://localhost:8097/img/a.gif
# 3 regex-gif-jpg

docker run --rm -v "$PWD/Caddyfile:/c:ro" caddy:2-alpine \
  caddy adapt --config /c --adapter caddyfile

caddy adapt là thứ làm khoá này đo được: nó in ra danh sách route đã sắp xếp, nên không phải suy đoán thứ tự. Thuật toán JavaScript trong hai phòng thí nghiệm được đối chiếu với 16 kết quả caddy adapt, 14 kết quả curl của bài 1 và 13 tổ hợp của bài 2.