रिवर्स प्रॉक्सी पोर्ट 80 और 443 पर सारा वेब ट्रैफ़िक लेता है और हर रिक्वेस्ट को सर्वर पर सही ऐप तक भेजता है। Caddy एक अच्छा विकल्प है क्योंकि यह HTTPS सर्टिफ़िकेट खुद लेता और रिन्यू करता है: हर साइट के लिए reverse_proxy localhost:3000 जैसी एक लाइन काफ़ी है।
यह गाइड Ubuntu 24.04 या Debian 12 पर Caddy इंस्टॉल करती है और कॉन्फ़िगरेशन स्टेप बाय स्टेप तैयार करती है।
आगे प्रॉक्सी क्यों रखें
- एक एंट्री पॉइंट. एक सर्वर पर कई ऐप, हर एक अपने डोमेन या पाथ पर।
- HTTPS एक ही जगह. ऐप localhost पर सामान्य HTTP बोलते हैं; TLS Caddy संभालता है।
- सुरक्षा. ऐप कभी पब्लिक पोर्ट पर नहीं सुनते। आप प्रॉक्सी में हेडर, रेट लिमिट या पासवर्ड जोड़ सकते हैं।
- लचीलापन. किसी ऐप को दूसरे पोर्ट या सर्वर पर ले जाएँ और बस एक लाइन बदलें।
1. ज़रूरी शर्तें
- एक सर्वर जिस पर पहले कदम पूरे हो चुके हों।
- हर डोमेन के DNS रिकॉर्ड सर्वर की ओर पॉइंट करते हों (IPv4 के लिए A, IPv6 के लिए AAAA)।
- पोर्ट 80 और 443 खुले हों:
sudo ufw allow 80,443/tcp
sudo ufw allow 443/udp # HTTP/3
अगर आप क्लाउड फ़ायरवॉल इस्तेमाल करते हैं, तो उसमें भी यही पोर्ट खोलें।
2. Caddy इंस्टॉल करें
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | \
sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | \
sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
systemctl status caddy
यह पैकेज Caddy को systemd सर्विस के रूप में चलाता है, और कॉन्फ़िग /etc/caddy/Caddyfile में रहता है।
3. सबसे छोटी काम की Caddyfile
मान लीजिए कोई ऐप localhost:3000 पर सुन रहा है। फ़ाइल को इससे बदलें:
app.example.com {
reverse_proxy localhost:3000
}
वैलिडेट और रीलोड करें:
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
पहली रिक्वेस्ट पर Caddy सर्टिफ़िकेट लेता है, HTTP को HTTPS पर रीडायरेक्ट करता है और ऐप सर्व करता है। बस इतना ही।
4. एक सर्वर पर कई ऐप
हर साइट के लिए एक ब्लॉक जोड़ें:
app.example.com {
reverse_proxy localhost:3000
}
api.example.com {
reverse_proxy localhost:8080
}
status.example.com {
reverse_proxy localhost:3001
}
या एक डोमेन को पाथ के हिसाब से बाँटें:
example.com {
handle_path /api/* {
reverse_proxy localhost:8080
}
handle {
root * /var/www/site
file_server
}
}
handle_path आगे भेजने से पहले /api हटा देता है; अगर बैकएंड को यह प्रीफ़िक्स चाहिए, तो handle इस्तेमाल करें।
5. स्निपेट के साथ उपयोगी डिफ़ॉल्ट
स्निपेट बार-बार इस्तेमाल होने वाली सेटिंग्स को एक जगह रखते हैं:
(common) {
encode zstd gzip
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
-Server
}
log {
output file /var/log/caddy/access.log {
roll_size 50MiB
roll_keep 5
}
}
}
app.example.com {
import common
reverse_proxy localhost:3000
}
लॉग डायरेक्टरी एक बार बनाएं: sudo mkdir -p /var/log/caddy && sudo chown caddy:caddy /var/log/caddy।
6. एडमिन टूल को पासवर्ड से सुरक्षित करें
पासवर्ड हैश जनरेट करें:
caddy hash-password
इसे साइट ब्लॉक में इस्तेमाल करें:
admin.example.com {
basic_auth {
alice <paste-hash-here>
}
reverse_proxy localhost:9000
}
Caddy के पुराने वर्ज़न में इस डायरेक्टिव को basicauth लिखा जाता है। किसी भी संवेदनशील चीज़ के लिए एड्रेस से भी पाबंदी लगाएँ:
admin.example.com {
@outside not remote_ip 198.51.100.0/24
respond @outside 403
reverse_proxy localhost:9000
}
यह रेंज सिर्फ़ उदाहरण है। वहाँ अपने ऑफ़िस या VPN की रेंज लिखें; WireGuard गाइड के साथ यह आपका VPN सबनेट हो सकता है।
7. Docker कंटेनर तक प्रॉक्सी करें
अगर Caddy होस्ट पर चलता है, तो कंटेनर को localhost पर बाइंड करें ताकि वे पब्लिक न हों:
services:
app:
image: ghcr.io/example/app:1.0
ports:
- "127.0.0.1:3000:3000"
अगर Caddy Docker में चलता है, तो उसे उसी Compose प्रोजेक्ट में रखें और सर्विस नाम तक प्रॉक्सी करें (reverse_proxy app:3000)। Docker Compose गाइड में पूरा स्टैक दिखाया गया है।
8. कई बैकएंड पर लोड बैलेंस करें
Caddy रिक्वेस्ट को कई ऐप इंस्टेंस पर बाँट सकता है, चाहे वे उसी सर्वर पर हों या प्राइवेट नेटवर्क पर दूसरे सर्वर पर:
app.example.com {
reverse_proxy 10.0.0.11:3000 10.0.0.12:3000 {
lb_policy least_conn
health_uri /healthz
health_interval 10s
}
}
ये एड्रेस प्राइवेट रेंज के उदाहरण हैं। अगर आप बैलेंसिंग अपने सर्वर के बाहर चाहते हैं, तो मैनेज्ड लोड बैलेंसर हेल्थ चेक के साथ यही काम करता है और उन सर्वर तक भी पहुँच सकता है जिनका कोई पब्लिक IP नहीं है।
9. WebSockets और असली क्लाइंट IP
WebSockets बिना किसी अतिरिक्त सेटिंग के reverse_proxy से काम करते हैं। Caddy बैकएंड को X-Forwarded-For, X-Forwarded-Proto और X-Forwarded-Host भेजता है; अपने ऐप को इन पर सिर्फ़ 127.0.0.1 से भरोसा करने के लिए कॉन्फ़िगर करें।
अगर Caddy खुद किसी दूसरे प्रॉक्सी या लोड बैलेंसर के पीछे है, तो उसे बताएँ कि किन एड्रेस पर भरोसा करना है:
{
servers {
trusted_proxies static 10.0.0.0/24
}
}
यह ग्लोबल ब्लॉक Caddyfile में सबसे ऊपर आता है।
10. लॉग और समस्या निवारण
journalctl -u caddy --since "10 min ago"
sudo tail -f /var/log/caddy/access.log
curl -I https://app.example.com
आम समस्याएँ:
| समस्या | समाधान |
|---|---|
| सर्टिफ़िकेट जारी नहीं हुआ | DNS इसी सर्वर की ओर पॉइंट करना चाहिए; UFW और क्लाउड फ़ायरवॉल में पोर्ट 80/443 खुले हों |
502 Bad Gateway |
बैकएंड चल नहीं रहा या किसी दूसरे पोर्ट पर सुन रहा है: ss -tlnp |
| रीडायरेक्ट लूप | ऐप भी HTTPS पर रीडायरेक्ट करता है; यह काम Caddy को करने दें और X-Forwarded-Proto पर भरोसा करें |
| बदलाव लागू नहीं हुए | systemctl reload caddy चलाएँ और caddy validate का आउटपुट जाँचें |
सर्टिफ़िकेट जारी करने वाले बार-बार की विफलताओं पर रेट लिमिट लगाते हैं, इसलिए कई बार दोबारा कोशिश करने से पहले DNS ठीक कर लें।
रीडायरेक्ट और कैनोनिकल डोमेन
ज़्यादातर साइटों को एक ही नाम पर जवाब देना चाहिए और बाकी को रीडायरेक्ट करना चाहिए। www को बिना www वाले डोमेन पर भेजें:
www.example.com {
redir https://example.com{uri} permanent
}
example.com {
reverse_proxy localhost:3000
}
Caddy दोनों नामों के लिए सर्टिफ़िकेट लेता है। अगर आप www को मुख्य एड्रेस रखना चाहते हैं, तो इन्हें आपस में बदल दें।
रेट लिमिटिंग और रिक्वेस्ट साइज़
Caddy अपना कोर छोटा रखता है, इसलिए रेट लिमिटिंग के लिए एक प्लगइन चाहिए। ज़्यादातर छोटी साइटों के लिए access log पर Fail2ban या ऐप्लिकेशन में लगी लिमिट काफ़ी है। रिक्वेस्ट बॉडी का साइज़ सीमित करना बिल्ट-इन है:
app.example.com {
request_body {
max_size 20MB
}
reverse_proxy localhost:3000
}
इससे बहुत बड़े अपलोड आपके ऐप तक पहुँचने से पहले ही रुक जाते हैं।
ऐप के साथ स्टैटिक फ़ाइलें
एसेट को ऐप से गुज़ारने के बजाय सीधे डिस्क से सर्व करना ज़्यादा तेज़ है:
app.example.com {
handle /static/* {
root * /var/www/app
file_server
header Cache-Control "public, max-age=604800"
}
handle {
reverse_proxy localhost:3000
}
}
11. सर्टिफ़िकेट कहाँ रहते हैं
Caddy सर्टिफ़िकेट और keys को /var/lib/caddy/.local/share/caddy में स्टोर करता है। रिस्टोर के बाद सब कुछ दोबारा जारी करवाने से बचने के लिए इस पाथ को बैकअप में शामिल करें, हालाँकि यह न मिलने पर Caddy बस नए सर्टिफ़िकेट ले लेगा।
अगले कदम
आगे Caddy लगाकर आप एक सर्वर पर कई ऐप होस्ट कर सकते हैं। आम अगले कदम हैं WordPress, एक Docker स्टैक, या सेल्फ़-होस्टिंग से कोई सेल्फ़-होस्टेड टूल। सुरक्षा की बुनियादी बातें और बैकअप न भूलें।
अक्सर पूछे जाने वाले सवाल
क्या Caddy सच में अपने-आप HTTPS सर्टिफ़िकेट ले लेता है?
हाँ। जब Caddyfile में साइट एड्रेस एक पब्लिक डोमेन हो जो सर्वर की ओर पॉइंट करता हो, और पोर्ट 80 और 443 तक पहुँचा जा सके, तो Caddy किसी पब्लिक ACME अथॉरिटी से खुद ही सर्टिफ़िकेट लेता और रिन्यू करता है।
क्या Caddy प्रोडक्शन के लिए काफ़ी तेज़ है?
हाँ। आम वेब ऐप में रिवर्स प्रॉक्सी शायद ही कभी रुकावट बनता है, और Caddy शुरू से ही HTTP/2 और HTTP/3 सपोर्ट करता है।
क्या Caddy Docker में चल रहे ऐप तक प्रॉक्सी कर सकता है?
हाँ। Caddy को उसी Compose नेटवर्क में चलाएँ और सर्विस नाम इस्तेमाल करें, या कंटेनर को 127.0.0.1 पर बाइंड करें और localhost पोर्ट तक प्रॉक्सी करें।
Caddy या Nginx?
Caddy को कम कॉन्फ़िगरेशन चाहिए और यह सर्टिफ़िकेट खुद संभालता है। Nginx के पास उदाहरणों और मॉड्यूल का बड़ा इकोसिस्टम है। दोनों अच्छे विकल्प हैं।
Caddy सर्टिफ़िकेट क्यों नहीं ले पा रहा?
आमतौर पर DNS अभी सर्वर की ओर पॉइंट नहीं कर रहा होता, या पोर्ट 80 या 443 किसी फ़ायरवॉल से ब्लॉक होता है। दोनों जाँचें, फिर journalctl -u caddy देखें।