Возникла проблема при настройки nginx для двух веб-приложений
Что имеется в настоящее время:
1. для каждого приложения выделен домен
2. для каждого домена сгенерированы сертификаты let's Encrypt (certbot)
3. для обновления сертификатов certbot создан отдельный конфиг nginx (/etc/nginx/custom/certbot):
/etc/nginx/custom/certbotserver {
listen 80;
server_name domain1 domain2;
location /.well-known/acme-challenge {
root /usr/share/nginx/html;
}
location / {
return 301 https://$host$request_uri;
}
}
4. для проксирования запросов создан отдельный конфиг nginx (/etc/nginx/custom/proxy):
/etc/nginx/custom/proxy# proxy headers
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy false;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
#proxy config:
proxy_redirect off;
proxy_http_version 1.1;
5. для каждого приложения создан отдельный конфиг nginx в /etc/nginx/sites-available и ссылки в -enabled
domain1# add certbot config:
include /etc/nginx/custom/certbot;
# match secret_key value:
map $arg_secret_key $secret_key {
default "";
~^[a-zA-Z0-9_-]+$ $arg_secret_key;
}
# define zones:
# requests per second:
limit_req_zone $secret_key zone=secret_key_zone:10m rate=90r/s;
limit_req_zone $secret_key zone=secret_key_inc_zone:10m rate=120r/s;
# paralell connections:
limit_conn_zone $secret_key zone=secret_key_conn_zone:10m;
server {
listen 443 ssl backlog=4096;
server_name domain1;
#SSL:
ssl_certificate /etc/letsencrypt/live/domain1/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain1/privkey.pem;
#include /etc/letsencrypt/options-ssl-nginx.conf;
#ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# different locations...
location /some/endpoint {
include /etc/nginx/custom/proxy;
include uwsgi_params;
uwsgi_pass unix:/path/to/uwsgi.sock;
# connection limits:
limit_req zone=secret_key_zone burst=5;
limit_conn secret_key_conn_zone 100;
limit_req_status 429;
}
location / {
include /etc/nginx/custom/proxy;
include uwsgi_params;
proxy_read_timeout 300s;
uwsgi_pass unix:/path/to/uwsgi.sock;
}
}
domain2# add certbot config:
include /etc/nginx/custom/certbot;
server {
listen 443 ssl backlog=4096;
server_name domain2;
#SSL:
ssl_certificate /etc/letsencrypt/live/domain2/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain2/privkey.pem;
#include /etc/letsencrypt/options-ssl-nginx.conf;
#ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location ~* \.(?:css|js|ico|gif|jpe?g|png)$ {
root /path/to/build;
expires 30d;
include /etc/nginx/custom/proxy;
# Enable gzip compression for static files
gzip on;
gzip_comp_level 3;
gzip_types text/plain text/css application/javascript application/json;
# Enable serving of etags for cache validation
etag on;
}
location / {
root /path/to/build;
# include params for every location:
include /etc/nginx/custom/proxy;
index index.html;
try_files $uri /index.html$is_args$args =404;
}
}
При такой конфигурации служба nginx падает с ошибкой:
# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.
# nginx -t
nginx: [emerg] duplicate listen options for 0.0.0.0:443 in /etc/nginx/sites-enabled/domain2:5
nginx: configuration file /etc/nginx/nginx.conf test failed
указание на строку
listen 443 ssl backlog=4096; в файле конфигурации второго приложения.
При использовании разных портов 443, 444 ошибка пропадает (то же мне новость с учетом ошибки). При этом возникают алерты:
nginx: [warn] conflicting server name "domain1" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "domain2" on 0.0.0.0:80, ignored
При удалении ссылки domain2 из site-enabled нет ни подобных алертов, domain1 работает как следует.
Никак не пойму, что я не так делаю, чтобы nginx на 443 принимал реквесты идущие сразу на два домена одновременно и в зависимости от домена перенаправлял в нужную сторону к приложениям.