需求:node
代理爲:web
順序json
Client –》 SLB –》 Nginx-Proxy –>baidu.com api -阿里雲環境api
Clinet –>Nginx -> Nginx-Proxy –>baidu.com api - 測試環境app
問題dom
在自建環境中,沒有任何問題,可是發佈到阿里雲SLB(service load balance)以後,竟然百度端會報
參數無效。tcp
咱們是採用Bitbucket來管理Nginx-proxy, 因爲採用的是Docker執行,總體上卻是很方便,就是相比直接部署來講,每次發佈時間要長一些。(因爲是全自動化,卻是能夠喝個水,溜下單身狗什麼的)工具
# in QA, it works well with SLB location ^~/proxy/baidu/ { #support cross-domain visit for app add_header Access-Control-Allow-Methods GET,POST,OPTIONS; #allow credentials add_header Access-Control-Allow-Credentials true; #allow-headers add_header 'access-control-allow-headers' 'Authentication,Origin,X-Requested-With,Content-Type,Accept,token,appId,unitId'; #alias //; # 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://api.map.baidu.com/place/v2/; #proxy_redirect https://api.map.baidu.com/place/v2// /; #proxy_pass http://node-http/log/testGet/; #proxy_redirect http://node-http/log/testGet// /; }
因爲採用docker部署方式,理論上說都是同樣的。惟一可能的是:SLB那邊轉發作了必定的改動。所以,採用tcpdump來抓包,比較兩個環境下的轉發請求的不一樣。
其實,我最開始的時候,採用的是Node-http來得到Nginx-Proxy 請求
Client –》 SLB –》 Nginx-Proxy –>baidu.com api -阿里雲環境 改成
Client –》 SLB –》 Nginx-Proxy –>Node Http
經過捕獲Http請求,來比較兩個環境下請求有哪些不一樣。其實兩種工具均可以: Node Http 或者採用 Tcpdump 來得到請求。
發現過程就是用firefox的web Tool不停的編輯header頭,作測試了,直到。。。
最終發現是:因爲在配置SLB的時候增長了一個header形成的,去掉就能夠了。
X-Forwarded-Proto: https\r\n
在此期間分別向阿里雲和百度提交了工單,阿里雲的工程師回覆比較積極,百度就呵呵了。有可能用的百度地圖服務是免費的,所以人家呵呵。
後面補充一點
因爲在Nginx-Proxy docker中即要啓動Nginx,同時,又須要啓動tcpdump,所以須要安裝了s6-svscan 服務駐守程序。
我簡單把dockerfile內容供參考吧
FROM nginx:1.12.1-alpine RUN apk update RUN apk add tcpdump RUN apk add s6 COPY ./services /etc/s6/services RUN chmod +x /etc/s6/services/nginx/run RUN chmod +x /etc/s6/services/nginx/finish RUN chmod +x /etc/s6/services/tcpdump/run RUN chmod +x /etc/s6/services/tcpdump/finish CMD ["s6-svscan", "/etc/s6/services"]
注意要本身編寫 services目錄下面的服務啓動文件 run和關閉文件finish,具體的你們google一下吧(爲何不百度,由於它呵呵我。)
可以關掉任務很開心