خادم VPS جديد، نطاق موجّه إليه، وأمر واحد يفصلك عن خادم ويب يعمل. الشيء التالي الذي تكتبه يثبّت إما Caddy أو Nginx، وهذا القرار الواحد يحدّد مقدار الوقت الذي تقضيه على TLS طوال عمر الجهاز. إذًا: Caddy مقابل Nginx على خادم VPS، أيهما تثبّت؟
ما يلي هو الإعدادات الثلاثة نفسها مُعدَّة في كلتا الأداتين، جنبًا إلى جنب، مع أرقام الذاكرة المُبلَّغ عنها، ومأخذ شهادة wildcard، وملاحظات ترحيل عملية إذا كنت بالفعل على Nginx.
النسخة المختصرة
- الخلاصة: Caddy لمعظم أعباء عمل VPS الجديدة، خصوصًا للمطورين المنفردين والفرق الصغيرة وTLS الذي تُعدّه وتنساه. اختر Nginx عندما تحتاج إلى منظومة وحداته، أو الضبط الصريح، أو خبرة الفريق الحالية، أو أصغر بصمة ذاكرة ممكنة.
- HTTPS التلقائي: يحصل Caddy على الشهادات ويجدّدها بنفسه. لا Certbot، ولا cron، ولا خطاف إعادة تحميل. يحتاج Nginx إلى Certbot (أو عميل ACME آخر) وأتمتة التجديد المحيطة به.
- الذاكرة: Nginx أخفّ، بفضل C مقابل Go. نادرًا ما تحسم الفجوة أي شيء على باقة حديثة؛ الأرقام في الجدول أدناه.
- المأخذ: Caddy ليس عديم الإعداد لشهادات wildcard. اسم مثل *.example.com يحتاج إلى تحدّي DNS، وهو ما يعني إضافة ورمز API.
المقارنة بأكملها على شاشة واحدة:
| Caddy | Nginx | |
|---|---|---|
| اللغة | Go | C |
| HTTPS التلقائي | مدمج (Let's Encrypt + ZeroSSL) | لا شيء؛ يحتاج إلى Certbot أو عميل ACME آخر |
| إسهاب الإعداد | أدنى ما يمكن (بضعة أسطر لكل موقع) | صريح ومُسهب |
| HTTP/3 | مُفعَّل افتراضيًا مع HTTPS | متاح منذ 1.25.0؛ يجب تفعيله في إعداد Nginx. بناء المصدر يتطلب --with-http_v3_module. |
| الذاكرة المُبلَّغ عنها في وضع الخمول | 15-25 MB | 2-8 MB |
| الذاكرة المُبلَّغ عنها عند 1,000 اتصال | 80-120 MB | 50-80 MB |
| منظومة الوحدات | أصغر، تُوسَّع عبر xcaddy | كبيرة وناضجة |
| الرخصة | Apache 2.0 | BSD-2-Clause |
نطاقات الذاكرة مأخوذة من اختبار VPS واحد من طرف ثالث وينبغي التعامل معها كإرشاد توجيهي لا كمتطلبات عامة. يعتمد الاستخدام الفعلي على إصدارات البرمجيات والوحدات المُفعَّلة والتسجيل وحركة المرور ومنهجية الاختبار. تأتي معلومات الإصدار والرخصة من المستودعات الرسمية للمشاريع.
HTTPS التلقائي في Caddy (وما يحلّ محله فعليًا)
يحصل Caddy على شهادات TLS ويجدّدها بمفرده. وجّه نطاقًا عامًا إلى الجهاز، وشغّل Caddy، فيحصل على شهادة من Let's Encrypt أو ZeroSSL، ثم يجدّدها في الخلفية. لا Certbot، ولا مهمة cron، ولا خطاف إعادة تحميل بعد التجديد. هذا هو HTTPS التلقائي في Caddy في جملة واحدة، وهو السبب الكامل الذي يجعل الناس يتحولون إليه.
تحت الغطاء، يستخدم Caddy تحدّي HTTP-01 (port 80) أو TLS-ALPN-01 (port 443) لإثبات ملكية النطاق، ثم يبقي الشهادة محدّثة دون تدخّل أي أداة ثانية.
المكافئ في Nginx يستخدم عميل ACME منفصلًا. مع certbot --nginx سير العمل الشائع، يمكن لـ Certbot الحصول على الشهادة وتثبيتها، ثم إعادة استخدام الإضافة نفسها والخيارات المحفوظة أثناء التجديد. تتضمّن معظم عمليات تثبيت Certbot أيضًا مهمة مجدولة تعمل certbot renew تلقائيًا.
إذا كنت تستخدم certbot certonly أو عميل ACME آخر يكتب الملفات المجدَّدة إلى القرص فقط، فأضف خطاف نشر يعيد تحميل Nginx بعد تجديد ناجح. هذا الإعداد يعمل، لكنه لا يزال يترك أجزاء متحرّكة أكثر من Caddy: خادم الويب، وعميل ACME، ومُجدوِل التجديد، وأي خطاف نشر تبقى مكوّنات منفصلة.
الميزة التشغيلية لـ Caddy هي أن إصدار الشهادة ونشرها وتجديدها وعمليات إعادة التوجيه من HTTP إلى HTTPS مدمجة في الخادم نفسه. افتراضيًا، يبدأ Caddy محاولة التجديد عندما يتبقى تقريبًا ثلث عمر الشهادة، 30 يومًا لشهادة مدتها 90 يومًا، ما لم تحدّد جهة إصدار الشهادات نافذة تجديد مختلفة.
نصيحة احترافية: تحتاج تحدّيات ACME الافتراضية في Caddy إلى إمكانية وصول عام على port 80 أو 443: يستخدم HTTP-01 المنفذ port 80، بينما يستخدم TLS-ALPN-01 المنفذ port 443. إذا كان port 80 محجوبًا لكن 443 مفتوحًا، فقد يظل TLS-ALPN يعمل؛ وإذا لم يكن الجهاز موجّهًا إلى الإنترنت، فاستخدم DNS-01، مثل شهادات wildcard أدناه.
ملفات الإعداد، جنبًا إلى جنب
إليك ثلاثة إعدادات VPS شائعة: وكيل HTTPS عكسي، وتقديم ملفات ثابتة، ومصادقة أساسية، مكتوبة لكلتا الأداتين. تتضمّن أمثلة Caddy التلقائية HTTPS. تفترض أمثلة Nginx أن شهادة قد جُهِّزت بالفعل، وتُظهر أمثلة الملفات الثابتة والمصادقة الأساسية كتلة خادم HTTPS فقط. أعد استخدام كتلة إعادة توجيه port 80 من المثال الأول إذا أردت سلوكًا مكافئًا من HTTP إلى HTTPS.
وكيل عكسي إلى تطبيق محلي على port 3000:
Caddyfile
example.com {
reverse_proxy localhost:3000
}
nginx.conf
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://localhost:3000;
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;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
تفترض أسطر TLS في كتلة Nginx أن Certbot قد شُغِّل بالفعل. بالنسبة لمنبع HTTP كالذي أعلاه، يمرّر Caddy الترويسة Host الواردة كما هي ويضبط X-Forwarded-For, X-Forwarded-Proto، و X-Forwarded-Host افتراضيًا. مع Nginx، تضيف عادة ترويسات الوكيل صراحة عندما يحتاج المنبع إلى المضيف الأصلي والمخطط وسلسلة عنوان العميل. تلك هي المقايضة مصغّرة: يأتي Caddy بإعدادات وكيل عملية افتراضية، بينما يجعل Nginx مزيدًا من ذلك السلوك صريحًا.
تقديم الملفات الثابتة:
Caddyfile
example.com {
root * /var/www
file_server
}
nginx.conf
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;
root /var/www;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
المصادقة الأساسية، تحمي كل شيء خلف اسم مستخدم وكلمة مرور:
Caddyfile
example.com {
basic_auth {
Bob $2a$14$Zkx19XLiW6VYouLHR5NmfOFU0z2GTNmpkT/5qqR7hx4IjWJPDhjvG
}
reverse_proxy localhost:3000
}
nginx.conf
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;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://localhost:3000;
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;
}
}
تقوم كلتا الأداتين بتجزئة كلمة المرور خارج النطاق. يستخدم Caddy caddy hash-password؛ يستخدم Nginx htpasswd لبناء ملف .htpasswd. التوجيه هو basic_auth في Caddy الحالي، بالمناسبة. كان basicauth حتى أعاد v2.8.0 تسميته، كما هو مذكور في توثيق basic_auth في Caddy، ولا تزال الدروس القديمة توقع الناس فيه.
نصيحة احترافية: تلك التجزئة في الـ Caddyfile ليست كلمة المرور. إنها ناتج bcrypt من
caddy hash-password. شغّل الأمر، والصق ما يطبعه. يرفض Caddy كلمات المرور النصية الصريحة في الإعداد، وهو الإعداد الافتراضي الصحيح ومفاجأة صغيرة في المرة الأولى.
الإعدادات تدافع عن نفسها. يطوي Caddy طبقة TLS وترويسات وكيل معقولة وإعادة توجيه في بضعة أسطر؛ أما Nginx فصريح ومُسهب ويسلّمك كل مقبض. إذا قضيت سنوات في Nginx، فالإسهاب ذاكرة عضلية والتحكم هو المقصود. إذا لم تفعل، فالـ Caddyfile إعداد يمكنك أن تحفظه في ذهنك. النقطة العملية بسيطة: إعداد Caddy أسهل للقراءة بنظرة سريعة، بينما يمنحك Nginx تحكمًا أكثر صراحة.
الأداء والذاكرة: قراءة نتائج القياس بعناية
تشير الاختبارات المنشورة إلى الاتجاه العام نفسه: يستخدم Nginx عادة ذاكرة أقل ويتصدّر غالبًا في الإنتاجية الخام، لكن حجم تلك الميزة يعتمد بشدة على البيئة.
In اختبار جهاز افتراضي رباعي النوى من طرف ثالث، بلغ Nginx نحو 48,000 طلب في الثانية، مقارنة بنحو 42,000 لـ Caddy. أبلغ الاختبار نفسه عن زمن استجابة HTTPS p99 قدره 2.1 ms لـ Nginx و2.4 ms لـ Caddy. تعامل مع هذه كنتائج من إعداد واحد لا كهامش أداء عام.
نطاقات الذاكرة في جدول المقارنة مأخوذة من اختبار VPS منفصل. أبلغ اختبار اصطناعي آخر عند 50,000 اتصال متزامن عن 145 MB لـ Nginx و520 MB لـ Caddy، لكن ذلك الاختبار استخدم عتادًا وظروف عبء عمل مختلفة بشكل جوهري. لا ينبغي مقارنة أرقامه المطلقة مباشرة بأرقام VPS أعلاه.
الاستنتاج الموثوق أضيق: يمتلك Nginx عمومًا بصمة الذاكرة الأصغر ويميل إلى التصدّر تحت أعباء العمل عالية الإنتاجية أو عالية التزامن. بالنسبة لوكيل VPS عكسي عادي صغير إلى متوسط، كلاهما سريع بما يكفي عادة، لذا تكون البساطة التشغيلية غالبًا العامل الحاسم الأكثر فائدة.
خلاصة القسم: اختر بناءً على التشغيل ما لم يكن خادمك محدود الذاكرة أو تُظهر اختبارات الحمل الخاصة بك أن إنتاجية الوكيل هي عنق الزجاجة.
مأخذ شهادة wildcard (Caddy ليس دائمًا عديم الإعداد)
يستطيع Caddy أتمتة شهادات wildcard، لكن ليس بتحدّياته الافتراضية HTTP-01 أو TLS-ALPN-01. الشهادة لـ *.example.com تتطلب التحقق عبر DNS-01، وهو ما يفرضه Let's Encrypt لشهادات wildcard. يعني ذلك إضافة مزوّد DNS (مبنية في ثنائي Caddy لديك عبر xcaddy) إضافة إلى رمز API لمضيف DNS الخاص بك، مُعدّة في كتلة tls. إنها ليست قصة اكتب-سطرًا-واحدًا-وامضِ التي يروّج لها Caddy.
هذا يوقع مستخدمي المختبرات المنزلية الذين يضعون خدمات كثيرة تحت نطاق حقيقي يتحكمون به، مثل *.home.example.com، ويفترضون أن إصدار wildcard تلقائي مثل app.example.com. بالنسبة للأسماء الداخلية البحتة مثل *.homelab.internal، تعامل مع ذلك على أنه مجال PKI محلي/داخلي، لا wildcard عامًا من Let's Encrypt. لنكون دقيقين: Caddy يتعامل مع wildcard جيدًا، لكنه فقط لا يفعل ذلك بالتحدّيات الافتراضية، والإعداد خطوة أعلى من حالة النطاق الواحد. Nginx في الوضع نفسه هنا، لأن متطلب DNS-01 يأتي من Let's Encrypt، لا من الخادم.
إذا أردت واجهة GUI: Nginx Proxy Manager (استطراد قصير)
Nginx Proxy Manager كائن مختلف عن الأداتين أعلاه، ويستحق فقرة واحدة لأن الاسم يربك الناس. NPM هو غلاف GUI فوق Nginx: يدير قواعد الوكيل العكسي وشهادات Let's Encrypt عبر واجهة ويب على port 81. إنه ليس نواة Nginx، ولا يُعَدّ بالطريقة التي تُعَدّ بها نواة Nginx.
المقايضة هي المعتادة بين النقر والإعداد. NPM هو الزر السهل حتى تخرج عن المسار الميسّر. يُدار إعداده عبر قاعدة بيانات تطبيق بدلًا من ملف إعداد واحد مُحرَّر يدويًا. يستخدم إعداد Docker الافتراضي SQLite، بينما MySQL/MariaDB وPostgreSQL خيارات قواعد بيانات خارجية مدعومة. يؤثر ذلك الفرق أيضًا على قابلية النقل: يمكن غالبًا نقل إعداد Caddy بنسخ ملف Caddyfile واحد، بينما تتطلب عملية نشر Nginx Proxy Manager الحفاظ على بيانات التطبيق وقاعدة البيانات الخاصة به . NPM خيار جيد إذا كنت تفضّل فعلًا النقر على التحرير وبقي إعدادك بسيطًا. إنه الخيار الخاطئ لسير عمل البنية التحتية كشيفرة.
الترحيل من Nginx إلى Caddy (ما ينتقل وما لا ينتقل)
إذا كنت بالفعل على Nginx وتزن الانتقال، فابدأ بخفض توقعاتك بشأن الأتمتة: هناك محوّل إعداد NGINX لـ Caddy، لكنه غير مكتمل ولا ينبغي التعامل معه كمسار ترحيل موثوق بضربة واحدة. الترحيل من Nginx إلى Caddy هو في الأغلب إعادة كتابة يدوية، ومعظمه يصبح أقصر.
ما ينتقل ويصبح أبسط، وفقًا لـ دليل التحويل من مجتمع Caddy:
- بالنسبة لمنابع HTTP،
reverse_proxyيمرّر الترويسةHostالواردة كما هي و يضبط ترويسات X-Forwarded-* القياسية افتراضيًا، لذا فإن معظم تلكproxy_set_headerالأسطر تختفي. - ينهار PHP من كتلة location مع
try_filesإضافةfastcgi_passإضافة إلى كومة من المعاملات إلى توجيهphp_fastcgiواحد. - معالجة WebSocket تلقائية في Caddy v2. إذا أخبرك درس بإضافة توجيه منفصل
websocket، فهذا من مخلّفات Caddy v1. تجاهله.
ما لا ينتقل تلقائيًا: أي شيء مرتبط بوحدة Nginx محددة لا يمتلكها Caddy، ومنطق rewrite وlocation المعقّد الذي ستحتاج إلى إعادة التفكير فيه بدلًا من نقله، وإعدادات شهادات wildcard التي تعيدك إلى إعداد تحدّي DNS من القسم أعلاه. خصّص ميزانية للوحدات وعمليات إعادة الكتابة؛ والباقي عادة خفض صافٍ في عدد الأسطر.
أيهما ينبغي أن تثبّت؟ (القرار)
لقد رأيت الإعدادات والأرقام ومأخذ wildcard وتكلفة الترحيل، وإليك أين يستقرّ الأمر. ثبّت Caddy إذا كنت مطورًا منفردًا أو فريقًا صغيرًا، أو كان هذا نشرًا على خادم VPS جديد، أو أردت TLS تُعدّه وتنساه، أو كنت تشغّل Docker بتوجيه بسيط، أو أردت فقط إعدادًا يناسب الذاكرة العضلية. هذا ينطبق على معظم من يقرؤون هذا.
ثبّت Nginx إذا كنت تحتاج إلى تحكم دقيق أو وحدة محددة من منظومته الناضجة، أو كنت تعتصر الأداء من خادم محدود الذاكرة، أو كنت تقدّم ملفات ثابتة بتزامن عالٍ، أو كان فريقك يمتلك بالفعل خبرة عميقة في Nginx وكومة من الإعدادات العاملة. هذه أسباب متينة، وإذا كان أحدها سببك، فإن Nginx هو الاختيار الصحيح. هذه ليست حالة تكون فيها الأداة الأقدم هي الأداة الخاطئة.
أيًّا استقرّ رأيك عليه، فالخطوة التالية هي وضعه على الجهاز. كلاهما Caddy و Nginx متاحان كعمليات نشر بنقرة واحدة في سوقنا، لذا يمكنك تخطّي عمل التثبيت والانتقال مباشرة إلى الـ Caddyfile أو كتلة الخادم. خادم VPS بسعة 1 GB نقطة بداية معقولة لنشر موقع واحد قليل الحركة، لكن حدّد حجم الخادم للتطبيق وحركة المرور خلف الوكيل لا للوكيل وحده. إذا كنت تستخدم Caddy كواجهة أمامية للخدمات المُستضافة ذاتيًا، فيمكنه أن يقف أمام مكدّس مراقبة Prometheus وGrafana أو عملية نشر Uptime Kuma دون الحاجة إلى أدوات TLS منفصلة.
خلاصة القسم: اختر Caddy ما لم يكن لديك سبب محدد يشير إلى Nginx.
الأسئلة الشائعة
هل يحلّ Caddy محلّ Certbot؟
نعم. يستطيع Caddy الحصول على الشهادات العامة وتجديدها بنفسه، بما في ذلك شهادات wildcard، لذا لا يُشترط Certbot. تحتاج شهادات wildcard إلى التحقق عبر DNS-01، وهو ما يعني إعداد وحدة مزوّد DNS متوافقة وبيانات اعتماد API.
هل يستخدم Caddy ذاكرة أقل من Nginx؟
لا. يمتلك Nginx عمومًا بصمة ذاكرة أصغر. اختبار VPS واحد من طرف ثالث أبلغ عن 2-8 MB في وضع الخمول لـ Nginx و15-25 MB لـ Caddy، لكن هذه الأرقام خاصة بعبء العمل لا متطلبات ذاكرة ثابتة. يهمّ الفرق أكثر ما يكون على الخوادم محدودة الذاكرة التي تشغّل عدة خدمات.
هل Caddy أسرع من Nginx؟
يعتمد ذلك على عبء العمل. كلاهما سريع بما يكفي عادة لحركة مرور وكيل VPS العكسي النموذجية. في الاختبارات المذكورة، تصدّر Nginx في الإنتاجية الخام وكفاءة الذاكرة، لكن حجم الفرق تغيّر بشكل جوهري مع العتاد ونمط حركة المرور ومستوى التزامن. لا توجد نسبة مئوية واحدة تنطبق على كل عملية نشر.
هل يدعم Caddy شهادات SSL من نوع wildcard؟
نعم. شهادة wildcard مثل *.example.com تتطلب التحقق عبر DNS-01. بمجرد أن يمتلك Caddy وحدة مزوّد DNS متوافقة وبيانات اعتماد API، يمكنه الحصول على شهادة wildcard وتجديدها تلقائيًا.
هل Nginx Proxy Manager هو نفسه Nginx؟
لا. Nginx Proxy Manager غلاف GUI فوق Nginx يخزّن إعداده في قاعدة بيانات تطبيق، ويستخدم واجهة ويب على port 81، ويدير مضيفي الوكيل العكسي والشهادات عبر تلك الواجهة. تُعَدّ نواة Nginx بملفات نصية وليست لها واجهة GUI خاصة بها.
متى ينبغي أن أستخدم Nginx بدلًا من Caddy؟
اختر Nginx عندما تحتاج إلى تحكم دقيق، أو وحدة محددة من منظومته الناضجة، أو كل MB أخير على خادم محدود الذاكرة، أو تقديم ملفات ثابتة بتزامن عالٍ، أو كان لديك بالفعل خبرة عميقة في Nginx في الفريق.