دليل عملي

Nginx Proxy Manager على VPS: بروكسي عكسي بصري مع SSL تلقائي

النشر9 دقائق للقراءةعدد الخطوات: 8

عندما تعمل عدة تطبيقات على نفس VPS، يستمع كل منها على منفذ مختلف وتصبح إدارة SSL أمراً مرهقاً. يحل Nginx Proxy Manager هذه المشكلة بواجهة ويب تؤتمت شهادات Let's Encrypt، وتوجه النطاقات إلى الحاويات الصحيحة دون الحاجة إلى تعديل أي ملف إعداد nginx. يغطي هذا الدليل التثبيت وإعداد مضيفي البروكسي ومقارنة مع Caddy وTraefik لمساعدتك في اختيار الأداة المناسبة.

المحتويات· لماذا تحتاج إلى بروكسي عكسي على VPS1/10
  1. 01لماذا تحتاج إلى بروكسي عكسي على VPS
  2. 02ما يبسّطه Nginx Proxy Manager
  3. 03المتطلبات الأساسية
  4. 04تثبيت NPM باستخدام Docker Compose
  5. 05إضافة أول مضيف بروكسي
  6. 06إعداد نطاق فرعي مع إعادة توجيه HTTPS إجبارية
  7. 07حالة متقدمة: بروكسي لتطبيق Docker بدون منفذ مكشوف
  8. 08قوائم الوصول: حماية لوحة الإدارة بمصادقة
  9. 09مقارنة: Nginx Proxy Manager مقابل Caddy مقابل Traefik
  10. 10حدود NPM ومتى تنتقل إلى Traefik

لماذا تحتاج إلى بروكسي عكسي على VPS

يكشف VPS عن عنوان IP عام واحد فقط. إذا كنت تشغّل ثلاثة تطبيقات Docker — واجهة برمجية، وواجهة أمامية، وأداة إدارة — فكل منها يشغل منفذاً مختلفاً: 3000 و8080 و9000. بدون بروكسي عكسي، يضطر زوارك إلى كتابة المنفذ في الرابط، وتُدار شهادات SSL لكل تطبيق على حدة، مما يزيد من سطح الهجوم.

يُمركز البروكسي العكسي دخول حركة المرور: يستقبل جميع الطلبات على المنفذين 80 و443، ويفحص اسم النطاق أو المسار، ثم يعيد توجيه الطلب إلى الحاوية الصحيحة على الشبكة الداخلية. لا تكشف التطبيقات بعد الآن عن منافذ عامة. يتم إنهاء SSL على مستوى البروكسي الذي يعيد التوزيع عبر HTTP العادي على الشبكة الخاصة لـ Docker.

توفر هذه البنية ثلاث فوائد ملموسة: نقطة إدارة موحدة للشهادات، وعزل الشبكة للتطبيقات، وإمكانية إضافة أو إزالة تطبيق دون المساس بالآخرين.

ما يبسّطه Nginx Proxy Manager

  • واجهة ويب: إضافة وتعديل وحذف مضيفي البروكسي دون سطر أوامر أو إعادة تحميل يدوية
  • SSL من Let's Encrypt بنقرة واحدة: يطلب NPM الشهادات ويجددها وينشرها تلقائياً عبر HTTP-01 أو DNS-01
  • Wildcard DNS: شهادة واحدة لـ *.mynomain.com إذا كان مزود DNS يدعم Certbot API
  • قوائم الوصول: مصادقة HTTP الأساسية أو القائمة البيضاء لعناوين IP مباشرة من الواجهة
  • إعادة التوجيه وعناوين URL المخصصة: HTTP إلى HTTPS وإعادة توجيه 301/302 دون تعديل nginx.conf
  • إعادة التحميل دون انقطاع: يعيد NPM تحميل إعداد nginx في الخلفية دون توقف

المتطلبات الأساسية

لمتابعة هذا الدليل، تحتاج إلى VPS يعمل بنظام Ubuntu 22.04 أو Debian 12 مع ذاكرة RAM لا تقل عن 1 جيجابايت (يُنصح بـ 2 جيجابايت إذا كانت تعمل عدة تطبيقات في آن واحد). يجب تثبيت Docker Engine وDocker Compose v2.

يجب أن يكون المنفذان 80 و443 متاحَين من الخارج. تحقق من أن جدار الحماية (ufw أو قواعد لوحة التحكم) يسمح بهما. إذا كنت تستخدم جدار حماية سحابياً، افتح هذين المنفذين للحركة الواردة.

أخيراً، يجب أن تمتلك اسم نطاق أو نطاقاً فرعياً واحداً على الأقل يشير إلى عنوان IP لـ VPS. يمكن لـ NPM إدارة نطاقات متعددة في نفس الوقت — الحد الأدنى المطلوب وجود سجل DNS A لكل نطاق تريد وضعه خلف البروكسي.

تثبيت NPM باستخدام Docker Compose

  1. إنشاء هيكل المجلدات

    أنشئ مجلداً مخصصاً وانتقل إليه:

    mkdir -p /opt/npm && cd /opt/npm

    سيحتوي هذا المجلد على ملف Compose والأحجام الدائمة لـ NPM (قاعدة بيانات SQLite والشهادات والسجلات).

  2. كتابة docker-compose.yml

    أنشئ الملف /opt/npm/docker-compose.yml بالمحتوى التالي:

    services:
      app:
        image: jc21/nginx-proxy-manager:latest
        restart: unless-stopped
        ports:
          - "80:80"
          - "443:443"
          - "81:81"
        volumes:
          - ./data:/data
          - ./letsencrypt:/etc/letsencrypt
    
    networks:
      default:
        name: proxy-net
        external: false

    المنفذ 81 هو واجهة الإدارة. ستُشارك شبكة proxy-net مع الحاويات الأخرى حتى يمكن الوصول إليها دون كشف منافذ عامة.

  3. تشغيل NPM

    أطلق الحاوية في الخلفية:

    docker compose up -d

    انتظر 30 إلى 60 ثانية حتى يهيئ NPM قاعدة بياناته. تحقق من أن المنافذ الثلاثة تستمع:

    ss -tlnp | grep -E ':(80|81|443)'
  4. تسجيل الدخول الأول وتغيير كلمة المرور

    افتح http://IP_VPS:81 في متصفحك. بيانات الاعتماد الافتراضية هي [email protected] / changeme.

    يجبرك NPM على تغيير عنوان البريد الإلكتروني وكلمة المرور عند تسجيل الدخول الأول. استخدم عنواناً صالحاً: سيُستخدم لإشعارات انتهاء صلاحية شهادات Let's Encrypt.

    تنبيه: المنفذ 81 مكشوف للعموم. اضبط قائمة وصول فوراً (راجع قسم قوائم الوصول) أو قيّد هذا المنفذ على مستوى جدار الحماية لعنوان IP الخاص بك.

إضافة أول مضيف بروكسي

  1. إنشاء مضيف بروكسي جديد

    في واجهة NPM، انقر على Proxy Hosts ثم Add Proxy Host. اكتب نطاقك في حقل Domain Names، مثلاً app.mynomain.com. تأكد أن سجل DNS A لهذا النطاق الفرعي يشير بالفعل إلى عنوان IP لـ VPS — سيتحقق Let's Encrypt من هذا الحل.

  2. إعداد الوجهة

    في حقلَي Forward Hostname / IP وForward Port، أدخل المضيف والمنفذ لتطبيقك. إذا كان التطبيق يعمل في حاوية Docker على نفس شبكة proxy-net، استخدم اسم الخدمة في Docker كاسم المضيف (مثال: myapp والمنفذ 3000). حدد Block Common Exploits لتفعيل قواعد الفلترة الأساسية.

  3. تفعيل Let's Encrypt

    انتقل إلى علامة التبويب SSL في نفس النافذة. من القائمة المنسدلة، اختر Request a new SSL Certificate. حدد Force SSL لإعادة توجيه HTTP إلى HTTPS تلقائياً، وHTTP/2 Support لتمكين HTTP/2. أدخل عنوان بريدك الإلكتروني، اقبل شروط Let's Encrypt، ثم انقر Save.

    يبدأ NPM فوراً في طلب الشهادة عبر تحدي HTTP-01. في أقل من دقيقة، يصبح نطاقك متاحاً عبر HTTPS بشهادة صالحة.

  4. التحقق من النتيجة

    تعرض قائمة مضيفي البروكسي الآن إدخالك مع شارة SSL خضراء. اختبر من متصفحك أو باستخدام curl:

    curl -I https://app.mynomain.com

    يجب أن تحتوي الاستجابة على HTTP/2 200 ورأس server: nginx. تجديد الشهادة تلقائي — يعيد NPM الطلب قبل 30 يوماً من انتهاء الصلاحية.

إعداد نطاق فرعي مع إعادة توجيه HTTPS إجبارية

إجبار HTTPS ليس مجرد ممارسة جيدة: إنه أساس أمان النقل. عند إنشاء أو تعديل مضيف بروكسي، تكشف علامة التبويب SSL عن ثلاثة خيارات تكميلية.

Force SSL: يولّد NPM تلقائياً كتلة return 301 https://$host$request_uri; في إعداد nginx للمضيف الافتراضي. أي طلب HTTP يُعاد توجيهه من جانب الخادم قبل وصوله إلى تطبيقك.

HSTS (HTTP Strict Transport Security): بتحديد هذا الخيار، يضيف NPM رأس Strict-Transport-Security: max-age=63072000; includeSubDomains; preload إلى استجابات HTTPS. يتذكر المتصفح أن هذا النطاق يجب الاتصال به دائماً عبر HTTPS. لا تفعّل HSTS إلا إذا كنت متأكداً من الحفاظ على SSL.

HTTP/2 Support: يفعّل بروتوكول HTTP/2 على جانب العميل دون أي تعديل على جانب التطبيق. يقلل التعدد من وقت الاستجابة المحسوس، خاصة على الصفحات التي تحتوي على موارد كثيرة.

حالة متقدمة: بروكسي لتطبيق Docker بدون منفذ مكشوف

إحدى أكثر مزايا NPM التي لا تُقدَّر حق قدرها هي القدرة على عكس الحاويات التي لا تكشف أي منفذ عام. يتم الاتصال فقط عبر الشبكة الداخلية لـ Docker.

لكي تكون الحاوية قابلة للوصول بواسطة NPM بدون كشف عام، يجب أن تتشارك كلا الخدمتين نفس شبكة Docker. مثال مع تطبيق Node.js في /opt/myapp/docker-compose.yml:

services:
  web:
    image: my-image:latest
    restart: unless-stopped
    # لا يوجد قسم 'ports' — الحاوية غير متاحة من المضيف
    networks:
      - proxy-net

networks:
  proxy-net:
    external: true

بالإعلان عن proxy-net كشبكة خارجية وإرفاق الخدمة بهذه الشبكة، تصبح حاوية web قابلة للوصول من NPM باسم خدمتها. في واجهة NPM، سيكون Forward Hostname ببساطة web وForward Port منفذ التطبيق الداخلي.

قوائم الوصول: حماية لوحة الإدارة بمصادقة

يتيح NPM تقييد الوصول إلى مضيفي بروكسي معينين عبر قوائم الوصول. انتقل إلى Access Lists ثم Add Access List. أعطِ القائمة اسماً، وأضف إدخالات تحت علامة التبويب Authorization (اسم مستخدم + كلمة مرور مشفّرة)، و/أو قيّد بعناوين IP تحت Access.

ثم حرّر مضيف البروكسي الذي تريد حمايته وحدد هذه القائمة في حقل Access List. يضيف NPM تلقائياً كتلة auth_basic إلى إعداد nginx للمضيف الافتراضي. هذا مفيد بشكل خاص لكشف أدوات الإدارة دون نشر خادم مصادقة كامل.

لحماية المنفذ 81 نفسه (واجهة NPM)، تمر الحماية عبر جدار الحماية — قيّد الوصول إلى هذا المنفذ على عنوان IP الثابت الخاص بك أو شبكة VPN.

مقارنة: Nginx Proxy Manager مقابل Caddy مقابل Traefik

مرّر الجدول أفقيًا

المعيارNginx Proxy ManagerCaddyTraefik
الإعدادواجهة ويب بصرية، لا حاجة لتعديل ملفاتCaddyfile تصريحي، صيغة موجزةYAML/TOML أو تسميات Docker، منحنى تعلم أكثر حدة
SSL تلقائيLet's Encrypt HTTP-01 وDNS-01، واجهة بصريةمدمج أصلياً، HTTP-01 وDNS-01 بدون إضافاتACME مدمج، يتطلب إعداد YAML
الاكتشاف التلقائي لـ Dockerلا، إعداد يدوي لكل مضيفغير مدمج أصلياً، ممكن عبر تسميات مع caddy-docker-proxyمدمج أصلياً عبر تسميات Docker، يكتشف الخدمات عند البدء
حالة الاستخدام المثاليةمطور يدير أقل من 20 تطبيقاً، يفضل الواجهة على الإعدادمكدس بسيط إلى متوسط، إعداد قابل للقراءة في ملفالخدمات المصغرة، Kubernetes، البيئات الديناميكية
التخصيص المتقدممحدود — مقتطفات nginx مخصصة ممكنة لكن غير مستحسنةعالٍ عبر الوحدات وتوجيهات Caddyfileعالٍ جداً، وسيطات قابلة للتسلسل، إضافات غنية
الموارد~50 ميجابايت RAM في حالة الخمول~30 ميجابايت RAM في حالة الخمول~40 ميجابايت RAM في حالة الخمول، أكثر حسب الإضافات

حدود NPM ومتى تنتقل إلى Traefik

يغطي NPM الغالبية العظمى من حالات الاستخدام للمطورين الذين يديرون عشرة تطبيقات على VPS واحد أو اثنين. يبدأ في إظهار حدوده في عدة سيناريوهات.

إعداد nginx متقدم: يولّد NPM ملفات إعداده ويعيد توليدها مع كل تعديل من الواجهة. من الممكن تقنياً إضافة مقتطفات مخصصة، لكنها قد تُستبدل أثناء التحديث. إذا احتجت إلى إعدادات nginx دقيقة — تحديد معدل لكل مسار، ذاكرة تخزين مؤقت معقدة، منطق إعادة كتابة متقدم — يصبح NPM طبقة احتكاك بدلاً من مساعدة.

البيئات الديناميكية: في بنية الخدمات المصغرة حيث تظهر الحاويات وتختفي بشكل متكرر، يصبح الإعداد اليدوي لكل مضيف في NPM عنق زجاجة. HAProxy أو Traefik، اللذان يكتشفان الخدمات تلقائياً عبر تسميات Docker، أكثر ملاءمة لهذا السياق.

Kubernetes: لا مكان لـ NPM في مجموعة Kubernetes. يمتلك Traefik وحدة تحكم Ingress أصيلة؛ وingress-nginx هو الخيار الشائع الآخر.

قاعدة عملية: إذا كان إعدادك يناسب واجهة NPM ولا يتطلب نصوص أتمتة للبقاء محدثاً، فـ NPM هو الخيار الصحيح. بمجرد أن تجد نفسك تكتب نصوصاً للتفاعل مع API الخاص بـ NPM، فهذه إشارة لتقييم Caddy أو Traefik.

VPS جاهز لحاويات Docker الخاصة بك

ServOrbit.com يوفر VPS سحابياً ابتداءً من 99 درهم/شهر، مع شبكة عالية التوفر ونسخ احتياطية ودعم تقني مدمج. انشر Nginx Proxy Manager في دقائق.

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـالعربية والفرنسية والإنجليزية.

راسلنا على WhatsAppيُفتح في علامة تبويب جديدة