الوكيل العكسي: تطبيقات متعددة على عنوان واحد
كيف تتشارك عدة تطبيقات عنوان VDS عامًا واحدًا عبر النطاقات والمسارات، وتمرّر الترويسات بشكل صحيح، ولا تكسر WebSocket.
آخر تحديث 23 أغسطس 2026
يحتوي الخادم عادةً على عنوان IPv4 عام واحد، لكنه يشغّل عدة تطبيقات. يستقبل الوكيل العكسي جميع الطلبات على المنفذين 80 و443 ويوجّهها إلى الخدمات الداخلية حسب اسم النطاق أو المسار. كما يحتفظ بالشهادة الوحيدة والسجلات المشتركة.
التخطيط
يستمع كل تطبيق إلى منفذه المحلي الخاص وعلى 127.0.0.1 فقط:
- موقع الواجهة الأمامية —
127.0.0.1:3000؛ - واجهة API —
127.0.0.1:8000؛ - لوحة المراقبة —
127.0.0.1:9090.
لا يُكشف للخارج سوى Nginx. للتحقق من أن تطبيقًا ما غير مكشوف مباشرةً:
ss -tulpn | grep LISTEN
تعني أسطر مثل 0.0.0.0:3000 أن الخدمة يمكن الوصول إليها من الإنترنت، متجاوزةً الوكيل وبدون تشفير.
حسب النطاق
server {
listen 80;
server_name app.example.ru;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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 api.example.ru;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
بدون X-Forwarded-For، يرى التطبيق كل طلب قادمًا من 127.0.0.1، وتتوقف أي قيود تعتمد على عنوان IP عن العمل.
حسب المسار
location /api/ {
proxy_pass http://127.0.0.1:8000/;
}
الشرطة المائلة في نهاية proxy_pass مهمة هنا: معها تُزال البادئة /api ويستقبل التطبيق /users؛ وبدونها يستقبل /api/users. نصف حالات «404 الغامضة» على الوكيل تأتي من هذا بالضبط.
WebSocket والاستجابات الطويلة
location /ws/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
}
بدون زوج Upgrade/Connection ينقطع الاتصال مباشرةً بعد المصافحة؛ وبدون زيادة المهلة ينقطع بعد دقيقة من الصمت.
الأخطاء الشائعة
| العَرَض | السبب |
|---|---|
502 Bad Gateway | التطبيق لا يعمل أو يستمع إلى منفذ مختلف |
504 Gateway Time-out | يستغرق التطبيق وقتًا أطول للاستجابة من proxy_read_timeout |
| إعادة توجيه لا نهائية | التطبيق لا يعرف بـ HTTPS — مرّر X-Forwarded-Proto |
| تعطّل رفع الملفات | client_max_body_size صغير جدًا؛ القيمة الافتراضية 1 MB |
| ظهور عنوان IP نفسه في سجلات التطبيق | لم يُمرَّر X-Forwarded-For |
التالي: مواقع متعددة، الشهادة، Caddy مع HTTPS تلقائي.
شهادة واحدة على الوكيل تغطي جميع التطبيقات خلفه. لا تحتاج الاتصالات الداخلية عبر
127.0.0.1إلى تشفير — فهي لا تغادر الخادم أبدًا.