Запуск нескольких приложений node.js на одном сервере nginx


Краткая инструкция, как запустить несколько приложений на одном сервере nginx

Для старта нескольких приложений необходимо их запустить на разных портах. Каждый подключенный хост связать с портом в конфигурации nginx

/etc/nginx/sites-available/default


server {
        listen 80;
        listen [::]:80;

        server_name example.site;
        return 301 https://$server_name$request_uri;
        location / {
                proxy_set_header   X-Forwarded-For $remote_addr;
                proxy_set_header   Host $http_host;
                proxy_pass         "http://127.0.0.1:1337";
        }

        server_tokens off;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name example.site;

        
        ssl_certificate /etc/letsencrypt/live/example.site/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.site/privkey.pem;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;

        ssl_protocols TLSv1.2;
        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
        ssl_prefer_server_ciphers on;

        add_header Strict-Transport-Security "max-age=15768000";

        ssl_stapling on;

        ssl_stapling_verify on;

        root /var/www/html;


        index index.html index.htm index.nginx-debian.html;
        server_tokens off;

        location / {
                proxy_set_header   X-Forwarded-For $remote_addr;
                proxy_set_header   Host $http_host;
                proxy_pass         "http://127.0.0.1:1337";
        }

        location ~ /.well-known {
                allow all;
        }
}

Для запуска демонов приложений я использую pm2, устаналивается npm install -g npm.

Пример запуска демона

pm2 start app.js -x -- --prod

У этого способа есть 2 больших минуса:

  1. Все запущенные приложения в списке будут называться именем скрипта, то есть app. И если у вас на одном сервере крутится больше 3 приложений будет сложно их идентифицировать.
  2. Невозможно использовать скрипты из package.json. Есть команда, которой можно запустить один(!) проект:
pm2 start npm -- start


Другой способ:

Выполняем

pm2 ecosystem

Данная команда генерирует файл кофигурации ecosystem.config.js для запуска приложений.

Полностью очищаем его и прописываем

module.exports = {
  apps : [{
    name      : 'name0',
    script    : 'app.js',
    env: {
      CONFIG: '.env.name0'
    }
  }, {
    name      : 'name1',
    script    : 'app.js',
    env: {
      CONFIG: '.env.name1'
    }
  }, {
    name      : 'name2',
    script    : 'app.js',
    env: {
      CONFIG: '.env.name2'
    }
  }, {
    name      : 'name3',
    script    : 'app.js',
    env: {
      CONFIG: '.env.name3'
    }
  }]
};

Свойство name - имя процесса после запуска

Свойство script - путь к файлу

Свойство env - переменные для запуска (тоже самое, что CONFIG=.env.name2 node app.js)

Далее, для запуска всех приложений, выполняем

pm2 start ecosystem.config.js

Для запуска одного приложения

pm2 start --only APPNAME

где APPNAME - name в ecosystem.config.js

Для остановки всех, запущенных приложений

pm2 stop all

Для остановки одного

pm2 stop ID где ID - идентификатор приложения