Với kinh nghiệm sử dụng Nginx Proxy Manager (NPM) trong một thời gian dài để truy cập các dịch vụ tự host qua Tailscale bằng chứng chỉ SSL hợp lệ, tôi đã quen thuộc với việc tận dụng các subdomain trỏ tới từng dịch vụ cụ thể, đặc biệt hữu ích cho những ứng dụng yêu cầu HTTPS như Home Assistant. Tuy nhiên, khi chuyển một số dịch vụ quan trọng hơn sang máy chủ Proxmox sử dụng mini PC, tôi quyết định thực hiện một thay đổi lớn: di chuyển các reverse proxy của mình sang Caddy thay vì Nginx.
Quyết định này không chỉ xuất phát từ mong muốn khám phá công nghệ mới mà còn dựa trên nhiều lý do thực tế, mang lại hiệu quả tốt hơn cho trường hợp sử dụng của tôi. Dù Caddy được triển khai trong một LXC của Proxmox, những lợi ích được đề cập dưới đây đều áp dụng phổ quát cho Caddy, bất kể môi trường triển khai. Bài viết này sẽ chia sẻ 5 lý do chính đã thúc đẩy tôi thực hiện bước chuyển đổi này.
1. Cơ Hội Học Hỏi Những Điều Mới Mẻ
Nâng cao kiến thức công nghệ
Hơn hết, tôi hứng thú chuyển sang Caddy chỉ đơn giản là để học hỏi một điều gì đó mới. Tôi luôn muốn cập nhật các công nghệ mới và đã chứng kiến nhiều người khác chuyển đổi sang Caddy trong những năm qua, không chỉ với vai trò reverse proxy mà còn là một web server. Đây là một cách tuyệt vời để bổ sung kiến thức, đặc biệt khi trước đó tôi đã sử dụng Nginx Proxy Manager với giao diện đồ họa (GUI) đơn giản.
Liệu có đường cong học tập không? Chắc chắn rồi. Trước đây, Nginx Proxy Manager trên máy TrueNAS của tôi đã xử lý hầu hết mọi thứ. Có rất ít thao tác thực tế phải làm, và việc triển khai các subdomain mới với chứng chỉ SSL sẵn sàng thông qua Let’s Encrypt diễn ra vô cùng dễ dàng. Tôi muốn giành lại một phần quyền kiểm soát đó và học hỏi trong quá trình thực hiện, và Caddy chính là lựa chọn hoàn hảo để đạt được cả hai mục tiêu này cùng lúc. Việc chuyển đổi không chỉ giúp tôi hiểu sâu hơn về cách thức hoạt động của reverse proxy mà còn cung cấp kinh nghiệm thực tiễn về cấu hình máy chủ, một kỹ năng quý giá trong thế giới công nghệ hiện đại.
Giao diện Nginx Proxy Manager hiển thị danh sách các máy chủ proxy đã cấu hình
2. File Cấu Hình Đơn Giản và Dễ Quản Lý (Caddyfile)
Cấu hình nhanh chóng, dễ dàng di chuyển
Với Caddy, mọi thứ được gói gọn trong một file cấu hình duy nhất, dễ sử dụng, đặt tại /etc/caddy
và có tên là “Caddyfile”. File này chứa tất cả các reverse proxy và cài đặt liên quan đến SSL, giúp quá trình gia hạn chứng chỉ diễn ra hoàn toàn tự động. Điều này cũng có nghĩa là một file duy nhất này có thể được chuyển đi bất cứ đâu, làm cho việc sao lưu vào một kho Git và kéo về khi cần trở nên cực kỳ dễ dàng. Mặc dù Nginx khá đơn giản trong việc triển khai các reverse proxy mới, việc thêm một reverse proxy mới với Cloudflare trong Caddy thậm chí còn dễ hơn nhiều. Hơn nữa, điều này đồng nghĩa với việc di chuyển Caddy sang một máy chủ mới trong tương lai sẽ đơn giản hơn rất nhiều so với phương pháp phức tạp yêu cầu khi di chuyển Nginx Proxy Manager.
Để hình dung rõ hơn, tôi xuất token API của Cloudflare dưới dạng biến môi trường, và Caddyfile của tôi chỉ đơn giản bắt đầu bằng dòng "acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}"
cùng với khai báo email của tôi. Mọi reverse proxy sau đó có thể được định nghĩa theo định dạng sau:
example.ie {
reverse_proxy http://<ip>:<port>
}
Nó chỉ là ba dòng mã, và Caddy sẽ tự động nhận diện trang web mới, thực hiện DNS challenge để chứng minh quyền sở hữu domain và cấp chứng chỉ SSL từ Let’s Encrypt. Một số domain có thể yêu cầu thêm vài bổ sung, nhưng tôi đã sử dụng chính xác cấu hình ba dòng này với Home Assistant mà không gặp bất kỳ vấn đề nào. Tất cả những gì tôi cần làm là thêm địa chỉ IP của máy chủ vào danh sách proxy được phép.
Mặc dù việc thiết lập ban đầu Caddy có thể tốn một chút thời gian hơn so với Nginx Proxy Manager, nhưng thời gian tiết kiệm được sau đó là đáng kể. Khó khăn duy nhất tôi gặp phải khi triển khai cấu hình này là làm cho Tailscale hoạt động trong LXC, nhưng tôi đã giải quyết được bằng cách thêm các dòng sau vào cấu hình LXC trên máy chủ Proxmox:
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
Điều này cho phép LXC truy cập /dev/net/tun
trên máy chủ, để VPN có thể được sử dụng. Sau này tôi mới biết có một script hỗ trợ Proxmox để thêm Tailscale vào một LXC hiện có, nhưng dù sao, tự mình tìm ra cách thực hiện cũng là một trải nghiệm tốt!
3. Hỗ Trợ HTTP/3 và QUIC Ngay Từ Đầu
Lợi thế về hiệu suất và bảo mật
Nginx hỗ trợ HTTP/3 và QUIC… về mặt kỹ thuật. Đây là một tính năng bổ sung được thêm vào khi biên dịch với cờ --with-http_v3_module
, và nó được coi là “thử nghiệm”. Ngược lại, Caddy đã thêm hỗ trợ HTTP/3 và QUIC vào tháng 5 năm 2020, tức là đã hơn 5 năm trước. QUIC về cơ bản kết hợp sức mạnh của cả TCP và UDP, và TLS là một thành phần của giao tiếp chứ không phải là một lớp bổ sung bên trên. Chắc chắn, bạn có thể lập luận rằng điều này không thực sự quan trọng đối với hầu hết mọi người, nhưng nhìn chung, việc sử dụng các phiên bản mới nhất và bảo mật nhất khi xử lý các giao thức web là một ý tưởng tốt.
QUIC đặc biệt có lợi cho các mạng không đáng tin cậy, nhờ thời gian khứ hồi bằng 0 ở cả cấp độ gói tin và mã hóa. Độ trễ giảm đáng kể (so với TCP), vốn sử dụng quy trình bắt tay ba bước. Hầu hết người dùng sẽ không bao giờ nhận thấy sự cải thiện, nhưng có một cải tiến kỹ thuật rõ rệt, và việc khả năng này vẫn bị hạn chế bởi cờ build trong Nginx là điều hơi lạ. Hơn nữa, có những lợi ích lớn khi truy cập qua mạng di động có thể dễ bị rung giật (jitter) và mất gói tin.
Để sử dụng tính năng này qua Tailscale, bạn có thể cần tăng giá trị MTU với TS_DEBUG_MTU
, vì MTU mặc định của Tailscale là 1280. Nếu không, trình duyệt của bạn có thể chuyển về HTTP/2 để ngăn chặn phân mảnh gói tin khi kích thước gói tin vượt quá giá trị MTU.
Thông báo hỗ trợ QUIC trong Nginx vẫn ở trạng thái thử nghiệm
4. Các Module Dễ Dàng Tích Hợp
Mở rộng tính năng chỉ với một lệnh
Nếu bạn muốn sử dụng một dịch vụ cụ thể không được Caddy hỗ trợ nguyên bản, việc tự triển khai rất dễ dàng bằng cách sử dụng xcaddy
. Công cụ này có thể build Caddy với các module (về cơ bản là các plugin), và nếu thuật ngữ “build” khiến bạn lo ngại, thực ra nó rất, rất dễ dàng. Ví dụ, Cloudflare không được hỗ trợ nguyên bản trong Caddy, nhưng tôi có thể dễ dàng thêm hỗ trợ chỉ với một lệnh:
xcaddy build --with github.com/caddy-dns/cloudflare
Sau khi hoàn tất, tôi chỉ cần di chuyển file “caddy” mới được tạo vào /usr/bin
, và nó hoạt động ngay lập tức. Chỉ mất năm phút, nếu không muốn nói là ít hơn, và tôi đã có ngay tính năng hỗ trợ Cloudflare hoạt động như một phần của Caddy. Có rất nhiều module được hỗ trợ, vì vậy hãy chắc chắn duyệt qua danh sách để tìm kiếm những tính năng phù hợp với nhu cầu của bạn.
Lệnh xcaddy build để tích hợp module Cloudflare DNS vào Caddy
5. Hỗ Trợ Ghi Log Cho Prometheus
Theo dõi và phân tích dữ liệu chuyên sâu
Nếu bạn sử dụng Prometheus để theo dõi các chỉ số (metrics tracking), bạn sẽ vui mừng khi biết rằng Caddy cũng hỗ trợ nó! Mặc dù tôi chưa thiết lập tính năng này, nhưng bạn hoàn toàn có thể tạo một dashboard Grafana đẹp mắt để theo dõi mọi thứ đang diễn ra trên máy chủ Caddy của mình với tất cả thông tin bạn muốn biết. Việc thiết lập cũng không quá phức tạp, và bạn sẽ nhận được các chỉ số theo từng máy chủ (per-host metrics), biểu đồ độ trễ (latency histograms), và thống kê chứng chỉ theo thời gian thực.
Đối với hầu hết mọi người, tính năng này có thể không quá quan trọng, nhưng nó có thể là dữ liệu thú vị để thu thập, đặc biệt nếu máy chủ của bạn được tiếp xúc với internet chứ không chỉ truy cập qua VPN. Khả năng giám sát chuyên sâu này giúp bạn hiểu rõ hơn về hiệu suất và tình trạng hoạt động của hệ thống, từ đó đưa ra các quyết định tối ưu hóa hiệu quả hơn.
Hệ thống Prometheus đang tự host để theo dõi các chỉ số
Tôi Đã Yêu Thích Caddy Ngay Từ Đầu
Mặc dù có một chút đường cong học tập ban đầu, tôi đã thực sự yêu thích Caddy rất nhiều. Nó dễ sử dụng, nhanh chóng, và tôi biết rằng việc di chuyển nó sang một máy chủ khác trong tương lai sẽ cực kỳ đơn giản. Chỉ với một file duy nhất mà tôi có thể mang đi bất cứ đâu, cùng với khả năng thêm các subdomain mới chỉ trong vòng một phút, tôi thực sự hối tiếc vì đã không thực hiện bước chuyển đổi này sớm hơn. Nếu bạn đang tìm kiếm một giải pháp reverse proxy mạnh mẽ, hiện đại và dễ quản lý cho hệ thống home lab của mình, Caddy chắc chắn là một lựa chọn đáng cân nhắc.
Bạn đã từng trải nghiệm Caddy hay Nginx Proxy Manager chưa? Hãy chia sẻ những kinh nghiệm và quan điểm của bạn trong phần bình luận bên dưới nhé!