Trong thế giới tự host (self-hosting) và quản lý máy chủ tại nhà (home lab), Nginx Proxy Manager đã từ lâu trở thành một công cụ quen thuộc để truy cập các dịch vụ nội bộ với chứng chỉ SSL hợp lệ qua Tailscale. Với khả năng định tuyến các subdomain tới từng dịch vụ riêng biệt, nó hoạt động hiệu quả, đặc biệt với các ứng dụng yêu cầu HTTPS như Home Assistant. Tuy nhiên, thời gian gần đây, Caddy nổi lên như một giải pháp thay thế đầy hứa hẹn. Khi tôi tiến hành di chuyển các dịch vụ thiết yếu sang máy chủ Proxmox mini PC mới, tôi đã quyết định chuyển đổi toàn bộ reverse proxy sang Caddy thay vì tiếp tục sử dụng Nginx.
Có một vài lý do chính cho quyết định này, và phần lớn chúng đều là những yếu tố thực tiễn, giúp cải thiện đáng kể trải nghiệm trong trường hợp sử dụng của tôi. Mặc 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ắp chia sẻ đều áp dụng rộng rãi cho Caddy, bất kể môi trường triển khai nào.
1. Học hỏi kiến thức mới
Luôn cập nhật công nghệ
Trên hết, điều thúc đẩy tôi chuyển sang Caddy là mong muốn được học hỏi những kiến thức mới. Tôi luôn muốn cập nhật những công nghệ tiên tiến nhất, và tôi đã chứng kiến nhiều người khác lựa chọn Caddy trong những năm gần đây, không chỉ như một reverse proxy mà còn như một web server. Đây là một cách tuyệt vời để tiếp thu cái mới, đặc biệt khi trước đây tôi chủ yếu làm việc với giao diện đồ họa (GUI) của Nginx Proxy Manager.
Có một đườ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ứ một cách tự động. Rất ít thao tác cần thực hiện, 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 cực kỳ dễ dàng. Tôi muốn lấy lại quyền kiểm soát đó và học hỏi trong quá trình thực hiện, và Caddy là một công cụ tuyệt vời để đạt được cả hai mục tiêu cùng lúc.
Giao diện Nginx Proxy Manager hiển thị danh sách các host proxy đã cấu hình trên máy chủ, quản lý các dịch vụ tự host
2. File cấu hình đơn giản, dễ quản lý
Cấu hình dễ dàng
Với Caddy, mọi thứ xoay quanh một tệp cấu hình duy nhất, dễ sử dụng có tên là “Caddyfile”, nằm tại /etc/caddy
. Tệp này chứa tất cả các cài đặt liên quan đến reverse proxy và SSL của bạn, cho phép việc gia hạn chứng chỉ diễn ra tự động. Điều này cũng có nghĩa là tệp cấu hình duy nhất này có thể được di chuyển đến bất cứ đâu, làm cho việc sao lưu vào một kho lưu trữ Git và kéo về khi cần trở nên cực kỳ dễ dàng. Trong khi 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 thậm chí còn dễ dàng hơn với Caddy. Hơn nữa, điều này 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 để di chuyển Nginx Proxy Manager.
Để bạn dễ hình dung, tôi xuất API token của Cloudflare dưới dạng biến môi trường. Tệp Caddyfile của tôi chỉ cần dòng “acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}” ở đầu, 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>}</port></ip>
Đơn giản chỉ với ba dòng mã, Caddy sẽ tự động nhận diện trang web mới và thực hiện thách thức DNS để chứng minh quyền sở hữu tên miền, từ đó lấy chứng chỉ SSL từ Let’s Encrypt. Một số tên miền có thể cần thêm một vài tùy chỉnh, nhưng tôi đã sử dụng 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 IP của máy chủ vào danh sách proxy được phép.
Để cài đặt Caddy và chạy, có thể sẽ mất một chút thời gian hơn so với Nginx Proxy Manager ban đầu, 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 của mình trong 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
trong máy chủ, để có thể sử dụng VPN. Sau này tôi mới biết rằng có một script hỗ trợ Proxmox để thêm Tailscale vào một LXC hiện có, nhưng dù sao thì việc tự mình tìm ra cách làm cũng rất bổ ích!
3. Hỗ trợ HTTP/3 và QUIC nguyên bản
Tiên phong trong công nghệ web
Nginx hỗ trợ HTTP/3 và QUIC… về mặt kỹ thuật. Nó là một tính năng bổ sung yêu cầu biên dịch bằng cờ --with-http_v3_module
và vẫn được coi là “thử nghiệm”. Ngược lại, Caddy đã thêm hỗ trợ cho 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 nói chung, việc sử dụng các phiên bản mới nhất và an toàn nhất khi làm việc với các giao thức web luôn là một ý tưởng tốt.
QUIC đặc biệt có lợi cho các mạng không ổn định, nhờ vào 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), 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 về mặt kỹ thuật, có một sự cải tiến rõ rệt, 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. Hơn nữa, có những lợi ích lớn khi truy cập qua mạng di động, vốn có thể dễ bị jitter và mất gói tin.
Ảnh chụp màn hình cho thấy hỗ trợ QUIC trong Nginx vẫn ở trạng thái thử nghiệm và yêu cầu biên dịch tùy chỉnh, so với Caddy đã tích hợp sẵn
Để 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. Trình duyệt của bạn có thể quay lại HTTP/2 để ngăn chặn sự phân mảnh trong gói tin khi các gói tin đó vượt quá giá trị MTU.
4. Module dễ sử dụng
Lệnh một dòng để mở rộng chức năng
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ự mình triển khai nó bằng xcaddy cực kỳ dễ dàng. Công cụ này có thể xây dựng Caddy với các module (về cơ bản là các plugin), và nếu thuật ngữ “build” làm bạn lo lắng, thực tế nó rất, rất đơn giản. Ví dụ, Cloudflare không được hỗ trợ nguyên bản như một phần của 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
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 năm phút, nếu không muốn nói là ít hơn, và tôi đã có ngay 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.
Lệnh `xcaddy build –with github.com/caddy-dns/cloudflare` đang được thực thi trên terminal để tích hợp module Cloudflare DNS vào Caddy, minh họa tính năng module dễ sử dụng
5. Hỗ trợ ghi log cho Prometheus
Theo dõi metrics chuyên sâu
Nếu bạn sử dụng Prometheus để theo dõi các số liệu (metrics), bạn sẽ rất vui khi biết rằng Caddy cũng hỗ trợ điều đó! 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 bảng điều khiển 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 có thể 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 số liệu theo từng host, biểu đồ độ trễ (latency histograms), và trạng thái chứng chỉ theo thời gian thực.
Đối với hầu hết mọi người, điều này không thực sự quan trọng, nhưng nó có thể là một 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ỉ có thể truy cập qua VPN.
Giao diện Prometheus Dashboard hiển thị các số liệu thống kê, minh họa khả năng tự host Prometheus để theo dõi hiệu suất máy chủ và dịch vụ tự host
Tôi đã yêu Caddy ngay lập tức
Mặc dù có một chút đường cong học tập ban đầu, nhưng tôi thực sự yêu thích Caddy ngay từ khi bắt đầu sử dụng. Nó phần lớn dễ 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ỳ dễ dàng. Caddy chỉ là một tệp duy nhất mà tôi có thể mang đi bất cứ đâu, và 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ự tiếc vì đã không chuyển đổi sớm hơn.
Bạn đã từng trải nghiệm Caddy hay Nginx Proxy Manager chưa? Hãy chia sẻ những suy nghĩ và kinh nghiệm của bạn về hai giải pháp reverse proxy này trong phần bình luận bên dưới nhé!