Взлетело, и полёт нормальный.
Ivan Ustûžanin - подсказал ссылки, там почти всё что нужно, но кое-то было не очевидно, сейчас про это напишу.
В общем вся конструкция строится на технологии
Proxy Protocol специально для этого кейса разработанной.
Для настройки потребуется настроить 3 вещи:
1. NGINX сервер frontend (первично принимающий весь трафик от роутера, либо напрямую из интернет).
2. NGINX или Apache (или другие) сервер backend.
3. ОБЯЗАТЕЛЬНО! Прописать в файле
/etc/hosts
на
backend серверах сопоставление доменов с
frontend сервером (именно
frontend!). Если при этом требуется, чтобы сервер мог обращаться ещё и сам к себе по некоторому доменному имени (это надо например
push-server
в Битрикс), то надо прописать любое выдуманное имя хоста в /etc/hostname, и отдельной записью прописать его на локальный IP в
/etc/hosts
1. Конфиг на стороне NGINX Reverse Proxy (он же frontent):
NGINX должен быть собран с модулями:
--with-stream_ssl_module
--with-stream_ssl_preread_module
--with-stream_realip_module
user www-data;
worker_processes auto;
worker_rlimit_nofile 10240;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
use epoll;
worker_connections 30720;
multi_accept on;
}
stream {
proxy_protocol on; #обязательно включаем, без него IP адреса из приходящего SSL трафика не передать дальше
map $ssl_preread_server_name $name {
siteone.ru so;
sitetwo.ru st;
sitetree.ru str;
}
#bitrix1
upstream so80 {
server 192.168.0.100:80;
}
upstream so443 {
server 192.168.0.100:443;
}
upstream so8893 {
server 192.168.0.100:8893;
}
upstream so8894 {
server 192.168.0.100:8894;
}
#bitrix2
upstream st80 {
server 192.168.88.114:80;
}
upstream st443 {
server 192.168.88.114:443;
}
upstream st8893 {
server 192.168.88.114:8893;
}
upstream st8894 {
server 192.168.88.114:8894;
}
#web site
upstream str80 {
server 192.168.88.102:80;
}
upstream str443 {
server 192.168.88.102:443;
}
#web traffic
server {
listen 80;
proxy_pass ${name}80;
}
server {
listen 443;
proxy_pass ${name}443;
ssl_preread on;
}
#push&pull bitrix
server {
listen 8893;
proxy_pass ${name}8893;
}
server {
listen 8894;
proxy_pass ${name}8894;
ssl_preread on;
}
}
2. Конфиг на стороне принимающего сервера (backend).
1. Для каждого слушаемого порта в директиву
listen
дописываем
proxy_protocol
, иначе вообще не заработает.
Должно получиться что-то типо
server {
listen 443 default_server ssl proxy_protocol;
...
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
...
}
2. Для отлова IP адреса клиента прописываем в директиве
http
http {
set_real_ip_from #IP вашего frontend#;
real_ip_header proxy_protocol;
}
3. Сделать записи в
/etc/hosts
как описано выше.