Node.js+Nginx-ماذا الآن؟




concept (7)

لقد قمت بإعداد Node.js و Nginx على الخادم الخاص بي. الآن أريد استخدامه ، ولكن قبل أن أبدأ هناك سؤالان:

  1. كيف يجب أن يعملوا معًا؟ كيف يمكنني التعامل مع الطلبات؟
  2. هناك مفاهيم لمخدم Node.js ، أيهما أفضل:

    ا. قم بإنشاء خادم HTTP منفصل لكل موقع ويب يحتاج إليه. ثم قم بتحميل كافة تعليمات JavaScript البرمجية في بداية البرنامج ، بحيث يتم تفسير الشفرة مرة واحدة.

    ب. إنشاء خادم واحد Node.js الذي يعالج جميع طلبات Node.js. هذا يقرأ الملفات المطلوبة ويفسح محتوياتها. لذلك يتم تفسير الملفات على كل طلب ، ولكن منطق الخادم أكثر بساطة.

ليس من الواضح بالنسبة لي كيفية استخدام Node.js بشكل صحيح.


Node.js مع تكوين Nginx.

$ sudo nano /etc/nginx/sites-available/subdomain.your_domain.com

إضافة التكوين التالي بحيث تعمل Nginx بمثابة إعادة توجيه وكيل إلى حركة مرور 3000 المنفذ من الخادم عندما نأتي من "subdomain.your_domain.com"

upstream subdomain.your_domain.com {
  server 127.0.0.1:3000;
}
server {
  listen 80;
  listen [::]:80;
  server_name subdomain.your_domain.com;
  access_log /var/log/nginx/subdomain.your_domain.access.log;
  error_log /var/log/nginx/subdomain.your_domain.error.log debug;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://subdomain.your_domain.com;
    proxy_redirect off;
  }
}

أنا وكيل مستقل تطبيقات عقدة صريحة من خلال Nginx.

وبالتالي يمكن تركيب التطبيقات الجديدة بسهولة ويمكنني أيضًا تشغيل أشياء أخرى على نفس الخادم في مواقع مختلفة.

في ما يلي مزيد من التفاصيل حول إعدادي باستخدام مثال تهيئة Nginx:

نشر تطبيقات متعددة للعقدة على خادم ويب واحد في مجلدات فرعية مع Nginx

تصبح الأمور صعبة مع العقدة عندما تحتاج إلى نقل تطبيقك من localhost إلى الإنترنت.

لا يوجد نهج مشترك لنشر عقدة.

تستطيع Google العثور على الكثير من المقالات حول هذا الموضوع ، لكنني كنت أجد صعوبة في العثور على الحل المناسب للإعداد الذي أحتاجه.

في الأساس ، لدي خادم ويب وأريد أن يتم تركيب تطبيقات Node على المجلدات الفرعية (مثل http://myhost/demo/pet-project/ ) دون تقديم أي تبعية للتكوين إلى رمز التطبيق.

في الوقت نفسه ، أريد أن يتم تشغيل أشياء أخرى مثل المدونة على خادم الويب نفسه.

تبدو بسيطة هاه؟ على ما يبدو لا.

في العديد من الأمثلة على تطبيقات عقدة الويب إما على المنفذ 80 أو بروكسييد بواسطة Nginx إلى الجذر.

على الرغم من أن كلتا المقاربتين صالحة لبعض حالات الاستخدام ، إلا أنها لا تفي بالمعايير البسيطة البسيطة بعد.

ولهذا السبب قمت بإنشاء تهيئة Nginx الخاصة بي ، وهنا مقتطف:

upstream pet_project {
  server localhost:3000;
}

server {
  listen 80;
  listen [::]:80;
  server_name frontend;

  location /demo/pet-project {
    alias /opt/demo/pet-project/public/;
    try_files $uri $uri/ @pet-project;
  }

  location @pet-project {
    rewrite /demo/pet-project(.*) $1 break;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://pet_project;
    proxy_redirect http://pet_project/ /demo/pet-project/;
  }
}

من هذا المثال ، يمكنك ملاحظة أني أقوم بتشغيل تطبيق Pet Project Node الذي يعمل على المنفذ 3000 إلى http://myhost/demo/pet-project .

يتحقق Nginx الأول ما إذا كان المورد المطلوب هو ملف ثابت متاح في / opt / demo / pet-project / public / وإذا كان الأمر كذلك فهو يقدم خدمة ذات كفاءة عالية ، لذلك لا نحتاج إلى طبقة مكررة مثل Connect الوسيطة ثابتة.

ثم تتم الكتابة فوق جميع الطلبات الأخرى وتوصيلها إلى تطبيق Pet Project Node ، لذلك لا يحتاج تطبيق Node إلى معرفة مكان تثبيته بالفعل وبالتالي يمكن نقله في أي مكان بحتة بواسطة التكوين.

proxy_redirect هو أمر لا بد منه للتعامل مع رأس الموقع بشكل صحيح. هذا مهم للغاية إذا كنت تستخدم res.redirect () في تطبيق العقدة الخاصة بك.

يمكنك نسخ هذا الإعداد بسهولة لعدة تطبيقات عقدة تعمل على منافذ مختلفة وإضافة المزيد من معالجات المواقع لأغراض أخرى.

من: http://skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html


تعمل Nginx كخادم أمامي ، والذي في هذه الحالة يقوم بتوصيل الطلبات إلى خادم node.js. لذلك تحتاج إلى إعداد ملف تهيئة nginx للعقدة.

هذا ما فعلته في صندوق أوبونتو الخاص بي:

قم yourdomain.com ملف yourdomain.com على /etc/nginx/sites-available/ :

vim /etc/nginx/sites-available/yourdomain.com

في ذلك يجب أن يكون لديك شيء مثل:

# the IP(s) on which your node server is running. I chose port 3000.
upstream app_yourdomain {
    server 127.0.0.1:3000;
    keepalive 8;
}

# the nginx server instance
server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com www.yourdomain.com;
    access_log /var/log/nginx/yourdomain.com.log;

    # pass the request to the node.js server with the correct headers
    # and much more can be added, see nginx config options
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://app_yourdomain/;
      proxy_redirect off;
    }
 }

إذا كنت تريد nginx (> = 1.3.13) للتعامل مع طلبات websocket أيضًا ، أضف الأسطر التالية في location / القسم:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

بمجرد الحصول على هذا الإعداد ، يجب تمكين الموقع المحدد في ملف التكوين أعلاه:

cd /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com

أنشئ تطبيق خادم node في /var/www/yourdomain/app.js على localhost:3000

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

اختبار أخطاء الجملة:

nginx -t

إعادة تشغيل nginx:

sudo /etc/init.d/nginx restart

أخيرًا ، ابدأ خادم العقدة:

cd /var/www/yourdomain/ && node app.js

الآن سترى "Hello World" على yourdomain.com

ملاحظة أخيرة فيما يتعلق ببدء تشغيل خادم العقدة: يجب عليك استخدام نوع من نظام المراقبة لعمود العقدة. هناك برنامج تعليمي رائع على العقدة مع مغرور و monit .


لقد صنعت مستودعًا في Github يمكنك استنساخه ، vagrant-node-nginx-boilerplate

أساسا التطبيق node.js في /var/www/nodeapp هو

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(4570, '127.0.0.1');

console.log('Node Server running at 127.0.0.1:4570/');

و nginx config في /etc/nginx/sites-available/ is

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/nodeapp;
        index index.html index.htm;

        server_name localhost;

        location / {
          proxy_pass http://127.0.0.1:4570;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
}

يمكنك أيضًا إعداد نطاق متعدد باستخدام nginx ، مع إعادة التوجيه إلى عمليات node.js المتعددة.

على سبيل المثال لتحقيق هذه:

/ الخ / إنجن إكس / تمكين مواقع / DOMAIN1

server {
    listen 80;
    listen [::]:80;
    server_name domain1.com;
    access_log /var/log/nginx/domain1.access.log;
    location / {
        proxy_pass    http://127.0.0.1:4000/;
    }
}

في / etc / nginx / sites-enabled / domain2

server {
    listen 80;
    listen [::]:80;
    server_name domain2.com;
    access_log /var/log/nginx/domain2.access.log;
    location / {
        proxy_pass    http://127.0.0.1:5000/;
    }
}

يمكنك أيضًا استخدام node.js لإنشاء ملفات ثابتة في دليل يخدمها nginx. بالطبع ، يمكن تقديم بعض الأجزاء الديناميكية من موقعك بواسطة العقدة ، وبعضها عن طريق nginx (ثابت).

وجود بعض منهم خدم nginx يزيد من أدائك ..


يمكننا بسهولة إعداد تطبيق Nodejs بواسطة Nginx الذي يعمل كوكيل معكوس.
يفترض التهيئة التالية تشغيل تطبيق NodeJS على 127.0.0.1:8080 ،

  server{
     server_name domain.com sub.domain.com; # multiple domains

     location /{ 
      proxy_pass http://127.0.0.1:8080;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }

     location /static/{
       alias /absolute/path/to/static/files; # nginx will handle js/css
     }
   } 

في الإعداد أعلاه ، سيقوم تطبيق Nodejs الخاص بك ،

  • احصل على رأس HTTP_HOST حيث يمكنك تطبيق منطق النطاق المحدد لخدمة الاستجابة. '
  • يجب أن يدير التطبيق الخاص بك من قبل مدير عملية مثل pm2 أو المشرف على التعامل مع الحالات / إعادة استخدام مآخذ أو الموارد الخ

  • إعداد خدمة الإبلاغ عن الأخطاء للحصول على أخطاء في الإنتاج مثل sentry أو rollbar

ملاحظة: يمكنك إعداد المنطق لتسليم طرق طلب نطاق محدد ، وإنشاء وسيط للتطبيق expressjs





concept