node.js - simple - настройка node js nginx




Node.js+Nginx-Что теперь? (8)

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.

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

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

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

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

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


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) обрабатывал запросы 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

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


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

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


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

Наличие некоторых из них, обслуживаемых 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

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


У вас также могут быть разные 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/');

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

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

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

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





concept