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



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




  1. как они должны работать вместе? Как я должен обрабатывать запросы?


  2. есть 2 понятия для узла.JS сервер, который лучше:



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



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




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

594   11  

11 ответов:

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

это то, что я сделал в моем 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, перенаправляя их на несколько узлов.Яш процессов.

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

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

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

  • yourdomain.com/app1/* - > к узлу.Яш процесс выполняется локально http://127.0.0.1:3000
  • yourdomain.com/app2/* - > к узлу.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/');

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

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

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

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

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

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

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

в принципе, у меня есть веб-сервер, и я хочу, чтобы приложения узла были подключены к подпапкам (т. е. 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(.*)  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.

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

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, чтобы использовать все они.

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

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

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

в основном узле.js app at /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;
        }
}

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

Примечание: Вы можете настроить логику для передачи конкретных маршрутов запросов домена, создать middleware для приложения 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;
     }
    

    }

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

С этой конфигурацией, когда url-адрес запроса mydomain.com/static/myjs.js возвращает myjs.js file in . Когда вы настраиваете 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.

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

Comments

    Ничего не найдено.