Nginx——nginx 反向代理目錄

1、代理

2、正向代理

3、反向代理

4、Nginx 反向代理

5、Nginx 反向代理相關指令介紹①、listen②、server_name③、location④、proxy_pass⑤、index

資料推薦

Nginx 伺服器的反向代理服務是其最常用的重要功能,由反向代理服務也可以衍生出很多與此相關的 Nginx 伺服器重要功能,比如後面會介紹的負載均衡。本篇部落格我們會先介紹 Nginx 的反向代理,當然在瞭解反向代理之前,我們需要先知道什麼是代理以及什麼是正向代理。

前些天發現了一個巨牛的人工智慧學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點選跳轉到網站。

回到頂部

1、代理

在Java設計模式中,代理模式是這樣定義的:給某個物件提供一個代理物件,並由代理物件控制原物件的引用。

可能大家不太明白這句話,在舉一個現實生活中的例子:比如我們要買一間二手房,雖然我們可以自己去找房源,但是這太花費時間精力了,而且房屋質量檢測以及房屋過戶等一系列手續也都得我們去辦,再說現在這個社會,等我們找到房源,說不定房子都已經漲價了,那麼怎麼辦呢?最簡單快捷的方法就是找二手房中介公司(為什麼?別人那裡房源多啊),於是我們就委託中介公司來給我找合適的房子,以及後續的質量檢測過戶等操作,我們只需要選好自己想要的房子,然後交錢就行了。

代理簡單來說,就是如果我們想做什麼,但又不想直接去做,那麼這時候就找另外一個人幫我們去做。那麼這個例子裡面的中介公司就是給我們做代理服務的,我們委託中介公司幫我們找房子。

Nginx 主要能夠代理如下幾種協議,其中用到的最多的就是做Http代理伺服器。

Nginx——nginx 反向代理目錄

回到頂部

2、正向代理

弄清楚什麼是代理了,那麼什麼又是正向代理呢?

這裡我再舉一個例子:大家都知道,現在國內是訪問不了 Google的,那麼怎麼才能訪問 Google呢?我們又想,美國人不是能訪問 Google嗎(這不廢話,Google就是美國的),如果我們電腦的對外公網 IP 地址能變成美國的 IP 地址,那不就可以訪問 Google了。你很聰明,VPN 就是這樣產生的。我們在訪問 Google 時,先連上 VPN 伺服器將我們的 IP 地址變成美國的 IP 地址,然後就可以順利地訪問了。

這裡的 VPN 就是做正向代理的。正向代理伺服器位於客戶端和伺服器之間,為了向伺服器獲取資料,客戶端要向代理伺服器傳送一個請求,並指定目標伺服器,代理伺服器將目標伺服器返回的資料轉交給客戶端。這裡客戶端是要進行一些正向代理的設定的。

PS:這裡介紹一下什麼是 VPN,VPN 通俗的講就是一種中轉服務,當我們電腦接入 VPN 後,我們對外 IP 地址就會變成 VPN 伺服器的 公網 IP,我們請求或接受任何資料都會透過這個VPN 伺服器然後傳入到我們本機。這樣做有什麼好處呢?比如 VPN 遊戲加速方面的原理,我們要玩網通區的 LOL,但是本機接入的是電信的寬頻,玩網通區的會比較卡,這時候就利用 VPN 將電信網路變為網通網路,然後在玩網通區的LOL就不會卡了(注意:VPN 是不能增加頻寬的,不要以為不卡了是因為網速提升了)。

可能聽到這裡大家還是很抽象,沒關係,和下面的反向代理對比理解就簡單了。

回到頂部

3、反向代理

反向代理和正向代理的區別就是:

正向代理代理客戶端,反向代理代理伺服器。

  

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

下面我們透過兩張圖來對比正向代理和方向代理:

Nginx——nginx 反向代理目錄

Nginx——nginx 反向代理目錄

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

總結起來還是一句話:

正向代理代理客戶端,反向代理代理伺服器。

回到頂部

4、Nginx 反向代理

範例:使用 nginx 反向代理 www。123。com 直接跳轉到127。0。0。1:8080

①、啟動一個 tomcat,瀏覽器位址列輸入 127。0。0。1:8080,出現如下介面

Nginx——nginx 反向代理目錄

②、透過修改本地 host 檔案,將 www。123。com 對映到 127。0。0。1

127。0。0。1 www。123。com

將上面程式碼新增到 Windows 的host 檔案中,該檔案位置在:

Nginx——nginx 反向代理目錄

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

那麼如何只需要輸入 www。123。com 便可以跳轉到 Tomcat初始介面呢?便用到 nginx的反向代理。

③、在 nginx。conf 配置檔案中增加如下配置:

Nginx——nginx 反向代理目錄

1 server {2 listen 80;3 server_name www。123。com;4 5 location / {6 proxy_pass http://127。0。0。1:8080;7 index index。html index。htm index。jsp;8 }9 }

Nginx——nginx 反向代理目錄

如上配置,我們監聽80埠,訪問域名為www。123。com,不加埠號時預設為80埠,故訪問該域名時會跳轉到127。0。0。1:8080路徑上。

我們在瀏覽器端輸入 www。123。com 結果如下:

Nginx——nginx 反向代理目錄

④、總結

其實這裡更貼切地說是透過nginx代理埠,原先訪問的是8080埠,透過nginx代理之後,透過80埠就可以訪問了。

回到頂部

5、Nginx 反向代理相關指令介紹

①、listen

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

一、配置監聽的IP地址

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred] [accept_filter=filter] [bind] [ssl];

二、配置監聽埠

listen port[default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [ssl];

三、配置 UNIX Domain Socket

listen unix:path [default_server] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ssl];

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

1 listen *:80 | *:8080 #監聽所有80埠和8080埠2 listen IP_address:port #監聽指定的地址和埠號3 listen IP_address #監聽指定ip地址所有埠4 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 服務有關。

②、server_name

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

1、基於名稱的虛擬主機配置

語法格式如下:

server_name name 。。。;

一、對於name 來說,可以只有一個名稱,也可以有多個名稱,中間用空格隔開。而每個名字由兩段或者三段組成,每段之間用“。”隔開。

server_name 123。com www。123。com

二、可以使用萬用字元“*”,但萬用字元只能用在由三段字元組成的首段或者尾端,或者由兩端字元組成的尾端。

server_name *。123。com www。123。*

三、還可以使用正則表示式,用“~”作為正則表示式字串的開始標記。

server_name ~^www\d+\。123\。com$;

該表示式“~”表示匹配正則表示式,以www開頭(“^”表示開頭),緊跟著一個0~9之間的數字,在緊跟“。123。co”,最後跟著“m”($表示結尾)

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

1 ①、準確匹配 server_name2 ②、萬用字元在開始時匹配 server_name 成功3 ③、萬用字元在結尾時匹配 server_name 成功4 ④、正則表示式匹配 server_name 成功

2、基於 IP 地址的虛擬主機配置

語法結構和基於域名匹配一樣,而且不需要考慮萬用字元和正則表示式的問題。

server_name 192。168。1。1

③、location

該指令用於匹配 URL。

語法如下:

1 location [ = | ~ | ~* | ^~] uri {2 3 }

1、= :用於不含正則表示式的 uri 前,要求請求字串與 uri 嚴格匹配,如果匹配成功,就停止繼續向下搜尋並立即處理該請求。

2、~:用於表示 uri 包含正則表示式,並且區分大小寫。

3、~*:用於表示 uri 包含正則表示式,並且不區分大小寫。

4、^~:用於不含正則表示式的 uri 前,要求 Nginx 伺服器找到標識 uri 和請求字串匹配度最高的 location 後,立即使用此 location 處理請求,而不再使用 location 塊中的正則 uri 和請求字串做匹配。

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

④、proxy_pass

該指令用於設定被代理伺服器的地址。可以是主機名稱、IP地址加埠號的形式。

語法結構如下:

proxy_pass URL;

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

proxy_pass http://www。123。com/uri;

⑤、index

該指令用於設定網站的預設首頁。

語法為:

index filename 。。。;

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

index index。html index。jsp;

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

參考文件:苗澤老師的《Nginx高效能Web伺服器詳解》

回到頂部

資料推薦

最近又趕上跳槽的高峰期(招聘旺季),好多讀者都問我要有沒有最新面試題,找華為朋友整理一份內部資料《第6版:網際網路大廠面試題》並分類 4 份 PDF,累計 926 頁!

整個資料包,包括 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多執行緒、JPA、MyBatis、MySQL、大資料、Nginx、Git、Docker、GitHub、Servlet、JavaWeb、IDEA、Redis、演算法、面試題等幾乎覆蓋了 Java 基礎和阿里巴巴等大廠面試題等、等技術棧!

Nginx——nginx 反向代理目錄

據說已經有小夥伴透過這套資料,成功的入職了螞蟻金服、位元組跳動等大廠。

Nginx——nginx 反向代理目錄

而且,這些資料不是掃描版的,裡面的文字都可以直接複製,非常便於我們學習:

Nginx——nginx 反向代理目錄