最近剛接觸nginx,在網上查閱了相關資料,看到最多的形容nginx的詞就是反向 Proxy,反向 Proxy是什麼了。一直都不是很理解,於是在網上查了反向 Proxy,下面給出百度百科對反向 Proxy的解釋。
百度百科解釋:反向 Proxy(Reverse Proxy)方式是指以Proxy 伺服器來接受internet上的串連請求,然後將請求轉寄給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求串連的用戶端,此時Proxy 伺服器對外就表現為一個反向 Proxy伺服器。
通過上面的解釋很容易理解nginx反向 Proxy的意思,也就是說nginx就相當於Proxy 伺服器。用戶端發出請求,並不是直接被tomcat伺服器接收處理,而是要先經過nginx,nginx再轉寄給tomcat伺服器;tomcat處理完成返回結果後,也是先經過nginx,nginx再返回用戶端。在整個過程中,nginx貌似充當了真正的伺服器,其實並不是,nginx只是起到了轉寄的作用。
根據反向 Proxy的特性,我們可以把不需要伺服器處理的靜態資源(HTML,JS,CSS等)直接讓nginx處理,JSP等讓伺服器處理,這樣就減輕了伺服器的壓力。
下面來實現一下利用nginx代理轉寄tomcat的執行個體:
1.環境配置
安裝nginx,安裝步驟可參考: Linux系統下Nginx的安裝
安裝tomcat,tomcat安裝很簡單,直接壓縮包解壓就行,這裡就不再細說。
2.運行環境
nginx安裝完成並啟動過後,在瀏覽器直接輸入Linux系統的IP地址,即可訪問,如下所示:
3.配置解析
看到這是不是很好奇,為什麼直接輸入IP就可以進入nginx,是在哪配置的了。看一下nginx的設定檔,一般預設在nginx檔案夾下有個conf檔案夾,裡面有個nginx.conf,開啟發現裡面有一段如下配置:
這段代碼是在設定檔中的server中,一個server相當於一個Proxy 伺服器,可以配置多個server。
裡面幾個屬性的意思分別是:
listen:代表當前Proxy 伺服器的訪問連接埠號碼,預設是80連接埠。如果要配置多個server,這裡的預設連接埠需要改變,要不然系統不知道進入哪個代理服務。
server_name:表示代理服務需要轉寄的地址,預設是localhost。
location:表示匹配用戶端發送請求的路徑,這裡“/”代表所有請求的路徑都能匹配。
root:表示請求別匹配到後,會在這個檔案夾內尋找相應的檔案,root對後面靜態資源的處理很重要。
index:如果代理沒有指定首頁,將預設進入index配置下尋找首頁,可以配置多個,第一個首頁找不到,訪問第二個,以此類推。
error_page:代表發生錯誤後進入的相關錯誤頁面,下面的location也是處理錯誤的相關配置。
PS:剛剛說的nginx.conf路徑在安裝的時候是可以通過–conf-path=配置的,我在安裝的時候就指定了“/etc/nginx/nginx.conf” 這個路徑。但是我還在預設路徑下面找設定檔,確實能找到,但是nginx服務用的並不是這個,而是我安裝時指定的設定檔。所以在後面的操作中就悲劇了,怎麼改設定檔都沒反應,一開始以為什麼地方配置的不對,浪費了好幾個小時的時間,所以在此提醒大家一下。題外話,接下來說正事。
3.配置轉寄tomcat
轉寄tomcat的配置很簡單,只需要在原來的配置上面修改兩個地方,如下:
這裡配置的proxy_pass屬性工作表示代理路徑,nginx可以直接轉寄到該連結。
PS:只配置了一個server情況下,server_name可有可無,系統不會載入該配置。有多個server情況下,server_name必須要配置,nginx服務會根據該配置匹配。
修改完配置過後,別急著重啟nginx服務,怎麼。還有東西要配置。 當然不是,nginx支援熱部署,也就是修改設定檔過後,不需要重啟服務生效,只需要讓nginx重新載入一下即可,很方便吧。如果在載入配置之前想檢查一下設定檔是否有語法錯誤,可以輸入“nginx -t”來檢查錯誤。如下:
接下來重新整理剛剛訪問nginx的頁面,發現訪問的頁面已經變成我們要轉寄的tomcat了,頁面如下:
頁面效果和我們直接輸入“http://172.16.21.92:8080/”的效果一樣。
4.動、靜資源分離
上面說了根據nginx反向 Proxy的特性,可以實現用戶端訪問靜態資源時,不請求tomcat伺服器,減少伺服器壓力。要想實現該功能同樣的需要配置nginx.conf的server配置,如下:
上面代碼新加了一個location配置,用於過濾靜態檔案,當用戶端請求這些靜態檔案時,nginx會轉寄到“/usr/local/ROOT/”檔案夾下(ROOT檔案夾是從tomcat的webapps裡面拷貝出來的),從而不需要請求伺服器。
這時再重新整理訪問nginx的頁面,發現頁面沒有變化,但是點擊tomcat首頁"Security Considerations HOW-TO"串連,發現報404錯誤,如下圖:
這時為什麼了。 原因是這個html頁面是在tomcat 的webapps裡面的docs檔案夾下,但是我們配置靜態資源轉寄路徑是到ROOT檔案夾下面,nginx找不到HTML檔案,所以就報404錯誤。同時也驗證了配置的靜態資源與伺服器分離是沒有問題的。