背景
本人主修的編程語言是Java語言,因此最開始接觸的Web開發也是JSP技術。使用Java開發的Web應用需要部署在專門的服務器程序上運行,比如Tomcat。但是一般很少會有人將Tomcat作爲用戶直接訪問的服務器的,一般都是使用nginx或者Apache進行反向代理。我使用的是nginx。nginx是一個俄羅斯程序員開發的服務器程序,它本身只能提供靜態資源的服務,但它的優點在於併發訪問量可以達到非常大的水平。
反向代理的優點
反向代理的主要優點是提高併發訪問數。單獨一個Tomcat服務器能提供的併發訪問數不高,如果在主機上部署多個Tomcat服務器,使用nginx進行反向代理,動態調整用戶的請求到不同的Tomcat服務器(這個過程稱爲負載均衡),就可以使併發訪問量和單個Tomcat服務器相比得到成倍的提升。
動靜資源分離也常常和反向代理在一起被提起,比如你部署了一個Java Web應用,這是一個動態資源,需要Tomcat提供服務(由反向代理實現),但你的網站上同時還有其他的比如純HTML的網頁、圖片等等靜態資源,這些靜態資源就可以由nginx直接提供給訪問者,減少了調用Tomcat而產生的多餘資源消耗,同樣靜態資源可以獲得相當大的一個併發訪問量。
可以畫一張圖來更清晰地表明反向代理的工作流程。
- 用戶請求動態資源
- 用戶請求靜態資源
具體配置方法
配置的方法有很多,我以我自己的實現方法來進行講解。
首先找到nginx的配置文件nginx.conf。如果是使用yum安裝的nginx那麼它的默認路徑是在/etc/nginx/中。在該文件中找到:
server {
listen 80;
server_name localhost;
location / {
root /user/share/nginx/html;
index index.html index.htm;
}
……
也有可能和上述內容有些許不同,重點是listen 80
,只要找到它,就確定了位置。
80端口一般代表http協議,也就是我們在瀏覽器上輸入網址或者IP地址時默認使用的訪問協議。server_name
用於配置虛擬主機,我們現在暫時用不到。重點在location
。location後面代表訪問的虛擬目錄,/
代表根目錄,,也就是直接輸入域名或IP地址訪問的目錄,以本地主機爲例,就是直接在瀏覽器裏輸入127.0.0.1。在location的大括號裏面,root代表的是虛擬目錄映射在本地主機上的實際目錄,如果是使用yum方式安裝的nginx,那麼它的默認訪問目錄是/user/share/nginx/html
。index後面代表的是該目錄的首頁文件,像示例中就設定了首頁文件爲index.html或者index.htm。
假如我們要用nginx反向代理tomcat,並且希望在瀏覽器直接輸入主機的IP地址
時訪問到nginx默認的首頁,而輸入主機的IP地址/tomcat
時訪問到tomcat上的內容,我們就要這樣配置。
server {
listen 80;
server_name localhost;
location / {
root /user/share/nginx/html;
index index.html index.htm;
}
location /tomcat {
proxy_pass http://127.0.0.1:8080;
}
……
加上去的內容就相當於告訴nginx,在用戶訪問IP地址/tomcat
時,就將訪問請求傳遞到8080端口(因爲tomcat默認運行在8080端口,如果修改過tomcat默認運行端口,就將8080改成修改後的端口號)。
這樣配置完成後,我們就同時實現了動靜資源分離和反向代理。直接訪問IP地址
時,nginx給用戶的是靜態資源,減小計算資源的消耗,訪問IP地址/tomcat
時則由tomcat提供服務,實現了反向代理。
上面講的是最基本的配置反向代理和動靜分離的方法,還有更加高級的方法,比如設置不同的三級域名訪問到不同的目錄,動靜分離特定格式的文件等等。在此我不做展開,大家有興趣可以去網上尋找其他資料。