يستقبل الوكيل العكسي الحركة العامة على المنفذين 80 و443 ويمررها إلى تطبيقات تستمع محليًا فقط. يوفر HTTPS وعدة مواقع على عنوان IP واحد ونقطة واحدة للسجلات والقيود. يضبطه هذا الدليل على VPS Linux Infrawire لتطبيقات Node.js أو Python أو Docker.
📋 المتطلبات
- خادم Linux VPS (Ubuntu 24.04 / Debian 12 أو AlmaLinux 9 / Rocky 9) مع وصول SSH بصلاحية root. عنوان IP وكلمة مرور root في منطقة العميل.
- نطاق
example.comتشير سجلات A/AAAA فيه إلىVPS_IP. - تطبيق يستمع على منفذ محلي، مثل
127.0.0.1:3000.
📦 تثبيت Nginx
Bash# Debian / Ubuntu sudo apt update && sudo apt install -y nginx # AlmaLinux / Rocky sudo dnf install -y nginx sudo systemctl enable --now nginx
في AlmaLinux/Rocky يمنع SELinux افتراضيًا اتصال Nginx بالخوادم الخلفية. اسمح بذلك مرة واحدة:
Bashsudo setsebool -P httpd_can_network_connect 1
🚀 أول تطبيق خلف الوكيل
يجب أن يستمع تطبيقك على 127.0.0.1 لا على 0.0.0.0، كي لا يكون متاحًا إلا عبر Nginx. أيًّا كانت اللغة فالنمط واحد: node server.js على المنفذ 3000، أو gunicorn -b 127.0.0.1:8000 app:app لبايثون، أو حاوية منشورة بالأمر docker run -d -p 127.0.0.1:3000:80 IMAGE.
أنشئ الملف /etc/nginx/sites-available/example.com (في AlmaLinux/Rocky استخدم /etc/nginx/conf.d/example.com.conf):
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com; 5 6 location / { 7 proxy_pass http://127.0.0.1:3000; 8 proxy_http_version 1.1; 9 proxy_set_header Host $host; 10 proxy_set_header X-Real-IP $remote_addr; 11 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 proxy_set_header X-Forwarded-Proto $scheme; 13 } 14}
فعّله في Debian/Ubuntu ثم تحقق وأعد التحميل:
Bashsudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx
تتيح ترويسات X-Forwarded-* للتطبيق معرفة عنوان IP الحقيقي للعميل وما إذا استخدم الزائر HTTPS. بدونها لا يرى تطبيقك سوى 127.0.0.1 وقد يولّد روابط http://. وتحتاج أطر كثيرة إلى إعداد صريح للوثوق بالوكيل (مثل app.set('trust proxy', 1) في Express).
🔌 دعم WebSocket
يحتاج WebSocket إلى ترويسات ترقية HTTP. أضف map في أعلى سياق http (مثلًا في /etc/nginx/conf.d/websocket.conf):
Nginxmap $http_upgrade $connection_upgrade { default upgrade; '' close; }
ثم في كتلة location:
Nginxproxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;
⏱️ مهلات الانتظار وحجم الطلب
القيم الافتراضية 60 ثانية و1 ميغابايت. عدّلها لنقاط النهاية البطيئة أو عمليات الرفع:
Nginxproxy_connect_timeout 5s; proxy_read_timeout 120s; proxy_send_timeout 120s; client_max_body_size 50m;
لاتصال WebSocket طويل الأمد ارفع proxy_read_timeout (مثل 3600s) أو اجعل التطبيق يرسل ping.
🔒 HTTPS مع Certbot
افتح أولًا المنفذين 80 و443 في جدار الحماية، ثم:
Bash# Debian / Ubuntu sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d example.com
في AlmaLinux/Rocky ثبّت Certbot بالأمر sudo dnf install -y epel-release ثم sudo dnf install -y certbot python3-certbot-nginx. يضيف Certbot الشهادة إلى كتلة server ويعرض إعادة التوجيه من HTTP إلى HTTPS ويثبّت التجديد التلقائي. تحقق منه بالأمر:
Bashsudo certbot renew --dry-run
🗂️ عدة تطبيقات على VPS واحد
أنشئ كتلة server لكل نطاق، ولكلٍّ server_name ومنفذ محلي خاص به:
Nginx1server { 2 listen 80; 3 server_name app1.example.com; 4 location / { proxy_pass http://127.0.0.1:3000; } 5} 6 7server { 8 listen 80; 9 server_name app2.example.com; 10 location / { proxy_pass http://127.0.0.1:8000; } 11}
كرّر ترويسات الوكيل في كل كتلة، ثم شغّل Certbot مع -d app1.example.com -d app2.example.com. ويمكنك أيضًا التقسيم بحسب المسار (location /api/ { proxy_pass http://127.0.0.1:8000/; })، وعندها تزيل الشرطة المائلة الأخيرة البادئة.
✅ الاختبار
Bashcurl -I https://example.com ss -ltnp | grep -E ':(80|443|3000)' sudo tail -f /var/log/nginx/error.log
يجب أن يكون منفذ الخادم الخلفي مرتبطًا بـ 127.0.0.1 فقط، بينما يستمع Nginx على 80 و443.
🛠️ استكشاف الأخطاء
502 Bad Gateway. التطبيق متوقف أو على منفذ آخر. افحص بالأمر ss -ltnp ثم شغّله. في AlmaLinux/Rocky يعني ظهور Permission denied في سجل الأخطاء أن قيمة SELinux أعلاه مفقودة.
504 Gateway Timeout. يستغرق الخادم الخلفي أكثر من proxy_read_timeout. ارفع القيمة أو حسّن نقطة النهاية.
انقطاع WebSocket أو فشله بالرمز 400/426. ترويستا Upgrade وConnection مفقودتان، أو لا يوجد proxy_http_version 1.1;.
عنوان IP خاطئ للعميل في السجلات. تُرسل X-Forwarded-For لكن تطبيقك لا يثق بالوكيل. فعّل إعداد الثقة في إطار العمل الخاص بك.
🎉 تعمل تطبيقاتك الآن خلف Nginx مع HTTPS وترويسات سليمة ومساحة لأي عدد من المواقع يتحمله VPS الخاص بك.