@IsNoGood
Инженер по поддержке Unix систем

Как настроить адресацию по домену в nginx на на разные локальные IP адреса в зависимости от домена к которому обращаются?

В наличии:
На входе Mikrotik (внешний IP 1.1.1.1; локальный IP 192.168.0.1)
Web server NGINX (локальный IP 192.168.0.2)
srv1 (локальный IP 192.168.0.3)
srv2 (локальный IP 192.168.0.4)
и так далее в зависимости от потребностей.
на srv1 и srv2 настроено получение сертификатов от LetsEncrypt.
Задача настроить перенаправленние с NGINX на srv1 или srv2 в зависимости от адреса обращения srv1.example.org или srv2.example.org.
Пока получилось настроить только перенаправление всего трафика с NGINX на srv1, а также получение сертификата от letsencrypt и проверка sll на стороне NGINX.
Настройки:
На Mikrotik стоит переадрессация соединений по 80 и 443 порам на локальный IP 192.168.0.2 (NGINX)
На NGINX:
server {
listen 80;
server_name example.org srv1.example.org srv2.example.org;

# Lets encrypt
location ^~ /.well-known/acme-challenge/ {
alias /usr/local/www/acme/;
}

# Redirect other HTTP connections to HTTPS
location / {
return 301 https://srv1.example.org$request_uri;
}
}
server {
listen 443 ssl;
server_name srv1.example.org;
ssl_certificate /usr/local/etc/ssl/acme/fullchain.pem;
ssl_certificate_key /usr/local/etc/ssl/acme/private/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!kEDH';
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
location / {
proxy_pass https://192.168.0.3/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass_header Set-Cookie;
}
}

При такой настройке при обращении на любой из доменов открывается srv1.
Прошу помочь.
  • Вопрос задан
  • 878 просмотров
Решения вопроса 1
ky0
@ky0 Куратор тега Nginx
Миллиардер, филантроп, патологический лгун
Вам нужно не перенаправление, а проксирование, что-то типа такого:

server {
listen 80;

location / {
return 301 https://$server_name$request_uri;
}}

server {
listen 443;
server_name srv1.example.org;

location / {
proxy_pass https://192.168.0.3;
}}

server {
listen 443;
server_name srv2.example.org;

location / {
proxy_pass https://192.168.0.4;
}}


С LE всё правильно, но опять же - соответствующий локейшен нужно будет добавить во все конфиги или вынести в отдельный и прописать в конфигах инклюд.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@IsNoGood Автор вопроса
Инженер по поддержке Unix систем
Насколько я понимаю надо в строчке
location / {
return 301 https://srv1.example.org$request_uri;
}
подставлять не фиксированный адрес https://srv1.example.org, а подменять на адрес обращения, и ниже указать
server {
listen 443 ssl;
server_name srv1.example.org;
...}
server {
listen 443 ssl;
server_name srv2.example.org;
...}
server {
listen 443 ssl;
server_name srv*.example.org;
...}
Но я пока не понимаю как.
Ответ написан
Комментировать
@miksir
IT
1. Терминировать SSL на 192.168.0.2 и далее проксировать на 0.3 и 0.4, как указано в ответе ky0
1.1 - проксировать по http, локалка все же... минусы - могут быть подводные камни с генерацией ссылок в приложении, нужно предпринять некоторые телодвижения для этого (зависящие от приложения)
1.2 - проксировать по https, в минусах оверхед на установку дополнительного tls, может и не критично

2. Проксировать не доходя до L7 уровня используя SNI для роутинга. nginx это делать не умеет, можно использовать haproxy https://www.haproxy.com/blog/enhanced-ssl-load-bal...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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