Trong một thời gian dài, tôi đã tin dùng Nginx Proxy Manager để quản lý các dịch vụ tự host của mình, đặc biệt là việc truy cập chúng với chứng chỉ SSL hợp lệ qua Tailscale. Với tên miền riêng và các subdomain trỏ đến từng dịch vụ, Nginx Proxy Manager đã hoạt động hiệu quả, cung cấp HTTPS cần thiết cho các ứng dụng như Home Assistant. Tuy nhiên, tôi đã nghe nhiều về Caddy và khi quyết định di chuyển một số dịch vụ quan trọng sang máy chủ Proxmox mini PC mới, tôi đã nắm lấy cơ hội để chuyển đổi hệ thống reverse proxy của mình sang Caddy thay vì tiếp tục với Nginx. Quyết định này không chỉ xuất phát từ mong muốn trải nghiệm cái mới mà còn dựa trên những lý do thực tế, mang lại lợi ích rõ rệt cho hệ thống home lab của tôi. Dù tôi đã triển khai Caddy trong một LXC trên Proxmox, nhưng những ưu điểm mà tôi sẽ chia sẻ dưới đây đều áp dụng rộng rãi cho Caddy, bất kể môi trường triển khai.
1. Học hỏi điều mới mẻ và nâng cao kiểm soát
Luôn cập nhật công nghệ và vượt qua vùng an toàn
Hơn hết, lý do lớn nhất khiến tôi chuyển sang Caddy là để học hỏi một điều mới. Với tư cách là một người yêu công nghệ, tôi luôn muốn cập nhật những xu hướng và công cụ mới nhất. Tôi đã thấy nhiều người khác chuyển đổi sang Caddy trong những năm qua, không chỉ như một reverse proxy mà còn như một máy chủ web. Đây là một cách tuyệt vời để mở rộng kiến thức, đặc biệt khi tôi trước đây chỉ quen với giao diện đồ họa của Nginx Proxy Manager.
Chắc chắn có một “đường cong học hỏi” nhất định. Nginx Proxy Manager trên máy TrueNAS của tôi đã xử lý hầu hết mọi thứ một cách tự động, việc triển khai các subdomain mới với chứng chỉ SSL qua Let’s Encrypt trở nên cực kỳ dễ dàng. Tôi muốn lấy 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à công cụ hoàn hảo để đạt được cả hai mục tiêu này.
2. Quản lý cấu hình đơn giản với một tệp Caddyfile
Tệp cấu hình duy nhất, dễ dàng di chuyển và tự động hóa SSL
Với Caddy, mọi thứ được gói gọn trong một tệp cấu hình duy nhất: /etc/caddy/Caddyfile
. Tệp này chứa tất cả các cài đặt liên quan đến reverse proxy và SSL, đảm bảo việc gia hạn chứng chỉ được tự động hóa hoàn toàn. Điều tuyệt vời là tệp Caddyfile
này có thể dễ dàng sao lưu vào một kho lưu trữ Git và kéo về bất cứ đâu khi cần, giúp việc di chuyển Caddy sang một máy chủ mới trong tương lai trở nên đơn giản hơn rất nhiều so với phương pháp phức tạp thường yêu cầu khi di chuyển Nginx Proxy Manager.
Để hình dung rõ hơn, tôi chỉ cần xuất mã thông báo API của Cloudflare dưới dạng biến môi trường. Caddyfile
của tôi sẽ bắt đầu bằng dòng "acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}"
cùng với khai báo email. Sau đó, mỗi reverse proxy có thể được định nghĩa theo định dạng đơn giản sau:
example.ie {
reverse_proxy http://<ip>:<port>
}
Chỉ với ba dòng lệnh, Caddy sẽ tự động nhận diện trang web mới và thực hiện thử thách DNS để chứng minh quyền sở hữu tên miền, sau đó cấp chứng chỉ SSL từ Let’s Encrypt. Một số tên miền có thể yêu cầu thêm vài cài đặt bổ sung, nhưng tôi đã sử dụng cấu hình ba dòng này cho Home Assistant mà không gặp vấn đề gì, chỉ cần thêm IP của host vào danh sách proxy được phép.
Mặc dù việc thiết lập Caddy ban đầu có thể tốn một chút thời gian hơn 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 trong quá trình triển khai là làm cho Tailscale chạy trong LXC, nhưng tôi đã khắc phụ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 rwmlxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file
Điều này cho phép LXC truy cập /dev/tun
trên host để có thể sử dụng VPN. Sau đó tôi mới biết có một script hỗ trợ Proxmox để thêm Tailscale vào LXC có sẵn, nhưng dù sao việc tự mình tìm hiểu cũng rất bổ ích!
3. Tiên phong với HTTP/3 và QUIC
Hỗ trợ mạnh mẽ từ Caddy, ưu việt hơn Nginx
Nginx có hỗ trợ HTTP/3 và QUIC… về mặt kỹ thuật. Tuy nhiên, đó là một tính năng bổ sung phải được thêm vào trong quá trình biên dịch với cờ --with-http_v3_module
và 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 năm năm. 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 thay vì một lớp bổ sung. Mặc dù 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 việc sử dụng các phiên bản giao thức web mới nhất và an toàn nhất luôn là một ý tưởng hay.
Nginx với trạng thái hỗ trợ QUIC vẫn đang thử nghiệm
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 không (zero round-trip time) ở cả cấp độ gói tin và mã hóa. Độ trễ giảm đáng kể (so với TCP, sử dụng bắt tay ba chiều). Hầu hết người dùng có thể không nhận thấy sự cải thiện, nhưng về mặt kỹ thuật, đây là một bước tiến đáng kể, và thật lạ khi khả năng này vẫn bị giới hạn sau một cờ biên dịch trong Nginx. Ngoài ra, QUIC mang lại lợi ích lớn khi truy cập qua mạng di động, vốn dễ bị rung lắc 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 để tránh phân mảnh gói tin khi các gói vượt quá giá trị MTU.
4. Module dễ dàng mở rộng chức năng
Thêm tính năng với một dòng lệnh đơn giản bằng xcaddy
Nếu bạn muốn sử dụng một dịch vụ cụ thể mà Caddy không hỗ trợ natively, việc triển khai bằng xcaddy trở nên cực kỳ dễ dàng. Công cụ này cho phép bạn xây dựng Caddy với các module (về cơ bản là các plugin), và nếu từ “build” khiến bạn lo sợ, thì thực tế nó lại rất, rất đơn giản. Chẳng hạn, Cloudflare không được hỗ trợ mặc định trong Caddy, nhưng tôi có thể dễ dàng thêm hỗ trợ chỉ với một lệnh duy nhất:
xcaddy build --with github.com/caddy-dns/cloudflare
Xây dựng Caddy với module Cloudflare DNS sử dụng xcaddy
Sau khi hoàn tất, tôi chỉ cần di chuyển tệp “caddy” mới vào /usr/bin
, và nó đã hoạt động ngay lập tức. Quá trình này chỉ mất khoảng năm phút, và tôi đã có 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 gì bạn cần.
5. Hỗ trợ ghi log chuyên sâu với Prometheus
Thu thập dữ liệu chi tiết, tạo Grafana dashboard ấn tượng
Nếu bạn sử dụng Prometheus để theo dõi các chỉ số (metrics), bạn sẽ rất vui khi biết 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 tuyệt đẹp để theo dõi mọi thứ 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 host, biểu đồ độ trễ, và thống kê chứng chỉ theo thời gian thực.
Giao diện Prometheus trong môi trường self-hosting
Đối với hầu hết mọi người, điều này có thể không quá quan trọng, nhưng nó 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ỉ qua VPN.
Tình yêu dành cho Caddy đã nảy nở!
Mặc dù có một chút thách thức ban đầu để làm quen, 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ẽ vô cùng đơn giản. Chỉ với một tệp cấu hình 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 chuyển đổi sớm hơn.
Nếu bạn đang tìm kiếm một giải pháp reverse proxy hiện đại, mạnh mẽ và dễ quản lý cho home lab hoặc các dịch vụ tự host của mình, Caddy chắc chắn là một lựa chọn đáng để cân nhắc. Hãy thử và chia sẻ kinh nghiệm của bạn với cộng đồng congnghe360.net nhé!