我有以下网络配置: F5 LB - > 2 NGNIX节点 - >应用服务器
对于服务器到服务器的调用,我们根据源服务器上的scheme,port和uri对请求进行签名,并通过基于相同的参数再次重新签名请求来比较目标上的此签名。 服务器到服务器调用遵循以下路径: 源服务器 - > F5 LB - > NGNIX - >目的地服务器。
源服务器发送的原始请求将发送到不带端口的https,因此无端口签名(或使用默认端口)。 LB为请求添加自定义端口并将其传递给NGNIX。 NGNIX又配置为将请求传递给服务器方案,主机和端口到应用服务器:
proxy_set_header Host $host:$server_port;
proxy_set_header X-Scheme $scheme;
目标服务器收到来自LB的端口,而不是与源服务器发送的原始请求一起发送的端口,最终导致目标服务器上的签名检查失败。 使用Apache测试了相同的情况,使用带代理服务器的ajp,并且传递的请求是保留原始端口,而不是LB添加的端口。
经过彻底阅读后,它出现了一个简单的问题: 如何访问ngnix中的原始请求(和端口)?
以下是相关配置的其余部分:
proxy.conf:
proxy_redirect off;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
proxy_buffer_size 8k;
proxy_http_version 1.0;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
构造
log_format upstreamlog '[$time_local] $remote_addr $status "$request" $body_bytes_sent - $server_name to: $upstream_addr $upstream_response_time sec "$http_user_agent"';
server {
listen 9080;
listen 9443 ssl;
server_name myserver.com;
root html;
error_log /data/server_openresty/error.log info;
access_log /ldata/server_openresty/logs/access.log upstreamlog;
gzip on;
gzip_types text/plain text/xml text/css text/javascript application/javascript application/xhtml+xml application/xml;
ssl_certificate /data/server_openresty/nginx/certs/dev_wildCard.crt;
ssl_certificate_key /code/server_openresty/nginx/certs/dev_wildCard.key;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:MEDIUM:!aNULL:!MD5;
### headers passed to the proxies
proxy_set_header Host $host:$server_port;
proxy_set_header X-Scheme $scheme;
location /api/serverA{
proxy_pass http://serverA-cluster;
}
location /api/serverB{
proxy_pass http://serverB-cluster;
}
}