Узел.js + Nginx-что теперь?

Я настроил узел.js и Nginx на моем сервере. Теперь я хочу использовать его, но, прежде чем я начну есть 2 вопроса:

  1. как они должны работать вместе? Как я должен обрабатывать запросы?
  2. существует 2 понятия для узла.JS сервер, который лучше:

    a. Создайте отдельный HTTP-сервер для каждого веб-сайта, который в нем нуждается. Затем загрузите весь код JavaScript в начале программы, чтобы код интерпретировался один раз.

    b. Создайте один узел.JS-сервер, который обрабатывает все узлы.Яш запросы. Это считывает запрошенные файлы и оценивает их содержимое. Таким образом, файлы интерпретируются по каждому запросу, но логика сервера намного проще.

Мне непонятно, как использовать Node.Яш правильно.

11 ответов


Nginx работает как сервер переднего плана, который в этом случае прокси запросы к узлу.сервер js. Поэтому вам нужно настроить файл конфигурации nginx для node.

это то, что я сделал в моем Ubuntu box:

создать файл yourdomain.com at /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

создайте приложение сервера узлов в /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.


вы также можете настроить несколько доменов с nginx, переадресация на несколько узлов.процессы js.

например, чтобы достичь этих:

  • domain1.com - > к узлу.Яш процесс выполняется локально http://127.0.0.1:4000
  • domain2.com - > к узлу.Яш процесс выполняется локально http://127.0.0.1:5000

/ etc/nginx/sites-enabled / 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/;
    }
}

In / etc/nginx/сайты-включено / 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/;
    }
}

вы также можете использовать разные URL-адреса для приложений в одной конфигурации сервера:

  • yourdomain.com/app1/* - > к узлу.локальный процесс js http://127.0.0.1:3000
  • yourdomain.com/app2/* - > к узлу.процесс Яш работает локально http://127.0.0.1:4000

на / etc/nginx/сайты-включено / yourdomain:

server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;

    location ^~ /app1/{
        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://127.0.0.1:3000/;
    }

    location ^~ /app2/{
        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://127.0.0.1:4000/;
    }
}

перезапустите nginx:

sudo service nginx restart

начиная приложения.

узел приложения app1.js

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

узел приложения app2.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app2!\n');
}).listen(4000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:4000/');

I прокси-независимый узел Экспресс-приложений через Nginx.

таким образом, новые приложения могут быть легко установлены, и я могу запускать другие вещи на одном сервере в разных местах.

вот более подробная информация о моей настройке с примером конфигурации Nginx:

развертывание нескольких приложений узлов на одном веб-сервере в подпапках с помощью Nginx

вещи становятся сложными с узлом, когда вам нужно переместить ваш приложение из localhost в интернет.

нет общего подхода для развертывания узла.

Google может найти тонны статей по этой теме, но я изо всех сил пытался найти правильное решение для настройки мне нужно.

в основном, у меня есть веб-сервер, и я хочу, чтобы приложения узла были смонтированы во вложенные папки (т. е. http://myhost/demo/pet-project/) без введения какой-либо зависимости конфигурации для приложения код.

в то же время я хочу, чтобы другие вещи, такие как блог, запускались на том же веб-сервере.

звучит просто, да? Очевидно, нет.

во многих примерах на веб-узле приложения либо выполняются на порту 80, либо проксируются Nginx в корень.

хотя оба подхода действительны для определенных случаев использования, они не соответствуют моим простым, но немного экзотическим критериям.

вот почему я создал свою собственную конфигурацию Nginx и вот выдержка:--2-->

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(.*)  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, работающее на порту 3000 до http://myhost/demo/pet-project.

сначала Nginx проверяет, является ли запрашиваемый ресурс статическим файлом, доступным в / opt / demo / pet-project / public/ и если это так, то это очень эффективно, поэтому нам не нужно иметь избыточный слой, такой как Connect static middleware.

затем все остальные запросы перезаписываются и проксируются в Узел Проекта Pet application, поэтому приложению узла не нужно знать, где оно фактически установлено и, таким образом, может быть перемещено в любом месте чисто конфигурацией.

proxy_redirect - это необходимо для правильной обработки заголовка location. Это чрезвычайно важно, если вы используете РЭС.перенаправление() в приложения узла.

вы можете легко реплицировать эту настройку для нескольких приложений узлов, работающих на разных портах, и добавьте больше обработчиков местоположения для других целей.

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


узел.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;
  }
}

отвечая на ваш вопрос 2:

Я бы использовал опцию b просто потому, что он потребляет гораздо меньше ресурсов. с опцией " a " каждый клиент заставит сервер потреблять много памяти, загружая все необходимые файлы (хотя мне нравится php, это одна из проблем с ним). С опцией " b " вы можете загружать свои библиотеки (многоразовый код) и делиться ими между всеми запросами клиентов.

но будьте осторожны, что если у вас несколько ядер, вы должны настроить узел.js для использования все они.


вы также можете использовать node.js для генерации статических файлов в каталог, обслуживаемый nginx. Конечно, некоторые динамические части вашего сайта могут обслуживаться узлом, а некоторые-nginx (static).

наличие некоторых из них, обслуживаемых nginx, повышает производительность..


Я сделал репозиторий в Github, который вы можете клонировать,vagrant-node-nginx-boilerplate

в основном узле.приложение 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 в /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;
        }
}

мы можем легко настроить приложение 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 приложение,

  • get HTTP_HOST заголовок, в котором вы можете применить логику домена для обслуживания ответа. '
  • ваше приложение должно управляться менеджером процессов, таким как pm2 или руководитель для обработки ситуации / повторное использование сокетов или ресурсов и т. д.

  • настройка службы отчетов об ошибках для получения производственных ошибок, таких как постовой или rollbar

Примечание: Вы можете настроить логику для передачи определенных маршрутов запросов домена, создать промежуточное для приложения expressjs


Nginx может выступать в качестве обратного прокси-сервера, который работает так же, как менеджер проекта. Когда он получает запрос, он анализирует его и пересылает запрос вверх по течению(членам проекта) или обрабатывает сам. Nginx имеет два способа обработки запроса на основе того, как он настроен.

  • выполнить запрос
  • переслать запрос на другой сервер

    server{
     server_name mydomain.com sub.mydomain.com;
    
     location /{ 
      proxy_pass http://127.0.0.1:8000;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }
    
     location /static/{
       alias /my/static/files/path;
     }
    

    }

сервер запрос

С этой конфигурацией, когда url-адрес запроса mydomain.com/static/myjs.js возвращает в . При настройке Nginx служить статические файлы он обрабатывает запрос.

переслать запрос на другой сервер

когда url-адрес запроса mydomain.com/dothis nginx не передает запрос http://127.0.0.1:8000. Служба, которая работает на порт localhost 8000 получит запрос и вернет ответ в nginx и nginx возвращает ответ клиенту.

при запуске узла.JS-сервер на порту 8000 nginx перешлет запрос на узел.js. Узел записи.логика js и обработка запроса. Вот и все, что у вас есть сервер nodejs, работающий за сервером nginx.

если вы хотите запустить любые другие службы, кроме nodejs, просто запустите другую службу, такую как Django, flask, php на разных порты и настройте его в nginx.


Вы можете запустить nodejs с использованием РМ2 если вы хотите управлять каждой конструирование средств и запустить его. Узел будет работать в правом порту, просто настройте этот порт в nginx (/etc/nginx/sites-enabled/domain.com)

server{
    listen 80;
    server_name domain.com www.domain.com;

  location / {
     return 403;
  }
    location /url {
        proxy_pass http://localhost:51967/info;
    }
}

проверьте, работает ли localhost или нет, используя ping.

и

Create one single Node.js server which handles all Node.js requests. This reads the requested files and evals their contents. So the files are interpreted on each request, but the server logic is much simpler.

это лучше и, как вы сказали, легче тоже