it-swarm-ru.tech

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

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

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

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

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

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

926
Van Coding

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 .

1239
Joao Da Silva

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

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

  • domain1.com -> к процессу Node.js, работающему локально http://127.0.0.1:40
  • domain2.com -> к процессу Node.js, работающему локально http://127.0.0.1:50

/и т.д./Nginx/сайты с поддержкой/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/;
    }
}
155
250R

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

  • yourdomain.com/app1/* -> к процессу Node.js, работающему локально http://127.0.0.1:30
  • yourdomain.com/app2/* -> к процессу Node.js, работающему локально http://127.0.0.1:40

В /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/');
53
0x8BADF00D

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

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

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

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

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

Для развертывания Node нет единого подхода.

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

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

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

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

Во многих примерах в Интернете Node приложения запускаются на порту 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

31
skovalyov

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;
  }
}
10
aquadir

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

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

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

8
Hugo Mota

Я сделал репозиторий в 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;
        }
}
7
svnm

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

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

5
code ninja

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

ПРИМЕЧАНИЕ: вы можете настроить логику для обработки маршрутов запросов к конкретному домену, создать middleware для приложения expressjs

5
I Am Batman

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:80 . Служба, работающая на порте localhost 8000, получит запрос и вернет ответ на nginx, а nginx вернет ответ клиенту.

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

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

3
Vkreddy Komatireddy

Вы можете запустить nodejs, используя pm2, если вы хотите управлять каждым средством микросервиса и запускать его. Node будет работать в правом порту, просто настройте этот порт в 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.

Это лучше, и, как вы сказали, тоже проще

1
gokul kandasamy