【Nginx】Nginx 反向代理

1. 正向代理

舉一個例子:大家都知道,現在國內是訪問不了國外的很多網站的,那麼怎麼才能訪問國外的那些網站呢?我們又想,國外不是能訪問 國外的那些網站嗎(這不廢話,肯定可以啊),如果我們電腦的對外公網 IP 地址能變成美國的 IP 地址,那不就可以訪問那些網站了。

這裏說的是做正向代理的。正向代理服務器位於客戶端和服務器之間,爲了向服務器獲取數據,客戶端要向代理服務器發送一個請求,並指定目標服務器,代理服務器將目標服務器返回的數據轉交給客戶端。這裏客戶端是要進行一些正向代理的設置的。

2. 反向代理

  • 反向代理和正向代理的區別就是:正向代理代理客戶端,反向代理代理服務器。

反向代理,其實客戶端對代理是無感知的,因爲客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器去選擇目標服務器獲取數據後,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址,隱藏了真實服務器IP地址。

理解這兩種代理的關鍵在於代理服務器所代理的對象是什麼,正向代理代理的是客戶端,我們需要在客戶端進行一些代理的設置。而反向代理代理的是服務器,作爲客戶端的我們是無法感知到服務器的真實存在的。

  • 總結起來還是一句話:正向代理代理客戶端,反向代理代理服務器。

3. Nginx反向代理實操

3.1 反向代理實例一

訪問 www.siyi.com 直接跳轉到 服務器的8080端口。
首先,上面那個域名我沒有 尷尬 所以我們可以設置自己電腦,使使用這個域名訪問時相當於使用服務器的ip;
首先我們直接使用服務器ip訪問8080端口

現在我們先通過修改本地 host 文件,將 www.siyi.com 映射到 服務器的ip

配置完成之後,我們便可以通過 www.123.com:8080 訪問到第一步出現的 Tomcat 初始界面。

然後在 nginx.conf 配置文件中增加如下配置

如上配置,我們監聽 80 端口,訪問域名爲 www.123.com,不加端口號時默認爲 80 端口,故訪問該域名時會跳轉到 127.0.0.1:8080 路徑上。
然後重新加載nginx服務
再次訪問www.siyi.com

3.2 反向代理實例二

實現效果:使用 nginx 反向代理, 根據訪問的路徑跳轉到不同端口的服務中nginx 監聽端口爲 9001,
訪問 http://127.0.0.1:9001/edu/ 直接跳轉到 127.0.0.1:8080
訪問 http://127.0.0.1:9001/vod/ 直接跳轉到 127.0.0.1:8081

首先我們可以準備兩個tomcat,一個端口爲8080,一個端口爲8081,然後在兩個tomcat目錄下的webapps目錄中分別創建一個edu的文件夾和vod的文件夾,裏面分別裝一個a.html文件

配置nginx,添加一個server塊

    server {
        listen      9001;
        server_name 192.168.0.101;
    
       location ~ /edu/ {
            root html;
            proxy_pass http://127.0.0.1:8080;
            index index.html index.htm;
        }  
    
        location ~ /vod/ {
            proxy_pass http://127.0.0.1:8081;
        }
    }


保存後重啓nginx,

3. 相關指令介紹

3.1 listen

該指令用於配置網絡監聽。主要有如下三種配置語法結構:

  1. 配置監聽的IP地址
listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]
    [accept_filter=filter] [bind] [ssl];
  1. 配置監聽端口
listen port[default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ipv6only=on|off] [ssl];
  1. 配置 UNIX Domain Socket
listen unix:path [default_server]  [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ssl];

面的配置看似比較複雜,其實使用起來是比較簡單的:

listen *:80 | *:8080 #監聽所有80端口和8080端口
listen  IP_address:port   #監聽指定的地址和端口號
listen  IP_address     #監聽指定ip地址所有端口
listen port     #監聽該端口的所有IP連接

下面分別解釋每個選項的具體含義:

1. address:IP地址,如果是 IPV6地址,需要使用中括號[] 括起來,比如[fe80::1]等。
2. port:端口號,如果只定義了IP地址,沒有定義端口號,那麼就使用80端口。
3. path:socket文件路徑,如 var/run/nginx.sock等。
4. default_server:標識符,將此虛擬主機設置爲 address:port 的默認主機。(在 nginx-0.8.21 之前使用的是 default 指令)
5. setfib=number:Nginx-0.8.44 中使用這個變量監聽 socket 關聯路由表,目前只對 FreeBSD 起作用,不常用。
6. backlog=number:設置監聽函數listen()最多允許多少網絡連接同時處於掛起狀態,在 FreeBSD 中默認爲 -1,其他平臺默認爲511.
7. rcvbuf=size:設置監聽socket接收緩存區大小。
8. sndbuf=size:設置監聽socket發送緩存區大小。
9. deferred:標識符,將accept()設置爲Deferred模式。
10. accept_filter=filter:設置監聽端口對所有請求進行過濾,被過濾的內容不能被接收和處理,本指令只在 FreeBSD 和 NetBSD 5.0+ 平臺下有效。filter 可以設置爲 dataready 或 httpready 。
11. bind:標識符,使用獨立的bind() 處理此address:port,一般情況下,對於端口相同而IP地址不同的多個連接,Nginx 服務器將只使用一個監聽指令,並使用 bind() 處理端口相同的所有連接。
12. ssl:標識符,設置會話連接使用 SSL模式進行,此標識符和Nginx服務器提供的 HTTPS 服務有關。

3.2 server_name

該指令用於虛擬主機的配置。通常分爲以下兩種:

  • 基於名稱的虛擬主機配置
    語法格式如下:
server_name   name ...;
  1. 對於name 來說,可以只有一個名稱,也可以有多個名稱,中間用空格隔開。而每個名字由兩段或者三段組成,每段之間用“.”隔開。
server_name siyi.com www.siyi.com
  1. 可以使用通配符“*”,但通配符只能用在由三段字符組成的首段或者尾端,或者由兩端字符組成的尾端。
server_name *.siyi.com www.siyi.*
  1. 還可以使用正則表達式,用“~”作爲正則表達式字符串的開始標記。
server_name ~^www\d+\.siyi\.com$;

該表達式“”表示匹配正則表達式,以www開頭(“^”表示開頭),緊跟着一個09之間的數字,在緊跟“.siyi.co”,最後跟着“m”($表示結尾)

以上匹配的順序優先級如下:

  1. 準確匹配 server_name
  2. 通配符在開始時匹配 server_name 成功
  3. 通配符在結尾時匹配 server_name 成功
  4. 正則表達式匹配 server_name 成功
  • 基於 IP 地址的虛擬主機配置
    語法結構和基於域名匹配一樣,而且不需要考慮通配符和正則表達式的問題。
server_name 192.168.0.104

3.3 location

該指令用於匹配 URL。
語法如下:

location [ = | ~ | ~* | ^~] uri {

}
1. = :用於不含正則表達式的 uri 前,要求請求字符串與 uri 嚴格匹配,如果匹配成功,就停止繼續向下搜索並立即處理該請求。
2. ~:用於表示 uri 包含正則表達式,並且區分大小寫。
3. ~*:用於表示 uri 包含正則表達式,並且不區分大小寫。
4. ^~:用於不含正則表達式的 uri 前,要求 Nginx 服務器找到標識 uri 和請求字符串匹配度最高的 location 後,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字符串做匹配。

注意:如果 uri 包含正則表達式,則必須要有 ~ 或者 ~* 標識。

3.4 proxy_pass

該指令用於設置被代理服務器的地址。可以是主機名稱、IP地址加端口號的形式。
語法結構如下:

proxy_pass URL;

URL 爲被代理服務器的地址,可以包含傳輸協議、主機名稱或IP地址加端口號,URI等。

proxy_pass  http://www.siyi.com/uri;

3.5 index

該指令用於設置網站的默認首頁。
語法爲:

index  filename ...;

後面的文件名稱可以有多個,中間用空格隔開。

index  index.html index.jsp;

通常該指令有兩個作用:第一個是用戶在請求訪問網站時,請求地址可以不寫首頁名稱;第二個是可以對一個請求,根據請求內容而設置不同的首頁。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章