先說結論!!!
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是常識吧!!!!!