我的 Web 应用程序前端有 Nginx 反向代理作为负载均衡器。托管的 Web 应用程序有两个组件。UI 和 API。UI 通常可以访问,但 API 需要客户端证书进行身份验证。两者都位于同一个主机名上,因为它们是单个 Web 应用程序的一部分。此外,客户端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/;
}
}
此配置行为异常,有时 UI 请求会附加证书,有时 API 请求不会附加证书。
如果有其他方法可以实现,而无需多个服务器块,请帮忙。
答案1
根据 Michael 的评论,采取的方法是错误的。Nginx 将仅监听可作为主机名在外部使用的 server_names。我错误地受到许多 QnA 的启发,这些 QnA 显示将 www 映射到非 www 主机名。这完全不同,因为主机名example.com
仍然可用。
通过使所需的主机名在外部可用,然后将其用作,解决了我的问题server_name
。