1. 程式人生 > 實用技巧 >nginx是怎麼處理http請求的?

nginx是怎麼處理http請求的?

nginx首先決定要用配置檔案裡的哪個server{}塊來處理,假設有下面的server{}配置

server {
    listen      80;
    server_name aaa;
    ...
}

server {
    listen      80;
    server_name bbb;
    ...
}

nginx會根據過來的http請求頭裡的Host欄位裡的值,來判斷使用哪個server{}。

  • 如果請求頭裡沒有Host欄位,或者Host欄位裡的值,和Nginx配置檔案裡的server{}裡的{server_name}都不匹配,則使用第一個server{},來處理這個請求。
  • 如果請求頭裡的Host欄位裡的值和Nginx配置檔案裡的某個server{}裡的{server_name},匹配上了,則使用這個server{},來處理這個請求。

可以使用curl工具來方便的做實驗,curl可以設定http請求的請求頭,所以可以任意設定Host欄位,用【-H】來設定。下面的10.210.65.73是安裝了nginx的機器的IP地址。

所以用下面的命令,傳送了http請求後,nginx就會使用server{server_name aaa}來處理這個請求。

curl.exe -H "Host: aaa" 10.210.65.73

非常重要的結論:server_name對應的是http請求頭裡的Host欄位的值,有了上面的理論支撐,就可以很容易的設定反向代理和負載均衡:

  • 當過來的http請求頭裡的Host欄位為aaa時,storage.test來處理。
  • 當過來的http請求頭裡的Host欄位為bbb時,tracker.test來處理。
   #負載均衡配置,IP為129的機器配置高,所以給他的數字的27,就是讓它多處理
   upstream storage.test {
     server 10.210.65.129:80 weight=27;
     server 10.210.65.130:80 weight=1;
   }

   #負載均衡配置
   upstream tracker.test {
     server 10.210.65.52:80 weight=7;
     server 10.210.65.53:80 weight=2;
   }

   #檔案的儲存
   server {
       listen       80;
       server_name  aaa;
       location / {
            #http:://後面的內容是自己定義,對應上面upstream的名字
            proxy_pass  http://storage.test;
       }
   }

   #檔案伺服器tracker
   server {
       listen       80;
       server_name  bbb;

       location / {
            #http:://後面的內容是自己定義的,對應上面upstream的名字
            proxy_pass http://tracker.test;
       }

   }

廣州VI設計公司https://www.houdianzi.com

server{}裡的listen監聽的是誰的埠?

監聽的是:傳送過來http請求的程序(大部分是瀏覽器)的埠(如果是http請求,則為埠為80),不是nginx伺服器自己程序的埠。

nginx根據http請求頭的Host欄位裡的值,和傳送過來http請求的程序(大部分是瀏覽器)的埠,來決定使用哪個server{}來處理http請求。