# Caddy یا Nginx؟ مقایسه کامل دو وب‌سرور و Reverse Proxy؛ کدام انتخاب بهتری است؟

مقایسه کاربردی Caddy و Nginx برای HTTPS، Reverse Proxy، توزیع بار، کش و استقرار Production؛ همراه با مثال و راهنمای انتخاب.

## از یک مسئله واقعی شروع کنیم

فرض کنید برنامه‌ای روی Linux فقط به پورت 8080 گوش می‌دهد. می‌خواهید کاربر با دامنه به آن برسد، ارتباط HTTPS باشد و خود برنامه مستقیم از اینترنت دیده نشود. معمولاً اینجا Nginx یا Caddy وارد معماری می‌شود. هر دو می‌توانند ورودی وب را بگیرند و درخواست را به برنامه بفرستند؛ تفاوت در تنظیم، چرخه گواهی، امکانات و نگهداری است. هدف این مقاله انتخاب برنده مطلق نیست، بلکه کمک به انتخاب متناسب با محیط شماست.

## بین مرورگر و برنامه چه می‌گذرد؟

مرورگر نام دامنه را از DNS به IP تبدیل می‌کند و درخواست HTTP می‌فرستد. Web Server درخواست را می‌پذیرد و فایل تحویل می‌دهد. Reverse Proxy در سمت سرور درخواست را می‌گیرد، مقصد Backend را انتخاب می‌کند و پاسخ را برمی‌گرداند. اگر برنامه روی 127.0.0.1:8080 باشد، پراکسی تنها نقطه ورودی عمومی است و برنامه را خصوصی نگه می‌دارد. HTTPS یعنی HTTP در کانال رمزگذاری TLS؛ گواهی به مرورگر در بررسی هویت دامنه کمک می‌کند. TLS کاربر تا پراکسی و پراکسی تا Backend دو مرز جدا هستند و باید با سطح اعتماد شبکه انتخاب شوند.

![بین مرورگر و برنامه چه می‌گذرد؟](/assets/img/articles/content/caddy-vs-nginx-web-server-reverse-proxy/caddy-vs-nginx-reverse-proxy-architecture.png)

## Nginx چه می‌کند؟

Nginx وب‌سرور و پراکسی رویدادمحور است: فایل ایستا ارائه می‌کند، TLS را خاتمه می‌دهد، درخواست را به Backend می‌فرستد، بین سرورها توزیع می‌کند و پاسخ‌های منتخب را کش می‌کند. در سایت‌ها و APIها، یک نقطه ورودی با ابزارهای عملیاتی جاافتاده فراهم می‌کند. معماری آن به‌تنهایی تضمین سرعت بیشتر در هر بارکاری نیست. Nginx Open Source را با NGINX Plus یکی نگیرید: بررسی فعال سلامت HTTP رسمی قابلیتی تجاری در Plus است؛ OSS رفتار passive failure برای upstream دارد.

## Caddy چه می‌کند؟

Caddy وب‌سرور و پراکسی با Caddyfile خوانا، پشتیبانی HTTPS خودکار و Admin API محلی است. reverse_proxy، توزیع بار و health check در هسته آن قرار دارند. برای گواهی عمومی، DNS دامنه باید به سرور برسد، پورت‌های اعتبارسنجی لازم بیرون باز باشند، Caddy بتواند bind کند و محل ذخیره گواهی پایدار و قابل نوشتن باشد. شبکه محدود، DNS challenge یا PKI داخلی ممکن است تنظیم جدا بخواهد. بسته رسمی همه افزونه‌های شخص ثالث را ندارد؛ ماژول‌های Build واقعی را بررسی کنید.

## نسخه‌هایی را مقایسه کنید که اجرا می‌کنید

جدول قابلیت‌ها edition-aware است؛ قابلیت‌های تجاری را با OSS یکی نگیرید.

| Capability | Caddy 2.11.7 | Nginx OSS 1.30.6 |
| --- | --- | --- |
| Reverse proxy | Native reverse_proxy | proxy_pass |
| Automatic ACME TLS | Built in, subject to reachability/DNS/storage | Separate ACME client and renewal/reload |
| Active HTTP health checks | Built in | NGINX Plus feature |
| Passive upstream checks | Available | Available |
| Proxy response cache | No general built-in core cache | proxy_cache available |
| Static files | file_server | Built in |
| Third-party modules | Custom build; verify module list | Build/package dependent |

## نصب روی Ubuntu

مخزن توزیع و مخزن upstream ممکن است نسخه متفاوت داشته باشند. این نمونه از Caddy stable رسمی و Nginx بسته Ubuntu استفاده می‌کند. برای Nginx upstream، مخزن امضاشده nginx.org را طبق مستندات رسمی تنظیم کنید.

```text
# Caddy stable repository
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl gnupg
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 caddy

# Nginx from Ubuntu repository
sudo apt update && sudo apt install nginx
caddy version
nginx -v
```

## تنظیمات متناظر Reverse Proxy

دامنه example.com به برنامه محلی روی 8080 می‌رود. Caddy تلاش می‌کند HTTPS خودکار را فعال کند. مثال Nginx فرض می‌کند ACME client یا PKI قبلاً گواهی را در این مسیرها نصب کرده است. این سرویس‌ها را جداگانه اجرا کنید؛ نمی‌توانند یک IP و پورت واحد را همزمان bind کنند.

```text
# Caddyfile
example.com {
    encode zstd gzip
    reverse_proxy 127.0.0.1:8080
}

# Nginx server block, inside http {}
server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

![تنظیمات متناظر Reverse Proxy](/assets/img/articles/content/caddy-vs-nginx-web-server-reverse-proxy/caddy-vs-nginx-configuration-comparison.png)

## چرخه عمر گواهی

Caddy چرخه معمول ACME را مدیریت می‌کند اما DNS، فایروال، storage، محدودیت CA و پایش لاگ همچنان لازم‌اند. گواهی local برای localhost گواهی عمومی نیست. در Nginx معمولاً ACME client گواهی را می‌گیرد و پس از تمدید باید Nginx reload شود. در Backend HTTPS، اعتبار CA و نام گواهی را بررسی کنید؛ خاموش کردن verification هویت سرور را حذف می‌کند.

![چرخه عمر گواهی](/assets/img/articles/content/caddy-vs-nginx-web-server-reverse-proxy/caddy-vs-nginx-https-certificates.png)

## توزیع بار و بررسی سلامت

Caddy reverse_proxy بررسی سلامت فعال دارد. Nginx OSS شکست درخواست‌های واقعی را passive بررسی می‌کند؛ دستور health_check فعال HTTP به NGINX Plus تعلق دارد. یک مسیر /healthz باید readiness واقعی را بدون افشای اطلاعات حساس نشان دهد. Retry عملیات پرداخت بدون طراحی idempotency ممکن است عملیات را تکرار کند.

```text
# Caddy active checks
example.com {
    reverse_proxy 10.0.0.11:8080 10.0.0.12:8080 10.0.0.13:8080 {
        lb_policy round_robin
        health_uri /healthz
        health_interval 10s
        health_timeout 2s
        health_fails 3
        health_passes 2
    }
}

# Nginx OSS passive failure handling
upstream app_pool {
    server 10.0.0.11:8080 max_fails=3 fail_timeout=10s;
    server 10.0.0.12:8080 max_fails=3 fail_timeout=10s;
    server 10.0.0.13:8080 max_fails=3 fail_timeout=10s;
}
server { listen 8080; location / { proxy_pass http://app_pool; } }
```

![توزیع بار و بررسی سلامت](/assets/img/articles/content/caddy-vs-nginx-web-server-reverse-proxy/caddy-vs-nginx-load-balancing.png)

## امنیت و بهره‌برداری

پورت Backend را فقط برای پراکسی باز بگذارید، کلید خصوصی را محدود کنید و Admin API Caddy را عمومی نکنید. اگر CDN جلوتر است، هدر IP را فقط از proxyهای معتمد بپذیرید. لاگ نباید توکن، کوکی حساس یا بدنه خصوصی را ثبت کند. TLS پراکسی تا Backend را با توجه به شبکه و داده انتخاب کنید؛ روی مسیر غیرقابل اعتماد رمزگذاری همراه با اعتبارسنجی لازم است.

## بارکاری خود را اندازه بگیرید

نسبت سرعت همگانی وجود ندارد. TLS، پاسخ، اتصال‌ها، Compression، Cache، لاگ، شبکه و Backend نتیجه را عوض می‌کنند. با تنظیم هم‌ارز Throughput، p95/p99 latency، خطا، CPU و حافظه را اندازه بگیرید و خرابی/بازیابی Backend و درخواست‌های طولانی را هم بیازمایید.

## کدام با محیط شما جور است؟

برای سرویس کوچک تازه که سادگی تنظیم و HTTPS خودکار اولویت دارد، Caddy نقطه شروع مناسبی است. برای ناوگان Nginx بالغ، نیاز جدی به proxy cache/static serving یا الگوهای عملیاتی جاافتاده، ادامه با Nginx منطقی است. اگر active check در Nginx لازم دارید Edition Plus یا لایه دیگری را بررسی کنید. صرفاً برای کوتاه‌تر شدن فایل تنظیمات مهاجرت نکنید.

![کدام با محیط شما جور است؟](/assets/img/articles/content/caddy-vs-nginx-web-server-reverse-proxy/caddy-vs-nginx-which-one-to-choose.png)

## مهاجرت کنترل‌شده

دامنه، مسیر، هدر، محدودیت Body، Timeout، WebSocket، Cache، Rate limit، IPهای معتمد و تمدید گواهی را فهرست کنید. روی Staging یا پورت جدا Syntax check بگیرید؛ ورود، آپلود، خطای Backend، آدرس کاربر و تمدید گواهی را بیازمایید. تنظیم قبلی و rollback را نگه دارید؛ جابه‌جایی Listener را کنترل کنید.

## پرسش‌های رایج

Caddy همیشه گواهی عمومی می‌گیرد؟ خیر؛ DNS، دسترسی پورت‌ها و storage پایدار باید مهیا باشد. Nginx OSS بررسی فعال HTTP دارد؟ ماژول رسمی در Plus است. کدام سریع‌تر است؟ بار مشابه را بسنجید. کنار هم اجرا می‌شوند؟ بله روی پورت‌های متفاوت یا لایه‌های جدا، نه روی یک IP:port یکسان.

## Related articles

[HAProxy vs Nginx](/articles/haproxy-vs-nginx-load-balancer-reverse-proxy)
[Nginx reverse proxy for multiple domains](/articles/nginx-reverse-proxy-multiple-domains-single-ip-443)

## Official references

Versions checked 24 October 2026: Caddy 2.11.7 and Nginx Open Source stable 1.30.6. Distribution packages can differ; verify installed versions.

[Caddy release](https://github.com/caddyserver/caddy/releases/tag/v2.11.7)
[Caddy install](https://caddyserver.com/docs/install)
[Caddy automatic HTTPS](https://caddyserver.com/docs/automatic-https)
[Caddyfile](https://caddyserver.com/docs/caddyfile)
[Caddy reverse proxy](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy)
[Caddy API](https://caddyserver.com/docs/api)
[Nginx news](https://nginx.org/en/news.html)
[Nginx docs](https://nginx.org/en/docs/)
[Nginx proxy module](https://nginx.org/en/docs/http/ngx_http_proxy_module.html)
[Nginx upstream module](https://nginx.org/en/docs/http/ngx_http_upstream_module.html)
[NGINX Plus health checks](https://docs.nginx.com/nginx/admin-guide/load-balancer/http-health-check/)
[Nginx packages](https://nginx.org/en/linux_packages.html)
[ACME RFC 8555](https://www.rfc-editor.org/rfc/rfc8555)

- [Caddyfile](/downloads/caddy-vs-nginx-web-server-reverse-proxy/Caddyfile)
- [nginx-reverse-proxy.conf](/downloads/caddy-vs-nginx-web-server-reverse-proxy/nginx-reverse-proxy.conf)
- [nginx-load-balancer.conf](/downloads/caddy-vs-nginx-web-server-reverse-proxy/nginx-load-balancer.conf)
- [caddy-load-balancer.Caddyfile](/downloads/caddy-vs-nginx-web-server-reverse-proxy/caddy-load-balancer.Caddyfile)
- [docker-compose-caddy.yml](/downloads/caddy-vs-nginx-web-server-reverse-proxy/docker-compose-caddy.yml)
- [docker-compose-nginx.yml](/downloads/caddy-vs-nginx-web-server-reverse-proxy/docker-compose-nginx.yml)
- [caddy-nginx-comparison-checklist.md](/downloads/caddy-vs-nginx-web-server-reverse-proxy/caddy-nginx-comparison-checklist.md)
- [migration-nginx-to-caddy.md](/downloads/caddy-vs-nginx-web-server-reverse-proxy/migration-nginx-to-caddy.md)
- [nginx-compose.conf](/downloads/caddy-vs-nginx-web-server-reverse-proxy/nginx-compose.conf)
