لماذا تحتاج إلى بروكسي عكسي على 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
إنشاء هيكل المجلدات
أنشئ مجلداً مخصصاً وانتقل إليه:
mkdir -p /opt/npm && cd /opt/npmسيحتوي هذا المجلد على ملف Compose والأحجام الدائمة لـ NPM (قاعدة بيانات SQLite والشهادات والسجلات).
كتابة 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مع الحاويات الأخرى حتى يمكن الوصول إليها دون كشف منافذ عامة.تشغيل NPM
أطلق الحاوية في الخلفية:
docker compose up -dانتظر 30 إلى 60 ثانية حتى يهيئ NPM قاعدة بياناته. تحقق من أن المنافذ الثلاثة تستمع:
ss -tlnp | grep -E ':(80|81|443)'تسجيل الدخول الأول وتغيير كلمة المرور
افتح
http://IP_VPS:81في متصفحك. بيانات الاعتماد الافتراضية هي[email protected]/changeme.يجبرك NPM على تغيير عنوان البريد الإلكتروني وكلمة المرور عند تسجيل الدخول الأول. استخدم عنواناً صالحاً: سيُستخدم لإشعارات انتهاء صلاحية شهادات Let's Encrypt.
تنبيه: المنفذ 81 مكشوف للعموم. اضبط قائمة وصول فوراً (راجع قسم قوائم الوصول) أو قيّد هذا المنفذ على مستوى جدار الحماية لعنوان IP الخاص بك.
إضافة أول مضيف بروكسي
إنشاء مضيف بروكسي جديد
في واجهة NPM، انقر على Proxy Hosts ثم Add Proxy Host. اكتب نطاقك في حقل Domain Names، مثلاً
app.mynomain.com. تأكد أن سجل DNS A لهذا النطاق الفرعي يشير بالفعل إلى عنوان IP لـ VPS — سيتحقق Let's Encrypt من هذا الحل.إعداد الوجهة
في حقلَي Forward Hostname / IP وForward Port، أدخل المضيف والمنفذ لتطبيقك. إذا كان التطبيق يعمل في حاوية Docker على نفس شبكة
proxy-net، استخدم اسم الخدمة في Docker كاسم المضيف (مثال:myappوالمنفذ3000). حدد Block Common Exploits لتفعيل قواعد الفلترة الأساسية.تفعيل 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 بشهادة صالحة.
التحقق من النتيجة
تعرض قائمة مضيفي البروكسي الآن إدخالك مع شارة 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 Manager | Caddy | Traefik |
|---|---|---|---|
| الإعداد | واجهة ويب بصرية، لا حاجة لتعديل ملفات | 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.