Node.js + Nginx - Що зараз?


1003

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

  1. Як вони повинні працювати разом? Як я повинен обробляти запити?
  2. Існує 2 концепції для сервера Node.js, яке краще:

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

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

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

Відповіді:


1306

Nginx працює як сервер переднього кінця, який у цьому випадку наближає запити до сервера node.js. Тому вам потрібно встановити файл nginx config для вузла.

Це те, що я зробив у своєму вікні 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

Останнє зауваження щодо запуску сервера вузлів: ви повинні використовувати якусь систему моніторингу для демона вузла. Існує дивовижний підручник з вузла з початком і монітом .


11
Дякуємо за публікацію, nginx кеш node.js відповіді для вищевказаного сервера або щоразу повторювати їх.
Лайм

79
Чи є якась причина, чому ви не можете просто зробити це location / { proxy_pass http://127.0.0.1:3000; }? Навіщо потрібен цілий upstreamбіт конфігурації?
Робін Уінслоу

20
+1, Дуже відверта та проста відповідь на поширене запитання; відмінно підходить для людей, які хочуть налаштувати віртуальних хостів за допомогою вузла та nginx. Єдине, що я думаю, що ви пропустили, - це якісна відповідь на те, чому nginx в передній частині вузла найкраще для обслуговування декількох vhosts (друге питання запитувача).
Пол д'Ауст

34
@Robin Winslow, якщо ви хочете додати більше серверів для серверів для збалансування навантаження.
Жоао Да Сілва

76
Слід зазначити , що це (дуже корисно) відповідь відноситься до одного аромату Nginx , що, за замовчуванням, поставляється з sites-enabledі sites-availableкаталогів всередині /etc/nginx. Якщо ваша версія вийшла без цих двох каталогів, вона, швидше за все, має один conf.dкаталог. У такому випадку, дотримуючись цих інструкцій, це не матиме жодного ефекту, БІЛЬШЕ ви модифікуєте includeоператор у файлі, nginx.confщоб він вказував sites-enabledзамість типового conf.d. Сподіваюся, що це має сенс. Це має стати зрозумілим, коли ви побачите згадане includeтвердження всередині nginx.conf.
meetamit

167

Ви також можете налаштувати кілька доменів за допомогою nginx, переадресувавшись на декілька процесів node.js.

Наприклад, щоб досягти цього:

Ці порти (4000 та 5000) слід використовувати для прослуховування запитів програми у коді додатка.

/ і т.д. / 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 / включених сайтів / 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/;
    }
}

5
Я використовую свій метод proxy_pass, але з якоїсь - то причини http://example.comстає автоматично 302«цифро http://www.example.com. Чому так?
Крістіан

У вас є Cloudflare чи щось подібне? Наведена вище конфігурація взагалі не повинна переспрямовуватися.
ozzieisaacs

1
@Kristian Вам потрібно буде додати, proxy_set_header Host $hostщоб уникнути перенаправлення HTTP 302.
Іван Шацький

@IvanShatsky - Чи можете ви надати будь-яку допомогу, як налаштувати кілька портів з декількома піддоменами та не допустити інших портів, що працюють в іншому домені?
Nginx

59

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

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

У / 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/');

3
Версія спільноти з відкритим кодом безкоштовна, але у них є версія з іншими функціями, які не є безкоштовними. nginx.com/products/feature-matrix
0x8BADF00D

Вибачте за моє незнання. Яка мета, переваги такої служби? чи є у вас приклад чи випадок використання? Заздалегідь спасибі.
Мауро Агілар

2
@MauroAguilar Якщо вам потрібні 2 додатки node.js на одному сервері, ви можете їх обслуговувати, використовуючи запропонований спосіб (використовуючи різні порти). У моїх випадках це були два різні тестові програми.
0x8BADF00D

Гаразд, але яка різниця між запуском двох додатків та одним? Я маю на увазі, які вигоди, якщо вони були призначені з тією ж метою?
Мауро Агілар

2
@MauroAguilar, ви можете запустити їх в одному, і немає користі, якщо це може бути частиною одного проекту і має ту саму мету. Але якщо вам потрібно запустити 2 різні проекти з різною метою та з різною конфігурацією на одному сервері, то ви можете скористатися цією конфігурацією.
0x8BADF00D

35

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

Таким чином, нові програми можна легко монтувати, і я також можу запускати інші речі на одному сервері в різних місцях.

Ось докладніші відомості про моє налаштування із прикладом конфігурації Nginx:

Розгортайте кілька додатків Node на одному веб-сервері в папках з Nginx

З Node все стає складніше, коли вам потрібно перенести свою програму з localhost в Інтернет.

Не існує загального підходу до розгортання вузла.

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 статичне проміжне програмне забезпечення.

Тоді всі інші запити перезаписуються та передаються на додаток Pet Project Node , тому додатку Node не потрібно знати, де він фактично встановлений, і таким чином можна переміщувати будь-куди виключно за конфігурацією.

proxy_redirect - це обов'язковий спосіб, щоб правильно обробляти заголовок Location. Це надзвичайно важливо, якщо ви використовуєте res.redirect () у своїй програмі Node.

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

Від: http://skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html


1
Чому і як це потрібно робити замість субдоменів: skovalyov.blogspot.dk/2012/10/…
skovalyov

Відповідь лише на посилання… Чи можете ви, будь ласка, узагальнити відповідні частини у своїй відповіді, якщо ваш блог не залишився?
кайзер

11

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

9

відповівши на ваше запитання 2:

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

Але майте на увазі, що якщо у вас є кілька ядер, вам слід налаштувати node.js, щоб використовувати їх усі.


2
Дотримуйтесь цієї поради, якщо ресурси є вашим найважливішим питанням (навряд чи). Між (a) і (b) існують різні компроміси. Варіант (a), мабуть, кращий, якщо ви хочете, щоб сайти були більш незалежними, наприклад, перезавантаження або обслуговування сайтів, db-з'єднання, база коду, залежність бібліотеки, переміщення сайтів між серверами тощо
robocat

8

Я зробив сховище в Github, яке можна клонувати, vagrant-node-nginx-kotplate

в основному node.js додатки на /var/www/nodeappIS

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

5

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

Наявність деяких з них, які обслуговує nginx, підвищує вашу ефективність ..


5

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

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

ПРИМІТКА. Ви можете налаштувати логіку передачі маршрутів запитів, пов’язаних із доменом, створити проміжне програмне забезпечення для програми expressjs


1
Ще одна причина використання pm2 - це те, що ви можете запустити додаток "назавжди" після виходу з оболонки та автоматично запустити його, якщо вам коли-небудь доведеться перезавантажити сервер, див .: pm2.keymetrics.io/docs/usage/startup
SeanQuinn781

3

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

    }

Сервер запиту

При такій конфігурації, коли це запит, mydomain.com/static/myjs.jsвін повертає myjs.jsфайл у /my/static/files/pathпапку. Коли ви налаштовуєте nginx для обслуговування статичних файлів, він обробляє сам запит.

переслати запит на інший сервер

Коли URL-адреса запиту mydomain.com/dothisnginx пересилає запит на 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.


1

Ви можете запустити 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;
    }
}

Перевірте, чи працює локальний хост чи ні, використовуючи 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

Найкраща та простіша настройка за допомогою Nginx і Nodejs - це використовувати Nginx як балансир завантаження HTTP і TCP з включеним проксі_протоколом. У цьому контексті Nginx зможе проксі-сервер вхідних запитів до nodejs, а також припинити з'єднання SSL до сервера (-ів) заходу, а не до самого проксі-сервера. (SSL-PassThrough)

На мою думку, не має сенсу наводити приклади, що не стосуються SSL, оскільки всі веб-додатки (або повинні бути) використовують захищені середовища.

Приклад конфігурації для проксі-сервера в /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
  upstream webserver-http {
    server 192.168.1.4; #use a host port instead if using docker
    server 192.168.1.5; #use a host port instead if using docker
  }
  upstream nodejs-http {
    server 192.168.1.4:8080; #nodejs listening port
    server 192.168.1.5:8080; #nodejs listening port
  }
  server {
    server_name example.com;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header Connection "";
      add_header       X-Upstream $upstream_addr;
      proxy_redirect     off;
      proxy_connect_timeout  300;
      proxy_http_version 1.1;
      proxy_buffers 16 16k;
      proxy_buffer_size 16k;
      proxy_cache_background_update on;
      proxy_pass http://webserver-http$request_uri;
    }
  }
  server {
    server_name node.example.com;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      add_header       X-Upstream $upstream_addr;
      proxy_redirect     off;
      proxy_connect_timeout  300;
      proxy_http_version 1.1;
      proxy_buffers 16 16k;
      proxy_buffer_size 16k;
      proxy_cache_background_update on;
      proxy_pass http://nodejs-http$request_uri;
    }
  }
}
stream {
  upstream webserver-https {
    server 192.168.1.4:443; #use a host port instead if using docker
    server 192.168.1.5:443; #use a host port instead if using docker
  }

  server {
    proxy_protocol on;
    tcp_nodelay on;
    listen 443;
    proxy_pass webserver-https;
  }
  log_format proxy 'Protocol: $protocol - $status $bytes_sent $bytes_received $session_time';
  access_log  /var/log/nginx/access.log proxy;
  error_log /var/log/nginx/error.log debug;
}

Тепер давайте обробляємо сервер сервера. /etc/nginx/nginx.conf :

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
load_module /etc/nginx/modules/ngx_http_geoip2_module.so; # GeoIP2
events {
    worker_connections  1024;
}
http {
    variables_hash_bucket_size 64;
    variables_hash_max_size 2048;
    server_tokens off;
    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;
    autoindex off;
    keepalive_timeout  30;
    types_hash_bucket_size 256;
    client_max_body_size 100m;
    server_names_hash_bucket_size 256;
    include         mime.types;
    default_type    application/octet-stream;
    index  index.php index.html index.htm;
    # GeoIP2
    log_format  main    'Proxy Protocol Address: [$proxy_protocol_addr] '
                        '"$request" $remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    # GeoIP2
    log_format  main_geo    'Original Client Address: [$realip_remote_addr]- Proxy Protocol Address: [$proxy_protocol_addr] '
                            'Proxy Protocol Server Address:$proxy_protocol_server_addr - '
                            '"$request" $remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '$geoip2_data_country_iso $geoip2_data_country_name';

    access_log  /var/log/nginx/access.log  main_geo; # GeoIP2
#===================== GEOIP2 =====================#
    geoip2 /usr/share/geoip/GeoLite2-Country.mmdb {
        $geoip2_metadata_country_build  metadata build_epoch;
        $geoip2_data_country_geonameid  country geoname_id;
        $geoip2_data_country_iso        country iso_code;
        $geoip2_data_country_name       country names en;
        $geoip2_data_country_is_eu      country is_in_european_union;
    }
    #geoip2 /usr/share/geoip/GeoLite2-City.mmdb {
    #   $geoip2_data_city_name city names en;
    #   $geoip2_data_city_geonameid city geoname_id;
    #   $geoip2_data_continent_code continent code;
    #   $geoip2_data_continent_geonameid continent geoname_id;
    #   $geoip2_data_continent_name continent names en;
    #   $geoip2_data_location_accuracyradius location accuracy_radius;
    #   $geoip2_data_location_latitude location latitude;
    #   $geoip2_data_location_longitude location longitude;
    #   $geoip2_data_location_metrocode location metro_code;
    #   $geoip2_data_location_timezone location time_zone;
    #   $geoip2_data_postal_code postal code;
    #   $geoip2_data_rcountry_geonameid registered_country geoname_id;
    #   $geoip2_data_rcountry_iso registered_country iso_code;
    #   $geoip2_data_rcountry_name registered_country names en;
    #   $geoip2_data_rcountry_is_eu registered_country is_in_european_union;
    #   $geoip2_data_region_geonameid subdivisions 0 geoname_id;
    #   $geoip2_data_region_iso subdivisions 0 iso_code;
    #   $geoip2_data_region_name subdivisions 0 names en;
   #}

#=================Basic Compression=================#
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/css text/xml text/plain application/javascript image/jpeg image/png image/gif image/x-icon image/svg+xml image/webp application/font-woff application/json application/vnd.ms-fontobject application/vnd.ms-powerpoint;
    gzip_static on;

    include /etc/nginx/sites-enabled/example.com-https.conf;
}

Тепер давайте налаштуємо віртуальний хост за допомогою цього конфігурації з підтримкою SSL та proxy_protocol за адресою /etc/nginx/sites-available/example.com-https.conf :

server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name 192.168.1.4; #Your current server ip address. It will redirect to the domain name.
    listen 80;
    listen 443 ssl http2;
    listen [::]:80;
    listen [::]:443 ssl http2;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    return 301 https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name  example.com;
    listen       *:80;
    return 301   https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name www.example.com;
    listen 80;
    listen 443 http2;
    listen [::]:80;
    listen [::]:443 ssl http2 ;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    return 301 https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name example.com;
    listen 443 proxy_protocol ssl http2;
    listen [::]:443 proxy_protocol ssl http2;
    root /var/www/html;
    charset UTF-8;
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy no-referrer;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    keepalive_timeout   70;
    ssl_buffer_size 1400;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=86400;
    resolver_timeout 10;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_trusted_certificate /etc/nginx/certs/example.com.crt;
location ~* \.(jpg|jpe?g|gif|png|ico|cur|gz|svgz|mp4|ogg|ogv|webm|htc|css|js|otf|eot|svg|ttf|woff|woff2)(\?ver=[0-9.]+)?$ {
    expires modified 1M;
    add_header Access-Control-Allow-Origin '*';
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    access_log off;
    }
    location ~ /.well-known { #For issuing LetsEncrypt Certificates
        allow all;
    }
location / {
    index index.php;
    try_files $uri $uri/ /index.php?$args;
    }
error_page  404    /404.php;

location ~ \.php$ {
    try_files       $uri =404;
    fastcgi_index   index.php;
    fastcgi_pass    unix:/tmp/php7-fpm.sock;
    #fastcgi_pass    php-container-hostname:9000; (if using docker)
    fastcgi_pass_request_headers on;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_request_buffering on;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    include fastcgi_params;
}
location = /robots.txt {
    access_log off;
    log_not_found off;
    }
location ~ /\. {
    deny  all;
    access_log off;
    log_not_found off;
    }
}

І нарешті, зразок 2-х вузлів веб-серверів : Перший сервер:

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello From Nodejs\n');
}).listen(8080, "192.168.1.4");
console.log('Server running at http://192.168.1.4:8080/');

Другий сервер:

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello From Nodejs\n');
}).listen(8080, "192.168.1.5");
console.log('Server running at http://192.168.1.5:8080/');

Тепер все повинно бути ідеально працюючим і збалансованим навантаженням.

Нещодавно я писав про те, як налаштувати Nginx як балансир навантаження TCP у Docker . Перевірте це, якщо ви використовуєте Docker.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.