今天发现生产环境自定义透传字段 头部转发IP, 错误.

观察了下 获取IP 方式并没有问题. 开发环境ok 的. 区别在于开发环境是直连的, 而生产是 Nginx Proxy

server {
listen 8080;
server_name localhost;
access_log /data/log/nginx/asset-access.log main;
error_log /data/log/nginx/asset-error.log error;

location / {
set $mode "test";
if ($request_uri ~* xxxx=([0-9a-z]+)) {
set $mode $1;
}

proxy_pass http://swoole_assets;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;

}
}
upstream swoole_assets{
server 10.0.0.1:5001;
server 10.0.0.2:1001;
hash $mode;
}

上面的配置 本身并没有问题.

问题在于 header name 的字符做了限制,默认 underscores_in_headers 为 off,表示如果header name 中包含下划线,则忽略掉。

恰好我自定义的 header 中都是用的下划线。

处理办法:
1、配置中 http 部分 增加 underscores_in_headers on; 配置

2、用减号 - 替代下划线符号 _,避免这种变态问题。nginx 默认忽略掉下划线可能有些原因。

可以加到 http 或者 server 中

语法:underscores_in_headers on|off
默认值:off
使用字段:http, server
是否允许在 header 的字段中带下划线。

文章中提到查询配置问题, 可以提高Nginx log 等级, 调整到debug 模式.

后来我在 nginx.conf 把 error 的日志等级更改为 debug,查看 error_log logs/error.log debug;

解决问题文章 :

https://cloud.tencent.com/developer/article/1835815