العربية

إعداد وكيل عكسي Nginx على Linux VPS

2 min
استضافة VPS/VDS

يستقبل الوكيل العكسي الحركة العامة على المنفذين 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 بالخوادم الخلفية. اسمح بذلك مرة واحدة:

Bash
sudo 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):

Nginx
1server { 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 ثم تحقق وأعد التحميل:

Bash
sudo 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):

Nginx
map $http_upgrade $connection_upgrade { default upgrade; '' close; }

ثم في كتلة location:

Nginx
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;

⏱️ مهلات الانتظار وحجم الطلب

القيم الافتراضية 60 ثانية و1 ميغابايت. عدّلها لنقاط النهاية البطيئة أو عمليات الرفع:

Nginx
proxy_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 ويثبّت التجديد التلقائي. تحقق منه بالأمر:

Bash
sudo certbot renew --dry-run

🗂️ عدة تطبيقات على VPS واحد

أنشئ كتلة server لكل نطاق، ولكلٍّ server_name ومنفذ محلي خاص به:

Nginx
1server { 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/; })، وعندها تزيل الشرطة المائلة الأخيرة البادئة.

✅ الاختبار

Bash
curl -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 الخاص بك.

ابقَ على اطلاع بأحدث العروض والخصومات والعروض الترويجية الخاصة.

عرض العروض الترويجية

نستخدم ملفات تعريف الارتباط

نستخدم كوكيز تحليلية لتحسين تجربتك. لا نبيع البيانات لأطراف ثالثة. المزيد في سياسة الخصوصية.