我用nginx作反向 Proxy,代理到百度(www.baidu.com),測試時在本地修改了host檔案。把www.baidu.com解析到nginxProxy 伺服器(74.91.23.207)上
# vim /etc/hosts
下面看一下nginx的設定檔段 (其中:server 115.239.210.27 是百度的伺服器位址)
接下來,在瀏覽器中輸入 www.baidu.com ,發送一個Http請求,ping一下可以看到它是向74.91.23.207發送的請求。
那麼請求到達74.91.23.207後,nginx是怎麼處理的呢
看一下wireshark抓的包 (Fliter : ip.src == 192.168.100.11 && http.host =="www.baidu.com"&&http.request.method =="GET")
結合上面的GET包資料解釋:
1.當HTTP請求交給Nginx處理時,首先Nginx會取出header頭中的Host (此處也就是 www.baidu.com),然後將其與所有的設定檔中的每個server段中的server_name進行匹配,以此決定到底有哪個server塊來處理這個請求。(當然有時也可能一個Host與多個server塊中的server_name都匹配,這時會根據匹配的優先順序選擇實際處理的server塊,優先順序這裡就不再細說。)
2.此時我們可以看出HTTP請求匹配到了中的server_name,這樣接下來nginx就會根據header中的Request URI欄位進行與location匹配,如上面設定檔的所示,匹配到了 location / 。
3.接下來繼續由nginx處理可以看到 proxy _pass http://rocdn ; 這就是進行反向 Proxy處理,這個例子中使用的是nginx的upstream模組進行反向 Proxy實現。
4.通過proxy _pass http://rocdn ; 中的 rocdn 可以找到對應的upstream塊,然後,可以根據其中的server 115.239.210.27:80;再次進行代理請求,
此時發送的GET包內容:Host欄位 and Request URI欄位 都和上面一樣,
5.當代理HTTP請求到達 百度的伺服器:115.239.210.27後,若百度也是nginx,則伺服器會對其進行類似上面的nginx處理HTTP請求一樣,進行server_name 和 location匹配,並將相應的請求資源返回Proxy 伺服器。
6.Nginx反向 Proxy伺服器接收到百度伺服器的返回資源後,再將其返回給用戶端瀏覽器。
以上就是Nginx作反響代理時HTTP請求與處理的大致流程。