nginx頁面載入不全或提示502bad gateway,nginx反向 Proxy連接埠號碼丟失 bad gateway什麼意思 樂視502 bad gateway dnf 502 bad gateway

來源:互聯網
上載者:User

Nginx反向 Proxy模式下出現頁面載入不全,或直接出現502 bad gateway的情況。

出現502 bad gateway的情況有很多,大多是一些nginx相關timeout的設定問題。下文討論一種比較少見但又不得不注意的情況。

出現環境

nginx工作在反向 Proxy模式下,監聽非80連接埠(這點很重要,監聽非80連接埠往往意味著使用者準備配置多個虛擬機器主機,但不限於此情境),以ip形式訪問(應該在網域名稱訪問的情況下也存在,這點沒去驗證)。

具體問題

訪問包含多個元素的頁面(指不僅僅是靜態html頁面,用戶端往往會向伺服器請求多個元素,片,css格式等等),用戶端訪問到的頁面不完整,缺乏圖片樣式等元素,返回502 bad gateway錯誤。

問題分析

一開始接觸這個問題是,以為是host欄位值非法,被後端伺服器給屏蔽了,當初這樣認為的理由如下:
1. 假設nginx監聽的地址是1.1.1.1:2001,代理的地址是2.2.2.2,Proxy 伺服器配置在upstream裡,如下:
listen 1.1.1.1:2001;

upstream backend1 {
server 2.2.2.2;
}

proxy_set_header Host $host;
proxy_pass http://backend1;
2. 在上述配置下,通過wireshark抓包,用戶端訪問nginx代理,也就是1.1.1.1:2001時,請求的host為,Host:1.1.1.1,如果沒設定proxy_set_header, nginx訪問後端server的host為,Host:backend1

(Nginx官方文檔提到:Allows redefining or appending fields to the request header passed to the proxied server. The value can contain text, variables, and their combinations. These directives are inherited from the previous level if and only if there are no proxy_set_header directives defined on the current level. By default, only two fields are redefined:
proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

如果設定了proxy_set_header Host $host,這時nginx訪問後端server的host為1.1.1.1。不論哪種情況,如果後端server出於安全考慮對請求包host欄位做了限制(只有為2.2.2.2,即server本身的地址才合理),那麼所有host欄位不正確的訪問都會被deny或重新導向或其他處理掉,不會正常訪問,所以遇到這個問題時,開始以為是後端的server作了限制。
3. 後來思考,如果後端server真對訪問包的host欄位作了限制,應該不會有頁面載入不全的情況,畢竟很少有server對某部分元素做限制而某部分不做。通過進一步抓包分析,client在第一次訪問包含多個元素的頁面後,server會將這個頁面中包含的其他元素地址告訴client,以便client繼續請求擷取來得到一個資訊完整的網頁,而server告訴client的其他元素的地址的ip:port恰恰與nginx與server通訊的host欄位相同(可以理解,nginx做反向 Proxy),如果host中沒設定連接埠,預設是80(這就是為什麼nginx監聽80連接埠往往沒有問題),client會依據這個返回的地址來擷取頁面元素。
4. 所以在上面的情況,如果設定了proxy_set_header Host $host,client訪問頁面其他元素的地址將是http://1.1.1.1/…,可以看到,還是通過nginx代理,但問題來了:nginx監聽的是1.1.1.1:2001,而新來的訪問是1.1.1.1:80(http連接埠預設80,https預設443),所以無法通過nginx來代理請求。

解決方式

解決辦法也很簡單,就是proxy_set_header Host $host:$server_port,這樣會將nginx監聽的連接埠加上去。

後記

雖然這次證明並非是因server對Host欄位限制而影響的訪問,但個人認為host欄位的限制問題是值得注意的,nginx官方也推薦對於非法host的訪問是直接deny的。

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });

    以上就介紹了nginx頁面載入不全或提示502bad gateway,nginx反向 Proxy連接埠號碼丟失,包括了bad gateway方面的內容,希望對PHP教程有興趣的朋友有所協助。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.