@detcelfer

Как настроить Nginx reverse proxy для работы с двумя приложениями на 443 порте с использованием SSL?

Возникла проблема при настройки nginx для двух веб-приложений
Что имеется в настоящее время:
1. для каждого приложения выделен домен
2. для каждого домена сгенерированы сертификаты let's Encrypt (certbot)
3. для обновления сертификатов certbot создан отдельный конфиг nginx (/etc/nginx/custom/certbot):
/etc/nginx/custom/certbot
server {
    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 принимал реквесты идущие сразу на два домена одновременно и в зависимости от домена перенаправлял в нужную сторону к приложениям.
  • Вопрос задан
  • 720 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Drno
У тебя нет в конфиге настроек reverse proxy.
И правильно ругается. Ты на всех ip пытаешься 2 раза слушать 443 порт…
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Аргумент backlog=4096 надо указывать один раз, в одном listen ...;.

include .../custom/cerbot нужно указывать один раз. Или скопировать его содержимое в каждый domainN.conf. Ах, у вас ещё и расширения у файлов отсутствуют?
Ответ написан
Комментировать
@xmix
xmix@mail.ru напиши мне, Андрей.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы