Я немного поиграл с вашим примером использования в моей лабораторной среде, и вы действительно нашли довольно удобное решение для потоковой передачи прокси в зависимости от входящего субдомена. Основная проблема все еще, как упомянуто в моем комментарии : вы не должны иметь два раза один и тот же порт, который вы слушаете (в вашем случае 443). Это то, чего у вас нет в большом объединенном файле, но вы представляете его в разделенных файлах, и, поскольку nginx просто объединяет разделенные файлы, возникает ошибка, о которой вы упоминаете.
С моей точки зрения посмотреть путем изменения разбиения файлов, это должно работать. Вот пример, который я считаю полезным. Он состоит из 3 частей:
- «префиксная» часть, которая содержит отображение
- серверов, добавляйте столько, сколько хотите. Один сервер имеет отдельную директиву
server {}
с портом 5480, так как он используется только тогда, когда он может go в файле, указанном сервером c. Если это произойдет и для других серверов, то оно должно go в файле суффикса. - часть «суффикса», содержащая действительную директиву прохода прокси, которая всегда одинакова из-за использования
$upstream
variable
Я начал имена файлов с чисел, чтобы обеспечить их порядок при объединении их nginx.
Обратите внимание, что я проверил это с DNS и серверами, которые у меня есть, и могу контролировать , Я переписал примеры, чтобы они соответствовали вашим ситуациям. Я надеюсь, что он работает как есть, но поскольку у меня нет вашей настройки, он может не сработать сразу.
Префикс: 00_prefix.conf
map $ssl_preread_server_name:$server_port $upstream {
tempserver01.domain.com:5480 tempserver01_vapp_5480;
tempserver01.domain.com:443 tempserver01_backend_443;
tempserver02.domain.com:443 tempserver02_backend_443;
}
Сервер 1: 01_realserver01.conf
upstream $upstream {
hash $remote_addr consistent;
server duckduckgo.com:443;
}
server {
listen 5480;
proxy_pass $upstream;
ssl_preread on;
}
Сервер 2: 02_realserver02.conf
upstream $upstream {
hash $remote_addr consistent;
server duckduckgo.com:443;
}
Вы наверняка поняли, что часть server {}
отсутствует. Это связано с тем, что он на 100% одинаков во всех случаях и, следовательно, должен быть разделен в одном файле, чтобы гарантировать, что он заканчивается только 1 раз в объединенной большой конфигурации nginx создает из всех битов и кусочков в отдельные файлы конфигурации.
Суффикс: 99_suffix.conf
server {
listen 443;
proxy_pass $upstream;
ssl_preread on;
}
После перезагрузки nginx с помощью nginx -s reload
вы можете проверить полный конкатенированный конфиг nginx, загруженный с nginx -T
и вы увидите что-то вроде этого:
# configuration file /etc/nginx/stream/enabled/00_prefix.conf:
map $ssl_preread_server_name:$server_port $upstream {
tempserver01.domain.com:5480 tempserver01_vapp_5480;
tempserver01.domain.com:443 tempserver01_backend_443;
tempserver02.domain.com:443 tempserver02_backend_443;
}
# configuration file /etc/nginx/stream/enabled/01_realserver01.conf:
upstream $upstream {
hash $remote_addr consistent;
server duckduckgo.com:443;
}
server {
listen 5480;
proxy_pass $upstream;
ssl_preread on;
}
# configuration file /etc/nginx/stream/enabled/02_realserver02.conf:
upstream $upstream {
hash $remote_addr consistent;
server duckduckgo.com:443;
}
# configuration file /etc/nginx/stream/enabled/99_suffix.conf:
server {
listen 443;
proxy_pass $upstream;
ssl_preread on;
}
Как видите, отдельные файлы объединены в правильном порядке, и все должно работать как положено. Я надеюсь, что это поможет вам.