Node.js + Nginx - что теперь? - PullRequest
       126

Node.js + Nginx - что теперь?

936 голосов
/ 15 февраля 2011

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

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

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

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

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

Ответы [ 11 ]

1247 голосов
/ 16 февраля 2011

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

Это то, что я сделал в своей коробке с Ubuntu:

Создать файл 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) также обрабатывал запросы веб-сокетов, добавьте следующие строки в раздел 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

Последнее замечание относительно запуска сервера узлов: вы должны использовать какую-то систему мониторинга для демона узла. Существует замечательное руководство по для узлов с upstart и monit .

157 голосов
/ 02 мая 2012

Вы также можете настроить несколько доменов с помощью nginx, перенаправляя их на несколько процессов node.js.

Например, для достижения этих целей:

/ 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/;
    }
}

В / 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/;
    }
}
53 голосов
/ 31 марта 2015

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

  • yourdomain.com / app1 / * -> для процесса Node.js, работающего локально http://127.0.0.1:3000
  • yourdomain.com / app2 / * -> для процесса Node.js работает локально http://127.0.0.1:4000

В / etc / nginx / sites-enabled / 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/');
31 голосов
/ 13 июля 2012

Я прокси-независимые приложения Node Express через Nginx.

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

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

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

С Node все усложняется, когда вам нужно переместить приложение с локального хоста в Интернет.

Единого подхода к развертыванию узла не существует.

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 static middleware.

Затем все остальные запросы перезаписываются и передаются в приложение Pet Project Node , поэтому приложению Node не нужно знать, где оно на самом деле смонтировано, и, следовательно, его можно переместить куда угодно только с помощью конфигурации.

proxy_redirect является обязательным условием для правильной обработки заголовка Location. Это чрезвычайно важно, если вы используете res.redirect () в своем приложении Node.

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

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

10 голосов
/ 17 марта 2014

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;
  }
}
8 голосов
/ 03 января 2012

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

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

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

7 голосов
/ 18 марта 2015

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

в основном приложение 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 на /etc/nginx/sites-available/ равна

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;
        }
}
5 голосов
/ 07 января 2017

Мы можем легко настроить приложение 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 или супервизором для обработки ситуаций / повторного использования сокетов или ресурсов и т. Д.

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

ПРИМЕЧАНИЕ. Можно настроить логику для обработки маршрутов запросов, специфичных для домена, создайте связующее ПО для приложения expressjs

5 голосов
/ 05 июля 2013

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

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

3 голосов
/ 27 сентября 2017

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, он возвращает файл myjs.jsв папке /my/static/files/path.Когда вы конфигурируете nginx для обслуживания статических файлов, он обрабатывает сам запрос.

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

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

Когда вы запускаете сервер node.js на порт 8000, nginx перенаправляет запрос на node.js.Напишите логику node.js и обработайте запрос.Вот и все, у вас есть сервер nodejs, работающий за сервером nginx.

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

...