(обновлено) Я хотел бы использовать такие запросы прокси:
https://port123.host.com:85/any/path ==> http://server85:123/any/path
https://port567.host.com:85/any/path ==> http://server85:567/any/path
https://port123.host.com:86/any/path ==> http://server86:123/any/path
https://port567.host.com:86/any/path ==> http://server86:567/any/path
Как вы порекомендуете мне этого добиться? (Я знаю, что это забавная архитектура)
Объявления сервера работают без SSL, с ним - нет.
server {
listen 86 ssl;
server_name port123;
ssl_certificate CERT123;
ssl_...;
localtion / { proxy_pass.... }
}
server {
listen 86 ssl;
server_name port567;
ssl_certificate CERT567;
ssl...;
localtion / { proxy_pass.... }
}
Я вижу, что это известное ограничение nginx (несколько SSLS на одном порту и одном IP). Но мне интересно, есть ли простой обходной путь. Я не могу использовать SAN, потому что каждый мой сервер фактически является подстановочным знаком с подстановочным сертификатом.
Вы можете создать серверный блок для каждого порта, который должен прослушивать nginx. Внутри блока server вы можете перенаправить на комбинацию host: port. Попробуйте это ... он должен делать то, что вы просили:
server {
listen 85;
listen [::]:85;
server_name port123.host.com;
location / {
proxy_pass http://server85:123/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 86;
listen [::]:86;
server_name port567.host.com
location / {
proxy_pass http://server86:567/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
В итоге я сделал это с отдельным IP-адресом для каждой конечной точки SSL. Поскольку сеанс TLS происходит без заголовка хоста, nginx не может «угадать», какой сертификат использовать. Так что IP-адреса исправляют это, и у меня есть некоторые доступные. Так:
server {
listen 192.168.1.5:85 ssl;
server_name port123;
ssl_certificate /port123.crt;
ssl_certificate_key /port123.key;
location / {
proxy_pass http://server85:123/;
}
}
server {
listen 192.168.1.6:86 ssl;
server_name port123;
ssl_certificate /port567.crt;
ssl_certificate_key /port567.key;
location / {
proxy_pass http://server86:567/;
}
}
На самом деле у меня больше комбинаций, и я также по-другому устанавливаю заголовки. Но наконец это работает.
Как всегда, лучшие статьи на nginx: http://nginx.org/en/docs/http/configuring_https_servers.html