قارن Nginx مقابل Caddy كبروكسي عكسي ومضيف ويب: الإعداد، HTTPS، التكوينات، الأداء، الإضافات، ومتى تختار كل واحد في 2025.

Caddyfile بسيط يمكن أن يجعلك تقدم موقعًا أو بروكسيًا عكسيًا في دقائق، والإعدادات الافتراضية موجهة نحو HTTPS آمن وحديث.\n\n### منحنى التعلم: أسلوب التكوين والمشكلات الشائعة\n\nتكوين Nginx قوي، لكن المبتدئين غالبًا ما يخطئون في:\n\n- أين توجد ملفات التكوين وكيف تعمل include\n- قواعد المطابقة الدقيقة (أسبقية location)\n- نسيان nginx -t قبل إعادة التحميل\n\nيقرأ Caddyfile الخاص بـ Caddy أشبه بنية النية ("اعكس هذا إلى ذلك"), ما يقلل أخطاء الإعداد الشائعة. المقابل هو أنه عندما تحتاج سلوكًا محددًا جدًا، قد تحتاج إلى معرفة JSON الداخلي لـ Caddy أو مفاهيم الوحدات الإضافية.\n\n### الوقت اللازم لجعل HTTPS يعمل لنطاق جديد\n\nمع Caddy، HTTPS لنطاق عام يكون غالبًا بسطر واحد: ضبط عنوان الموقع، توجيه DNS، تشغيل Caddy—تُطلب الشهادات وتجدد تلقائيًا.\n\nمع Nginx، HTTPS عادةً يتطلب اختيار طريقة الشهادة (مثل Certbot)، توصيل مسارات الملفات، وضبط التجديدات. الأمر ليس صعبًا، لكنه خطوات أكثر ومجالات أكثر للخطأ في التكوين.\n\n### تجربة التطوير المحلي (localhost، شهادات موقعة ذاتيًا، الثقة)\n\nللتطوير المحلي، Caddy يمكنه إنشاء وشهادة شهادات محلية موثوقة عبر caddy trust، مما يجعل https://localhost أقرب إلى الإنتاج.\n\nمع Nginx، HTTPS المحلي عادةً ما يكون يدويًا (إنشاء شهادة موقعة ذاتيًا، تكوينها، ثم قبول تحذيرات المتصفح أو تثبيت CA محلي). الكثير من الفرق تتخطى HTTPS محليًا، ما قد يخفي مشاكل في الكوكيز، وإعادة التوجيه، والمحتوى المختلط حتى مرحلة لاحقة.\n\n## أسلوب التكوين وقابلية القراءة\n\nالتكوين هو المكان الذي يبدو فيه Nginx و Caddy مختلفين تمامًا. Nginx يُفضّل البنية الصريحة والمتداخلة ومفردات ضخمة من التوجيهات. Caddy يفضل لغة أصغر قابلة للقراءة ومبنية على نية ما تريد—سهلة المسح، خصوصًا عند إدارة عدد قليل من المواقع.\n\n### Nginx: كتل الخادم، المواقع، وملفات include\n\nتُبنى إعدادات Nginx حول السياقات. معظم تطبيقات الويب تنتهي بواحد أو أكثر من كتل server {} (مضيفات افتراضية)، وداخلها، عدة كتل location {} تطابق المسارات.\n\nهذه البنية قوية، لكن القابلية للقراءة قد تتدهور عندما تتكدس القواعد (مواقع نمطية، عدة عبارات if، قوائم رؤوس طويلة). أداة القابلية للصيانة الرئيسية هي include: قسّم التكوينات الكبيرة إلى ملفات أصغر واحفظ تخطيطًا متسقًا.\n\nعدة مواقع على خادم واحد عادةً ما تعني عدة كتل server {} (غالبًا ملف لكل موقع)، بالإضافة إلى مقتطفات مشتركة:\n\n```nginxserver { listen 80; server_name example.com www.example.com;
include /etc/nginx/snippets/security-headers.conf;
location / { proxy_pass http://app_upstream; include /etc/nginx/snippets/proxy.conf; } } caddy example.com { reverse_proxy localhost:3000 encode zstd gzip header { Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" } } ```\n\n عادةً ما تكون مجرد كتل مواقع متعددة في نفس الملف (أو ملفات مستوردة)، وهو أمر سهل المسح أثناء المراجعات.\n\n### الحفاظ على قابلية الصيانة مع نمو المشاريع\n\n- في Nginx، قرّر ملفات لكل موقع + مقتطفات مشتركة. في Caddy، قرّر إن كان كل موقع يحصل على ملف منفصل ويتم استيراده عبر .\n- "إعدادات البروكسي الافتراضية"، "رؤوس الأمان"، "تخزين ثابت"—تجنّب نسخ الكتل بين المواقع.\n- يمكن لـ Nginx أن يعبّر عن أي شيء تقريبًا، لكن أذكى غالبًا ما يكون الأصعب في تصحيحه لاحقًا. يشجع Caddy على أنماط أبسط؛ إذا ما تجاوزتها، وثّق نيتك في التعليقات.\n\nإذا كانت الأولوية لديك الوضوح بأقل مراسم، فإن Caddyfile الخاص بـ Caddy صعب منافسته. إذا كنت تحتاج تحكمًا دقيقًا ولا تمانع أسلوبًا أكثر هيكلية وتفصيلاً، يظل Nginx ملائمًا قويًا.\n\n## HTTPS وإدارة الشهادات\n\nHTTPS هو المكان الذي تختلف فيه تجربة اليوم-باليوم بين Nginx و Caddy أكثر من غيره. كلاهما يمكنه تقديم TLS ممتاز؛ الاختلاف هو مقدار العمل الذي تقوم به—وكم مكانًا يمكن أن تدخل فيه انحراف التكوين.\n\n### Caddy: HTTPS تلقائي افتراضيًا\n\nالميزة البارزة في Caddy هي HTTPS التلقائي. إذا تمكن Caddy من تحديد اسم المضيف وكان قابلًا للوصول علنًا، فغالبًا ما سيقوم بـ:\n\n- الحصول على شهادة (عادةً عبر ACME/Let’s Encrypt)
اختر Caddy إذا أردت HTTPS تلقائيًا، وتكوينًا قصيرًا قابلًا للقراءة، ووقت نشر سريع لتطبيق صغير/متوسط.
اختر Nginx إذا احتجت أقصى قدر من المرونة، أو كنت تتبع معيار Nginx موجود في منظمتك/مُضيفك، أو إذا توقّعت الاعتماد بشكل كبير على أنماط ناضجة للتوجيه/التخزين المؤقت/الضبط.
لنطاق عام، غالبًا ما يكفي ذكر اسم الموقع وتعريف reverse_proxy أو file_server، وبعد توجيه DNS إلى الخادم، يطلب Caddy الشهادات ويجددها تلقائيًا.
مع Nginx، خطّط لاستخدام عميل ACME (مثل Certbot)، وتكوين ssl_certificate/ssl_certificate_key، والتأكد من أن عمليات التجديد تُفعّل إعادة تحميل الخادم.
الأخطاء الشائعة في Nginx تشمل:
location (خاصة التعابير النمطية والقواعد المتداخلة)include وتفاوت تخطيطات التوزيعاتnginx -t)يبقى ملف Caddyfile بسيطًا إلى أن تحتاج سلوكًا محددًا للغاية. عندها قد تحتاج إلى:
location المعقّد في Nginxإذا كان إعدادك غير عادي، قم بعمل نموذج مبكّر حتى لا تكتشف القيود أثناء الهجرة.
لدى Caddy دعم قوي لسيناريوهات HTTPS محليًا. يمكنك إنشاء وتثبيت شهادات محلية موثوقة (مثالًا caddy trust)، مما يساعدك على اكتشاف مشاكل HTTPS مبكرًا (الكوكيز، إعادة التوجيه، المحتوى المختلط).
مع Nginx، عادةً ما يكون HTTPS المحلي يدويًا (شهادات موقعة ذاتيًّا + تحذيرات المتصفح أو تثبيت CA محلي)، لذلك كثيرًا ما يتجنّبه الفرق ويكتشفون المشاكل لاحقًا.
كلاهما يمكن أن يعمل كبروكسي عكسي جيدًا، لكن تحقق من النقاط التالية في أي منهما:
Host، X-Forwarded-Proto، X-Forwarded-Forكلاهما يمكنه موازنة التحميل، لكن من الناحية التشغيلية ركّز على:
إذا كنت بحاجة إلى أنماط دقيقة أو معروفة جيدًا، فغالبًا ما تتوفر لـ Nginx وصفات معروفة؛ لإعدادات تعدد الخوادم البسيطة، Caddy سريع الإعداد.
انتبه إلى هذه الإعدادات بغض النظر عن الخادم:
قبل الإنتاج، شغّل اختبارًا واقعيًا: ارفع ملفًا كبيرًا، أبقِ طلبًا طويلًا مفتوحًا، وتأكد من توافق مهلات الخادم والبروكسي مع توقعات تطبيقك.
كلاهما يمكن أن يكون آمنًا، لكن الافتراضات الافتراضية تختلف.
أساسيات عملية:
لـقائمة تدقيق أعمق، راجع /blog/nginx-vs-caddy-security.
استخدم سير عمل “التحقق → إعادة التحميل” واعتبر التكوين ككود.
nginx -t ثم systemctl reload nginx (أو nginx -s reload)في كلتا الحالتين، احتفظ بالتهيئات في Git، نفّذ النشر عبر CI/CD مع خطوة تحقق تجريبية، واحتفظ بخطة تراجع سريعة.
\n\nقاعدة عملية: اعتبر `nginx.conf` كـ "التوصيل الجذري"، واحفظ تفاصيل التطبيقات/المواقع في `/etc/nginx/conf.d/` (أو `sites-available`/`sites-enabled` حسب التوزيعة).\n\n### Caddy: توجيهات Caddyfile وقابلية القراءة\n\nيقرأ Caddyfile الخاص بـ Caddy أشبه بقائمة من ما تريد حدوثه. تعلن عن **كتلة موقع** (عادةً النطاق)، ثم تضيف توجيهات مثل `reverse_proxy`، `file_server`، أو `encode`.\n\nللعديد من الفرق، المكسب الرئيسي هو بقاء مسار "المسار السعيد" قصيرًا ومقروءًا—حتى عند إضافة ميزات شائعة:\n\nimportlocationssl_certificate وssl_certificate_keyHost، X-Forwarded-Proto، وX-Forwarded-For، حتى يتمكن تطبيقك من بناء إعادة توجيهات وسجلات صحيحة.\n- معالجة عنوان العميل الحقيقي، وهو ما يؤثر على تحديد المعدّل، التدقيق، قواعد الموقع الجغرافي، وإعدادات "بروكسي موثوق" داخل إطار عملك.\n- دعم WebSockets للتشات ولوحات المعلومات والميزات اللحظية. في Nginx، هذا غالبًا يعني معالجة Upgrade/Connection بشكل صريح؛ في Caddy عادةً ما يُعالج تلقائيًا عند البروكسي.\n\n### موازنة الحمل والفحوصات الصحية\n\nإذا كان لديك أكثر من مثيل واحد للتطبيق، فيمكن لكلا الخادمين توزيع الحركة عبر الـ upstreams. لدى Nginx أنماط قديمة للتوزيع بالوزن وتحكم أدق، بينما موازنة الحمل في Caddy مباشرة ومناسبة للإعدادات الشائعة.\n\nالفحوصات الصحية هي الفارق التشغيلي الحقيقي: تريد استبعاد الحالات غير الصحية بسرعة، وتريد ضبط المهلات بحيث لا ينتظر المستخدمون على خلفيات ميتة.\n\n### المهلات، التخزين المؤقت والتحميلات الكبيرة\n\nالتطبيقات الحقيقية تصل إلى حواف الحالة: عملاء بطيئون، نداءات API طويلة، أحداث موجهة من الخادم، ورفع ملفات كبيرة.\n\nانتبه إلى:\n\n- مهلات القراءة/الكتابة بين البروكسي والخلفية\n- تخزين مؤقت للطلب/الاستجابة (جيد للاستقرار، سيئ للبث إذا شُغل خطأ)\n- حدود حجم الجسم وسلوك التخزين المؤقت المؤقت للملفات الكبيرة\n\n### تحديد المعدّل والحماية الأساسية\n\nلا أحد منهما عبارة عن WAF كامل افتراضيًا، لكن كلاهما يساعد بضوابط عملية: حدود طلبات لكل IP، حدود الاتصالات، وفحوصات أساسية على الرؤوس. إذا كنت تقارن موقف الأمان، فقارن ذلك مع قائمة التحقق الأوسع في /blog/nginx-vs-caddy-security.\n\n## الأداء ودعم البروتوكولات\n\nالأداء ليس مجرد "طلبات في الثانية". إنه أيضًا مدى سرعة رؤية المستخدمين لشيء مفيد، مدى كفاءة تقديم الأصول الثابتة، ومدى حداثة حزمة البروتوكولات لديك افتراضيًا.\n\n### الملفات الثابتة: رؤوس التخزين المؤقت والضغط\n\nللاستضافة الثابتة (CSS، JS، الصور)، يمكن أن يكون Nginx و Caddy سريعين جدًا عند التكوين الجيد.\n\nNginx يمنحك تحكمًا دقيقًا في رؤوس التخزين المؤقت (مثل التخزين الطويل للأصول المعرّفة بالهاش وتخزين أقصر لـ HTML). يمكن لـ Caddy فعل نفس الشيء، لكن قد تحتاج إلى الاعتماد على مقتطفات أو matchers للتعبير عن نفس النية.\n\nالضغط هو مفاضلة:\n\n- Gzip مدعوم على نطاق واسع وعادةً ما يكون افتراضيًا آمنًا.\n- Brotli يقلل أحجام النصوص أكثر، مما يساعد على الشبكات البطيئة، لكنه يكلف المزيد من CPU.\n\nللمواقع الصغيرة، تفعيل Brotli نادرًا ما يضر ويمكن أن يجعل الصفحات أسرع. للمواقع الكبيرة ذات الحركة الكثيفة، قِس رأسية CPU وفكّر في العناصر المضغوطة مسبقًا أو تفريغ الضغط على الـ CDN/الحدّ الخارجي.\n\n### HTTP/2 و HTTP/3: ما يلاحظه المستخدمون\n\nHTTP/2 هو الأساس لمعظم المتصفحات الحديثة ويُحسّن تحميل عدد كبير من الأصول الصغيرة عبر اتصال واحد. كلا الخادمين يدعمانه.\n\nHTTP/3 (عبر QUIC) يمكن أن يُحسّن الأداء على الشبكات المحمولة المتقلبة عن طريق تقليل مشكلة فقدان الحزم ومهلات المصافحة. يميل Caddy إلى جعل تجربة تجربة HTTP/3 أسهل، بينما يعتمد دعم Nginx على البناء وقد يتطلب حزمًا محددة.\n\n### SPA ومسارات fallback\n\nإذا كنت تقدم تطبيق صفحة واحدة، فعادةً ما تحتاج "حاول الملف، وإلا قدّم /index.html". كلاهما قادر على ذلك بشكل نظيف، لكن تحقّق من أن مسارات الـ API لا تعود إلى SPA وتخفي 404 حقيقية.\n\n## إعدادات الأمان الافتراضية وقائمة تشديد الحماية\n\nيمكن تأمين كل من Nginx و Caddy جيدًا، لكنهما يبدأان من افتراضات مختلفة.\n\nCaddy "آمن افتراضيًا" للعديد من النشر الشائعة: يفعّل TLS حديثًا تلقائيًا، يجدد الشهادات، ويشجع إعداد HTTPS فقط. Nginx مرن ومنشور على نطاق واسع، لكنك عادةً ما تحتاج إلى اتخاذ خيارات صريحة لـ TLS والرؤوس والتحكم بالوصول.\n\n### الإعدادات الشائعة (وماذا يجب أن تضبطه بنفسك)\n\n- عطّل النقاط/الميزات غير المستخدمة: لا تُرسل مواقع عينات أو واجهات إدارة أو مسارات تصحيح إلى الإنتاج.\n- حدّ من التعرض: اربط الخدمات الداخلية بالواجهات الخاصة، وانشر فقط ما يجب أن يكون عامًا.\n- ابقِ التبعيات محدثة: حدّث الخادم وأي وحدات بشكل دوري.\n\n### نسخ TLS واختيارات الشيفرات (اجعلها بسيطة)\n\n- فضّل TLS 1.2 و TLS 1.3؛ تجنّب الإصدارات القديمة.\n- استخدم الإعدادات الحديثة للخادم ما لم يكن لديك متطلبات امتثال صارمة.\n- بالنسبة لـ Nginx، عيّن البروتوكولات المسموح بها صراحة وابقَ على اتساق التكوين عبر المضيفين.\n\n### المصادقة الأساسية، السماح/الرفض حسب IP، وحماية نقاط الإدارة\n\nحمِ الأدوات الداخلية (مقاييس، لوحات الإدارة، المعاينات) بمصادقة و/أو قوائم سماح IP.\n\nمثال (Caddy):\n\ncaddyfile admin.example.com { basicauth { admin $2a$10$.............................................. } reverse_proxy 127.0.0.1:9000 } \n\nفي Nginx، طبّق auth_basic أو allow/deny على كتل location الدقيقة التي تعرض المسارات الحساسة.\n\n### رؤوس الأمان: HSTS، أساسيات CSP، والإعدادات الآمنة\n\nابدأ برؤوس تقلل المخاطر الشائعة:\n\n- HSTS (فقط بعد استقرار HTTPS): Strict-Transport-Security: max-age=31536000; includeSubDomains\n- حماية من النقر الاحتيالي: X-Frame-Options: DENY (أو SAMEORIGIN إذا لزم)\n- منع sniffing نوع المحتوى: X-Content-Type-Options: nosniff\n- CSP (أساسيات): ابدأ بسياسة محافظة ووسّعها عند الحاجة (أخطاء CSP يمكن أن تكسر المواقع)\n\nالتشديد ليس عن وجود "تكوين مثالي" واحد بل عن تطبيق هذه الضوابط باستمرار عبر كل تطبيق ونقطة نهاية.\n\n## النظام البيئي، الوحدات الإضافية، وإمكانية التوسعة\n\nتجربتك طويلة الأمد مع خادم ويب غالبًا ما تُحدّدها المنظومة المحيطة به: الوحدات، الأمثلة الآمنة للنسخ، ومدى صعوبة التوسعة عندما تتغير المتطلبات.\n\n### Nginx: وحدات ناضجة وقاعدة معرفية ضخمة\n\nيمتلك Nginx منظومة عميقة بُنيت على مر سنوات. هناك الكثير من الوحدات الرسمية والخارجية، بالإضافة إلى كمية هائلة من أمثلة التكوين من المجتمع (مقالات مدونة، gists على GitHub، وثائق البائعين). هذه ميزة حقيقية عندما تحتاج إلى قدرة محددة—التخزين المؤقت المتقدّم، موازنة دقيقة، أو أنماط تكامل لتطبيقات شائعة—لأن شخصًا ما حلها غالبًا من قبل.\n\nالمقابل: ليس كل مثال تجده حديث أو آمن. دائمًا افحص مقابل الوثائق الرسمية وإرشادات TLS الحديثة.\n\n### Caddy: الامتدادات قوية—استخدمها بحكمة\n\nيغطي جوهر Caddy الكثير (خاصة HTTPS والبروكسي العكسي)، لكنك ستلجأ إلى الامتدادات عندما تحتاج طرق مصادقة غير قياسية، اكتشاف upstream غير العادي، أو معالجة طلب مخصصة.\n\nكيفية تقييم امتداد:\n\n- إشارات الصيانة: إصدارات حديثة، قضايا/PRs نشطة، ملكية واضحة\n- موقف الأمان: أذونات قليلة، نموذج تهديد موثق، إعدادات افتراضية منطقية\n- ملاءمة تشغيلية: عملية بناء/إصدار يمكنك إعادة إنتاجها في CI\n\n### إدارة المخاطر التشغيلية وتجنّب القفل التقني\n\nالاعتماد على ملحقات غير شائعة يزيد مخاطر الترقية: كسر التوافق API أو إهمال الصيانة قد يجعلك محجوزًا على إصدار قديم. للبقاء مرنًا، فضّل الميزات المتاحة في الجوهر، اجعل التكوين قابلًا للنقل (وثّق النية، ليس فقط الصياغة)، وعزل "النكهة الخاصة" خلف واجهات محددة جيدًا (مثلاً اجعل المصادقة خدمة مخصصة). عند الشك، جرّب كلا الخادمين مع تطبيقك الحقيقي قبل الالتزام./ فقط وليس كل المسارات) أو حلقات إعادة التوجيه خلف بروكسي/CDN آخرUpgradeConnectionبعد التغييرات، اختبر تدفقات تسجيل الدخول وإعادة التوجيه المطلقة للتأكد من أن التطبيق يرى المخطط والمضيف الصحيحين.