Настройка веб сервера 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
пишешь туда общие для всех штуки
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
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
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
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 и выше. Большой разбег позволяет при необходимости вставить что-нибудь в нужное место без переименования