Настройка веб сервера NGINX

Target upstream names:

  • nextjs (tcp: 9000)
  • helper express server (tcp: 5000)
  • tg-bot express server (tcp: 2021)

Step 1

То, что общее - выносишь из конфига сервера в отдельный конфиг. Например /etc/nginx/conf.d/00-options.conf пишешь туда общие для всех штуки

00-options.conf
client_body_timeout 300s;
client_body_buffer_size 5m;
client_max_body_size 32m;
server_tokens off;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

На самом деле я бы поспорил про пару параметров, но фиг с ним, оставим, как есть

Step 2

Создаем файл апстримов, чтобы можно было их менять отдельно от остального конфига. там же в /conf.d создай файл 00-upstreams.conf

00-upstreams.conf
upstream nextjs {
  server 127.0.0.1:9000 fail_timeout=0 max_fails=0;
}
 
upstream helper {
  server 127.0.0.1:5000 fail_timeout=0 max_fails=0;
}
 
upstream tg-bot {
  server 127.0.0.1:2021 fail_timeout=0 max_fails=0;
}

Это твои апстримы. Их имена будешь использовать в конфиге при proxy_pass

Step 3

Забэкапь свой текущий конфиг и убери его из conf.d куда-нибудь подальше. Создаешь в conf.d файл 50-pravosleva.pro.conf

50-pravosleva.pro.conf
server {
  listen 80;
  listen 443 ssl;
 
  server_name .pravosleva.pro;
  
  ssl_certificate /etc/letsencrypt/live/pravosleva.pro/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/pravosleva.pro/privkey.pem;
  ssl_protocols        TLSv1.2 TLSv1.1 TLSv1;
  ssl_prefer_server_ciphers on;
  ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !MD5 !EXP !DSS !PSK !SRP !kECDH !CAMELLIA !RC4 !SEED';
  ssl_session_cache   shared:SSL:10m;
  ssl_session_timeout 10m;
 
  location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root /var/www/letsencrypt;
  }
  location = /.well-known/acme-challenge/ {
    return 404;
  }
  
  # nextjs
  #location /static {
  #  root /root/projects/pravosleva-blog/frontend.nextjs/public;
  #}
  location /socket.io {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header Test "hello world from nginx";
    proxy_pass http://nextjs;
  }
  location / {
    proxy_set_header   X-Real-IP $remote_addr;
    if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      #
      # Custom headers and headers various browsers *should* be OK with but aren't
      #
      add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      #
      # Tell client that this pre-flight info is valid for 20 days
      #
      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Content-Type' 'text/plain; charset=utf-8';
      add_header 'Content-Length' 0;
      return 204;
    }
    if ($request_method = 'GET') {
      add_header 'Access-Control-Allow-Origin' '*' always;
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
      add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
      add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
    }
    proxy_pass http://nextjs;
  }
 
  # helper
  location ~ ^/express-helper/auth/signin/(.*)$ {
    proxy_buffering off;
    proxy_redirect  off;
    proxy_set_header  Host  $http_host;
    proxy_set_header  X-Forwarder-For  $remote_addr;
    proxy_set_header  X-Frame-Options  SAMEORIGIN;
    proxy_pass   http://helper/auth/signin/$1;
  }
  location ~ ^/express-helper/chat/(.*)$ {
    proxy_buffering off;
    proxy_redirect  off;
    proxy_set_header  Host  $http_host;
    proxy_set_header  X-Forwarder-For  $remote_addr;
    proxy_set_header  X-Frame-Options  SAMEORIGIN;
    proxy_pass   http://helper/chat/$1;
  }
  location /express-helper/ {
    proxy_cache_bypass 1;
    max_ranges 0;
    proxy_pass http://helper/;
  }
 
  # tg-bot
  location /tg-bot-2021/ {
    proxy_pass http://tg-bot/;
  }
}

Step 4 (subdomain)

Создаешь в conf.d файл 51-gosuslugi.pravosleva.pro.conf

51-gosuslugi.pravosleva.pro
server {
  listen 80;
  listen 443 ssl;
  server_name gosuslugi.pravosleva.pro;
 
  ssl_certificate /etc/letsencrypt/live/pravosleva.pro/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/pravosleva.pro/privkey.pem;
  ssl_protocols        TLSv1.2 TLSv1.1 TLSv1;
  #ssl_prefer_server_ciphers on;
  #ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES>
  #ssl_session_cache   shared:SSL:10m;
  #ssl_session_timeout 10m;
 
  location / {
    proxy_set_header Host pravosleva.pro;
    proxy_pass http://127.0.0.1:80;
  }
  location /socket.io {
    proxy_pass http://helper;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host pravosleva.pro;
  }
}

Step 5

Проверяешь конфиг

nginx -t

Ну и перезапускаешь nginx

systemctl restart nginx

FAQ

не совсем понял, эти конфиги надо импортировать в одном месте? или nginx сам их все найдет?

у тебя в основном nginx.conf наверняка есть строчка

include conf.d/*.conf;

Она импортирует все содержимое conf.d из файлов с расширением conf

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

Четко работает! Есть вопрос только. node - это зарезервированное слово или где эта переменная объявлена?

Это имя апстрима в 00-upstreams.conf

А в чем смысл наименований некоторых файлов с 00-* или с 50-*/51-* ?

Просто я так делаю обычно. Общие конфиги под номерами от 00 до 19. Виртхосты - от 50 и выше. Большой разбег позволяет при необходимости вставить что-нибудь в нужное место без переименования