背景
本人主修的程式設計語言是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提供服務,實作了反向代理。
上面講的是最基本的配置反向代理和動靜分離的方法,還有更加進階的方法,比如設定不同的三級域名通路到不同的目錄,動靜分離特定格式的檔案等等。在此我不做展開,大家有興趣可以去網上尋找其他資料。