问题简述
由于公司的老项目用的架构属于前端后台在一起web项目,为了保证多机器部署session一致性,使用了比较简单暴力的 ip_hash处理,配置完发现服务器的所有请求只到了一台服务器,查看nginx的log日志,发现所有的clientIp都是127.0.0.1,找了问题所在。
- nginx负载配置
- nginx的access.log日志内容如下
解决问题
在http标签里面添加下面属性
http{
#真实服务器上一级代理的IP地址或者IP段,可以写多行
set_real_ip_from 127.0.0.1;
#从哪个header头检索出要的IP地址
real_ip_header X-Forwarded-For;
# 递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP
real_ip_recursive on;
}
在server标签里的location里面添加以下内容
server{
location / {
#把原http请求的Header中的Host字段也放到转发的请求里
proxy_set_header Host $http_host;
#记录客户端请求的真实IP
proxy_set_header X-Real-IP $remote_addr;
#用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#报头是用于识别协议(HTTP 或 HTTPS)
proxy_set_header X-Forwarded-Proto $scheme;
#客户端浏览器的主机名
proxy_set_header REMOTE-HOST $remote_host;
}
}
重新启动nginx
查看日志发现获取的客户端IP已经正常了,问题解决。