先说结论!!!
nginx做反向代理的时候在location里面添加proxy_set_header
location /xxx/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:3001;
}
原因分析!!
没加proxy_set_header之前,我在开发过程中留意到被反向代理的服务程序在数据库里面记录的访问来源地址都是127.0.0.1,也就是说对于被反向代理方来说所有的访问都来自nginx所在的服务器,而spring框架用来判断用户是否登录的凭据好像会记录登录的域名,所以我分析,当vue在本地运行的时候,浏览器打开的地址也是127.0.0.1,虽然这两个127.0.0.1不是同一台机子,但是域名对上了,所以spring才能判断用户已经登录。但是如果把vue上传到服务器上去,那浏览器就是靠域名访问页面了,域名对不上了,就出现了登录错误。
解决过程!
接到一个微服务构架的项目,研究下来应该是用了zookeeper做服务发现和注册,布置这个服务用了较长的时间,老板来催,说要加快进度,直接用nginx做了反向代理,zookeeper变成花瓶摆在一边看看而已了。因为是微服务构架,所以还是比较复杂的,离项目上线不久,突然发现调用某一个服务的post接口会报登录异常错误,其他的功能都正常,在尝试了天马行空般各种解决方案但始终问题解决不了后,顶着项目马上要上线的压力,我冷静下来仔细思考了为什么我本地调试就没问题这个现象,最终找到突破口,解决了问题。各位专业运维不要喷我啊,也许对于各位专业运维人员来说加proxy_set_header是常识吧!!!!!