У меня есть веб-приложение с обратным прокси-сервером Nginx, работающее как LB. Размещаемое веб-приложение состоит из двух компонентов. UI и API. Пользовательский интерфейс обычно доступен, но для аутентификации API требуются клиентские сертификаты. Оба находятся на одном и том же имени хоста, поскольку являются частью одного веб-приложения. Кроме того, клиент использует то же имя хоста mywebApp.com
для UI и API.
У меня есть заголовки userid
и password
что будет отличать запрос API от других запросов. Обычно, если в запросе присутствуют действительные и совпадающие заголовки, прикрепите proxy_ssl_certificate
proxy_ssl_certificate_key
proxy_ssl_trusted_certificate
на запрос, иначе нет.
Моя идея состоит в том, чтобы перенаправить этот запрос на новое имя хоста / имя_сервера.
Вот моя конфигурация nginx.
upstream my-webapp {
hash $remote_addr;
server my-app-1:8443;
server my-app-2:8443;
server my-app-3:8443;
}
map $http_userid $valid_user {
default 0;
validUsername 1;
}
map $http_password $valid_pass {
default 0;
validPassword 1;
}
map $valid_user$valid_pass $new_host {
default "mywebApp.com";
11 "api.mywebApp.com";
}
server {
listen 80;
return 301 https://$host_new$request_uri;
}
server {
listen 443 ssl;
server_name mywebApp.com;
#...setting proxy headers
location / {
proxy_pass https://my-webapp/;
}
}
server {
listen 443 ssl;
server_name api.mywebApp.com;
#...setting proxy headers
#...Additionally attach below certs
proxy_ssl_certificate /etc/nginx/certs/api-cert.pem;
proxy_ssl_certificate_key /etc/nginx/certs/api-key.key;
proxy_ssl_trusted_certificate /etc/nginx/certs/ca-cert.pem;
location / {
proxy_pass https://my-webapp/;
}
}
Эта конфигурация ведет себя странно: иногда к запросам пользовательского интерфейса прикрепляются сертификаты, а иногда к запросам API не прикрепляются сертификаты.
Если есть другой способ добиться этого, без нескольких разделительных блоков, пожалуйста, помогите.
Судя по комментарию Майкла, выбранный подход был неправильным. Nginx будет прослушивать только имена server_name, которые доступны извне как имена хостов. Меня неправильно вдохновили многие QnA, которые показали сопоставление www с именами хостов без www. Что было совершенно другим, поскольку имя хоста example.com
все еще был доступен.
Решил мою проблему, сделав желаемое имя хоста доступным извне, а затем используя его как server_name
.