nginx如何處理請求


有必要了解一下nginx轉發請求的方式,弄清它是如何轉發請求的對我們理解nginx的server塊的配置很有意義(雖然我也還不是很明白)

上一節說了配置文件中可以有多個server塊,所以這里我配置2個server塊,來看當以不同域名(虛擬主機地址)發送請求時,nginx將該請求轉發到了哪里

1.首先2個server塊配置如下

 server { listen 80; server_name hanmk.com; location / { root /tmp/data/; autoindex on; } } server { listen 80 default_server; server_name demo.com ;
 location / { # tomcat首頁 proxy_pass http://localhost:8080; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } location /jenkins { #tomcat部署jenkins proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; #獲取真實ip proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#獲取代理者的真實ip proxy_redirect off; } location /ApprPhD { #nodeJs服務器 proxy_pass http://192.168.XXX.XXX:3030; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; #獲取真實ip proxy_set_header REMOTE-HOST $remote_addr; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#獲取代理者的真實ip proxy_redirect off; } }

說明:

第1個server中,把服務指向了服務器 /tmp/data/路徑下的靜態文件;

第2個server中,把服務指向了3個路由(一個路由指向擬機本地部署的tomcat首頁,一個指向tomcat下部署的jenkins,一個指向另一台虛擬機上部署的應用)

兩個server中配置的監聽端口都是80(也是為了更好地查看測試效果)

server_name指定(虛擬主機)服務器名稱,一般會配置域名(example.org ,www.example.org,可以使用精確的名稱、通配符名稱或正則表達式定義;當你在外網訪問一個請求鏈接時,nginx會根據你填寫的主機名稱來匹配是轉發到server1還是server2)

同樣為了更好地查看測試效果,我在server_name中填寫域名,而不是填寫虛擬機真實的ip或者localhost(因為ip地址都是虛擬機ip,填寫ip地址的話,看不出來nginx是如何轉發請求的)(另外,如果只有一個server的話,server_name其實沒有填寫的必要,因為最終都會轉發至該server下的服務器,我試了下,只要端口正確,都可以轉發成功,內部原理還不清楚。。。)

server1中server_name填寫hanmk.com

server2中server_name填寫demo.com

完成上述配置后,需要重新加載一下配置文件nginx.conf

2.配置客戶端的hosts文件

在第一步中分別在server_name中配置了hanmk.com和demo.com,但是因為並沒有開通域名服務,所以直接在客戶端使用這2個域名來發送請求,是會失敗的,所以為了能夠使用這兩個假域名正常發送請求,要先在客戶端主機配置一下,步驟如下:

打開hosts文件,添加如下兩行即可(因為映射ip地址相同,所以把兩個域名加在一行也可以,用空格隔開)

3.測試

(1)使用http://hanmk.com/發送請求,訪問到的是虛擬機 /tmp/data/路徑下的靜態文件

(2)分別訪問http://demo.com/、http://demo.com/jenkins、http://demo.com/ApprPhD/index,結果如下

 說明nginx根據訪問鏈接域名的不同匹配到了相應的server服務器,然后再根據location路徑,路由到對應的服務

 


 

補充:上面第2個server塊中,監聽端口后有一個參數 default_server

當一個請求host名與任何一個server_name都不匹配時,那么這個請求會默認轉向第一個server(這是nginx的標准默認行為),此外也可以顯式地設置哪個服務器應該是默認的,並在listen指令中使用default_server參數

示例1:在兩個server塊中都不加default_server參數

然后以ip地址進行訪問 :http://192.168.233.128/

因為ip地址不匹配hanmk.com和demo.com,所以默認轉發到了第一個server塊

示例2:在第二個sever塊中加上default_server參數,如下

server { listen 80 default_server; server_name demo.com ; #charset koi8-r;

訪問:http://192.168.233.128/

同樣的ip鏈接,轉發到了第二個server塊

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM