Nginx conf для управления трафиком между 2 конечными точками ssl ‘d

#nginx #nginx-reverse-proxy #nginx-config

#nginx #nginx-обратный прокси #nginx-config

Вопрос:

Вот настройка:
fowarding_proxy -> server_1 , server_2
server_1 -> app1.domain.com , app2.domain.com
server_2 -> app3.domain.com , app4.domain.com

Где на каждом сервере запущен демон docker с обратным прокси-сервером nginx на основе настройки jwilder / nginx-proxy letsencrypt.

Оба сервера находятся за одним маршрутизатором, и мне нужен способ правильной маршрутизации трафика на каждый из них на основе имени хоста. Я пытался использовать модуль nginx stream, так как я не хочу, чтобы прокси-сервер пересылки обрабатывал какое-либо завершение ssl, но $ssl_preread_name директива (кажется) не фиксирует имя хоста в http-трафике, и я не могу выполнить 301 в server директивах в модуле stream. Каков наилучший способ подойти к этому?

Я включил пример конфигурации, с которой я сейчас работаю, и я попробовал несколько итераций. Открыт для любых предложений.

(Кроме того, ничего не регистрируется в access.log)

Forward_proxy nginx.conf

 user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

stream {
  # bare bones content, still nothing written to the log.
  log_format main '[$time_local] $remote_addr'
  access_log /var/log/nginx/access.log main;

  map $ssl_preread_server_name $name {
    app1.domain.com server1;
    app2.domain.com server1;
    app3.domain.com server2;
    app4.domain.com server2;
  }
  
  upstream server1 {
    server server1:80;
  }
  upstream server2 {
    server server1:80;
  }
  upstream server1_ssl {
    server server1:443;
  }
  upstream server2_ssl {
    server server1:443;
  }

  server {
    listen 80;
    proxy_pass $name;
    ssl_preread on;
  }
  
  server {
    listen 443;
    proxy_pass "${name}_ssl";
    ssl_preread on;
  }
}
  

Ответ №1:

Придумал решение, рад услышать о лучших.

Вместо одного прокси-сервера пересылки я создал два новых контейнера nginx: один для HTTP-трафика, а другой для HTTPS-трафика и поместил их оба в один файл docker-compose для упрощения управления.

HTTP-переадресация-прокси

 http {
  map $host $name {
    default server1;
    app3.strangedreamsinc.com server2;
    app4.strangedreamsinc.com server2;
  } 

  upstream server1 {
    server server1_ip:8080;
  }

  upstream server2 {
    server server2:8080;
  }

  server {
    listen 80 default_server;
    server_name _;
    location / {
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://$name;      
    }
  }
}
  

HTTPS-пересылка-прокси

 stream {
  map $ssl_preread_server_name $name { 
    default server1;
    app1.strangedreamsinc.com server1;
    app2.strangedreamsinc.com server1;
  }


  upstream server1 {
    server server1_ip:8443;
  }
  upstream server2 {
    server server2_ip:8443;
  }

  server {
    listen 443;
    proxy_pass $name;
    ssl_preread on;
  }
}
  

Я не уверен, что нет лучшего способа, и, вероятно, я что-то упускаю из виду, но это позволяет мне прозрачно направлять трафик на правильный обратный прокси-сервер и по-прежнему поддерживает протоколы letsencrypt для применения SSL к моим серверам.