我用nginx作反向代理,代理到百度(www.baidu.com),測試時在本地修改了host文件。把www.baidu.com解析到nginx代理服務器(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 ; 這就是進行反向代理處理,這個例子中使用的是nginx的upstream模塊進行反向代理實現。
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匹配,並將相應的請求資源返回代理服務器。
6.Nginx反向代理服務器接收到百度服務器的返回資源后,再將其返回給客戶端瀏覽器。
以上就是Nginx作反響代理時HTTP請求與處理的大致流程。
原文鏈接 :http://blog.csdn.net/yusiguyuan/article/details/39249497