一、nginx反向代理流程
反向代理:使用代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡中的上游服務器,并將上游服務器得到的結果返回給請求連接的客戶端,代理服務器對外表現就是一個web服務器。Nginx就經常拿來做HTTP反向代理服務器。
Nginx具有強悍的高并發高負載能力,所以一般會作為前端服務器直接向客戶端提供靜態文件服務。但是一些復雜、多變的業務不適合放Nginx上,一般會使用Apache、Tomcat等服務器來處理。因此,Nginx一般會作為靜態web服務器與反向代理服務器,將不適合自己處理的請求轉發給上游服務器處理。
在這里插入圖片描述
Nginx代理服務器處理過程:
1.接受HTTP請求,將用戶的請求(包括HTTP包體)完整的接受到Nginx服務器的磁盤或者內存中。
2.向上游服務器發起連接
3.將緩存的客戶端請求轉發到上游服務器
Nginx的這種轉發方式與Squid等代理服務器的處理方式不同,Squid是一邊接收客戶端請求,一邊將請求轉發到上游服務器。相比之下 ,Nginx延長了一個請求處理的時間,并且增加了用于緩存請求內容的內存和磁盤空間。 但是Nginx有效的降低了上游服務器的負載,將壓力放在了Nginx服務器上。
那么Nginx的這種機制是如何降低上游服務器的負載的呢?通常情況下,客戶端與Nginx代理服務器走公網,代理服務器與上游服務器之間走內網。如果一邊接受客戶端請求,一般將請求轉發到上游服務器的話,上游服務器需要長時間的保存這個連接,增加上游服務器的并發壓力。但是如果是接受到完整請求之后,再轉發給上游服務器的話,內網的速度更快,不需要那么長的時間保持連接,可以減低上游服務器的并發壓力。
二、nginx反向代理具體執行過程
以訪問:http://nginx.test.com為例:
1、當HTTP請求交給Nginx處理時,首先Nginx會取出header頭中的Host (此處也就是 nginx.test.com),然后將其與所有的配置文件中的每個server段中的server_name進行匹配,以此決定到底有哪個server塊來處理這個請求。(當然有時也可能一個Host與多個server塊中的server_name都匹配,這時會根據匹配的優先級選擇實際處理的server塊)
2、此時我們可以看到HTTP請求匹配到了server_name nginx.test.com;,這樣接下來nginx就會在當前server塊中匹配到 location / 。
3、接下來繼續由nginx處理可以看到 location / { proxy_pass http://hellonginx; } ; 這就是進行反向代理處理,這個例子中使用的是nginx的upstream模塊進行反向代理實現。
4、通過proxy_pass http://hellonginx; 中的 hellonginx 可以找到對應的upstream塊,然后,可以根據其中的 server 127.0.0.1:8080 ;再次進行代理請求到目標服務器。
?