2021-03-09 | UNLOCK

nginx代理导致egg获取ip地址不准确

问题

1、已经把项目部署至远程服务器了,然后试着 电脑发起一个post请求,用ctx.ip获取到的居然还是127.0.0.1。原因是我用控制台的域名解析,解析到了一台服务器的ip地址,那台服务器,我用了nginx的代理指向本地的egg服务端口。所以egg每次ctx.ip获取到的ip地址是127.0.0.1。

解决

nginx代理获取真实ip

1、设置nginx

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80;
server_name eggtmp.api.abc.cn;
location / {
proxy_pass http://localhost:123456;
proxy_set_header X-Real-IP $remote_addr;
#在多级代理的情况下,记录每次代理之前的客户端真实ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
}
}

重点是这两句 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

JavaScript打多的小伙伴,记得配置nginx记得把;分号带上,不然找半天错误,人都没了。

2、修改egg.js

修改egg.js项目里的代码 关于 ctx.ip的代码 换成 ctx.get('X-Real-IP')

意思是:nginx已经把用户的真实ip放在了请求头headers里的X-Real-IP里。所以用ctx.get()去获取即可。

测试

自己再测试一下接口,祝你好运~