記阿里雲SLB后配置Nginx反向代理百度地圖API的坑


需求

百度的原始請求:
https://api.map.baidu.com/place/v2/suggestion?query=s&region=sc&city_limit=true&output=json&ak=dl0tuE2WhjbHyqKcHevxXRYnLjV53OZm

代理為:

https://api.example.com/proxy/baidu/suggestion?query=s&region=sc&city_limit=true&output=json&ak=dl0tuE2WhjbHyqKcHevxXRYnLjV53OZm

順序

 

Client –》 SLB –》 Nginx-Proxy –>baidu.com api   -阿里雲環境

Clinet –>Nginx  -> Nginx-Proxy –>baidu.com api  - 測試環境

問題

在自建環境中,沒有任何問題,但是發布到阿里雲SLB(service load balance)之后,居然百度端會報
參數無效。

 

我們是采用Bitbucket來管理Nginx-proxy, 由於采用的是Docker執行,整體上倒是很方便,就是相比直接部署來說,每次發布時間要長一些。(由於是全自動化,倒是可以喝個水,溜下單身狗什么的)

image

 

# 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 來獲得請求。

 

比較結果:
image

發現過程就是用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一下吧(為什么不百度,因為它呵呵我。)

能夠關掉任務很開心

 

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM