البرمجة متوسط 11 دقيقة

كيفية إعداد Nginx كوسيط عكسي لتطبيق Node

تطبيق Node الخاص بك يعمل على المنفذ 3000. يجلس Nginx أمامه ليتولى إنهاء TLS وتقديم الملفات الثابتة بأقصى سرعة، مع إمكانية تشغيل عدة تطبيقات على خادم واحد — كلها على المنفذين القياسيين 80 و443. هذا الدليل يربط كل شيء معاً في نحو 15 دقيقة.

الخطوات

  1. 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. 2

    تثبيت Nginx

    ثبّت Nginx من المستودع الرسمي وتحقق من تشغيله بنجاح.

    bash
    sudo apt update
    sudo apt install -y nginx
    sudo systemctl enable nginx
    sudo systemctl start nginx
    
    # تأكد من أنه يعمل
    sudo systemctl status nginx
  3. 3

    إنشاء ملف إعداد server block

    ضع ملف إعداد جديداً في sites-available. استبدل example.com بنطاقك الفعلي (أو عنوان IP الخادم إن كنت تختبر بدون DNS).

    bash
    sudo nano /etc/nginx/sites-available/myapp.conf
  4. 4

    كتابة كتلة proxy_pass

    هذا هو الإعداد الأدنى العامل. أسطر proxy_set_header الأربعة ليست اختيارية — بدونها يرى تطبيقك 127.0.0.1 كعنوان IP لكل زائر ولن يتمكن من اكتشاف البروتوكول الأصلي.

    nginx
    server {
        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. 5

    إضافة ترويسات ترقية WebSocket

    إن كان تطبيقك يستخدم WebSockets (Socket.IO أو ws وغيرها)، أضف ترويستي Upgrade وConnection داخل كتلة location /. بدونهما يفشل الاتصال بصمت.

    nginx
        # داخل location / — أضف هذين السطرين مع باقي الترويسات
        proxy_set_header Upgrade    $http_upgrade;
        proxy_set_header Connection "upgrade";
  6. 6

    تفعيل الموقع واختبار الإعداد

    أنشئ رابطاً رمزياً للإعداد في sites-enabled، ثم دائماً شغّل nginx -t قبل إعادة التحميل. خطأ مطبعي واحد يمكن أن يوقف جميع المواقع على الخادم.

    bash
    sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/
    
    # اختبر — يجب أن يقول "syntax is ok"
    sudo nginx -t
    
    # أعد التحميل (بدون توقف — لا حاجة لإعادة تشغيل كاملة)
    sudo systemctl reload nginx
  7. 7

    إبقاء Node يعمل باستخدام pm2

    Nginx الآن خدمة نظام تصمد عند إعادة التشغيل. تطبيق Node يحتاج نفس المعاملة. pm2 هو الخيار الأبسط.

    bash
    npm install -g pm2
    
    # شغّل التطبيق
    pm2 start server.js --name myapp
    
    # أنشئ وفعّل سكريبت الإقلاع حتى يُعاد تشغيل pm2 مع الخادم
    pm2 startup
    # شغّل الأمر المطبوع، ثم:
    pm2 save
    
    # أوامر مفيدة
    pm2 status
    pm2 logs myapp
    pm2 restart myapp
  8. 8

    التحقق من عمل الوسيط

    مع تشغيل Node وإعادة تحميل Nginx، اختبر الخادم. يجب أن تأتي الاستجابة من Node رغم الاتصال على المنفذ 80.

    bash
    # من جهازك المحلي (استبدل بعنوان IP أو نطاق خادمك)
    curl -I http://example.com
    
    # متوقع: HTTP/1.1 200 OK (أو ما يُرجعه تطبيقك)
    # ترويسة "Server: nginx" تؤكد أن Nginx في السلسلة
  9. 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 مجانية — الدليل التالي يكمل من حيث انتهى هذا.

#Nginx #DevOps #Node.js
العودة إلى جميع الأدلة

هل تحتاج مساعدة في مشروعك؟

احجز استشارة مجانية لمدة 30 دقيقة لمناقشة تحدياتك التقنية واستكشاف الحلول معًا.