الخطوات
-
1
فهم سبب الحاجة إلى وسيط عكسي
تشغيل
node server.jsمباشرة على المنفذ 80 يتطلب صلاحيات root — وهذا أمر غير آمن. الوسيط العكسي يحل أربع مشاكل دفعة واحدة:- إنهاء TLS — يتولى Nginx معالجة HTTPS؛ تطبيقك لا يرى سوى HTTP عادي داخلياً
- تخزين الملفات الثابتة مؤقتاً — يقدم Nginx ملفات
/publicدون المرور بـ Node - عدة تطبيقات على خادم واحد —
api.example.comيذهب للمنفذ 3001، وapp.example.comللمنفذ 3000 - إخفاء أرقام المنافذ من الروابط — المستخدم يرى
https://example.comلاhttp://example.com:3000
-
2
تثبيت Nginx
ثبّت Nginx من المستودع الرسمي وتحقق من تشغيله بنجاح.
bashsudo apt update sudo apt install -y nginx sudo systemctl enable nginx sudo systemctl start nginx # تأكد من أنه يعمل sudo systemctl status nginx -
3
إنشاء ملف إعداد server block
ضع ملف إعداد جديداً في
sites-available. استبدلexample.comبنطاقك الفعلي (أو عنوان IP الخادم إن كنت تختبر بدون DNS).bashsudo nano /etc/nginx/sites-available/myapp.conf -
4
كتابة كتلة proxy_pass
هذا هو الإعداد الأدنى العامل. أسطر
proxy_set_headerالأربعة ليست اختيارية — بدونها يرى تطبيقك127.0.0.1كعنوان IP لكل زائر ولن يتمكن من اكتشاف البروتوكول الأصلي.nginxserver { listen 80; server_name example.com www.example.com; 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; } } -
5
إضافة ترويسات ترقية WebSocket
إن كان تطبيقك يستخدم WebSockets (Socket.IO أو ws وغيرها)، أضف ترويستي
UpgradeوConnectionداخل كتلةlocation /. بدونهما يفشل الاتصال بصمت.nginx# داخل location / — أضف هذين السطرين مع باقي الترويسات proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; -
6
تفعيل الموقع واختبار الإعداد
أنشئ رابطاً رمزياً للإعداد في
sites-enabled، ثم دائماً شغّلnginx -tقبل إعادة التحميل. خطأ مطبعي واحد يمكن أن يوقف جميع المواقع على الخادم.bashsudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/ # اختبر — يجب أن يقول "syntax is ok" sudo nginx -t # أعد التحميل (بدون توقف — لا حاجة لإعادة تشغيل كاملة) sudo systemctl reload nginx -
7
إبقاء Node يعمل باستخدام pm2
Nginx الآن خدمة نظام تصمد عند إعادة التشغيل. تطبيق Node يحتاج نفس المعاملة.
pm2هو الخيار الأبسط.bashnpm install -g pm2 # شغّل التطبيق pm2 start server.js --name myapp # أنشئ وفعّل سكريبت الإقلاع حتى يُعاد تشغيل pm2 مع الخادم pm2 startup # شغّل الأمر المطبوع، ثم: pm2 save # أوامر مفيدة pm2 status pm2 logs myapp pm2 restart myapp -
8
التحقق من عمل الوسيط
مع تشغيل Node وإعادة تحميل Nginx، اختبر الخادم. يجب أن تأتي الاستجابة من Node رغم الاتصال على المنفذ 80.
bash# من جهازك المحلي (استبدل بعنوان IP أو نطاق خادمك) curl -I http://example.com # متوقع: HTTP/1.1 200 OK (أو ما يُرجعه تطبيقك) # ترويسة "Server: nginx" تؤكد أن Nginx في السلسلة -
9
الخطوة التالية — إضافة HTTPS مجاناً عبر Certbot
بمجرد أن يعمل المنفذ 80، إضافة SSL تحتاج أمراً واحداً. Certbot سيعدّل إعدادات Nginx تلقائياً ويضبط التجديد التلقائي. راجع الدليل التالي: كيفية الحصول على شهادة SSL مجانية باستخدام Let's Encrypt.
bash# معاينة فقط — الخطوات الكاملة في الدليل التالي sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d example.com -d www.example.com
نصائح ومحاذير
- شغّل دائماً <code>sudo nginx -t</code> قبل إعادة التحميل. ملف إعداد معطوب يوقف كل المواقع على الخادم.
- استخدم كتل <code>upstream</code> عند موازنة الحمل على عدة عمليات Node: <code>upstream myapp { server 127.0.0.1:3000; server 127.0.0.1:3001; }</code>
- عيّن <code>proxy_read_timeout 300;</code> للطلبات التي تستغرق وقتاً طويلاً (رفع الملفات، نقاط AI). المهلة الافتراضية 60 ثانية ستنتهي بها.
- أضف <code>client_max_body_size 20M;</code> إن كان تطبيقك يقبل رفع الملفات — الحد الافتراضي لـ Nginx (1 MB) سيرفضها بصمت.
- احذف موقع Nginx الافتراضي: <code>sudo rm /etc/nginx/sites-enabled/default</code> — قد يحجب إعداداتك.
خاتمة
Nginx الآن يعترض كل الحركة على المنفذ 80 ويُحيلها إلى تطبيق Node. تطبيقك معزول عن الإنترنت، محمي خلف مدير العمليات، وجاهز لـ HTTPS. الخطوة التالية المنطقية هي تشغيل Certbot للحصول على شهادة TLS مجانية — الدليل التالي يكمل من حيث انتهى هذا.