#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 к моим серверам.