Редактировать:
Если вас беспокоит, что соединение между вашим обратным прокси-сервером (который завершает туннель SSL) и сервером содержимого не защищено, хотя это работает и является безопасным, вам лучше настроить восходящий SSL или безопасный туннель, такой как SSH или IPSEC, между контент-сервер и обратный прокси-сервер.
У меня это работает:
Структура файла:
нгникс/
конфиг/
nginx.conf
http_имя_сервера.js
докер-compose.yml
nginx.conf
модули load_module/ngx_stream_js_module.so;
События {}
транслировать {
js_import main из http_server_name.js;
js_set $preread_server_name main.get_server_name;
карта $preread_server_name $http {
1.example.com server1_backend_http;
2.example.com server2_backend_http;
}
карта $ssl_preread_server_name $https {
1.example.com server1_backend_https;
2.example.com server2_backend_https;
}
вышестоящий server1_backend_http {
сервер 192.168.178.8:80;
}
вышестоящий server1_backend_https {
сервер 192.168.178.8:443;
}
вышестоящий server2_backend_http {
сервер 192.168.178.7:80;
}
сервер {
слушать 443;
ssl_preread включен;
прокси_пасс $https;
}
сервер {
слушать 80;
js_preread main.read_server_name;
прокси_пасс $http;
}
}
докер-compose.yml
версия: '3'
Сервисы:
нгникс:
изображение: nginx
имя_контейнера: ngnix
перезапуск: если не остановлен
тома:
- ./config/ngnix.conf:/etc/nginx/nginx.conf:ro
- ./config/http_имя_сервера.js:/etc/nginx/http_имя_сервера.js:ro
порты:
- "192.168.178.4:80:80"
- "192.168.178.4:443:443"
http_имя_сервера.js
вар имя_сервера = '-';
/**
* Прочитать имя сервера из потока HTTP.
*
* @параметры
* Транслировать.
*/
функция read_server_name(s) {
s.on('загрузить', функция (данные, флаги) {
если (данные.длина || флаги.последний) {
с.сделано();
}
// Если мы сможем найти заголовок Host.
var n = data.indexOf('\r\nHost: ');
если (п != -1) {
// Определяем начало значения заголовка Host и следующего заголовка.
вар start_host = n + 8;
var next_header = data.indexOf('\r\n', start_host);
// Извлекаем значение заголовка Host.
server_name = data.substr(начальный_хост, следующий_заголовок - начальный_хост);
// Удалить порт, если он задан.
вар port_start = имя_сервера.indexOf(':');
если (port_start != -1) {
server_name = server_name.substr(0, port_start);
}
}
});
}
функция get_server_name(s) {
вернуть имя_сервера;
}
экспортировать по умолчанию {read_server_name, get_server_name}
Документация:
ngx_http_upstream_module
ngx_http_map_module
ngx_stream_proxy_module
Редактировать:
Читать этот пост в блоге для получения дополнительной информации