Nginx是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器。在Java的Web架構中,一般使用Tomcat和Nginx進行配合,Nginx做爲反向代理服務器,能夠對後臺的Tomcat服務器負載均衡,也可讓Nginx處理靜態頁面的請求、Tomcat處理JSP頁面請求達到動靜分離的目的。php
Nginx ("engine x") 是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器,是由Igor Sysoev爲俄羅斯訪問量第二的Rambler.ru站點開發的。其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。css
截止到2014年12月31日,Nginx僅次於apache成爲第二大web服務器軟件,而在全球最忙碌top10000網站中使用比例更是高達42.7%。其發展速度和流行程度已經遠遠超過其它同類軟件,成爲大型網站和高併發網站的首選。java
Nginx由內核和一系列模塊組成,內核提供web服務的基本功能,如啓用網絡協議,建立運行環境,接收和分配客戶端請求,處理模塊之間的交互。Nginx的各類功能和操做都由模塊來實現。Nginx的模塊從結構上分爲核心模塊、基礎模塊和第三方模塊。node
核心模塊: HTTP模塊、EVENT模塊和MAIL模塊
基礎模塊: HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊
第三方模塊: HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊及用戶本身開發的模塊linux
這樣的設計使Nginx方便開發和擴展,也正所以才使得Nginx功能如此強大。Nginx的模塊默認編譯進nginx中,若是須要增長或刪除模塊,須要從新編譯Nginx,這一點不如Apache的動態加載模塊方便。若是有須要動態加載模塊,可使用由淘寶網發起的web服務器Tengine,在nginx的基礎上增長了不少高級特性,徹底兼容Nginx,已被國內不少網站採用。nginx
下面進入正題,對Nginx和Tomcat進行整合使用。首選是開發環境的搭建,包括JDK、Tomcat和Nginx。本文的實驗環境是Ubuntu。web
下載JDK,並解壓到指定目錄中。正則表達式
lap@lap-KVM:~$ wget http://120.52.72.24/download.oracle.com/c3pr90ntc0td/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz lap@lap-KVM:~$ tar zxvf jdk-7u79-linux-x64.tar.gz lap@lap-KVM:~$ sudo mv jdk1.7.0_79/ /usr/local/jdk
配置環境變量,在/etc/profile中添加JAVA_HOME等路徑。shell
export JAVA_HOME=/usr/local/jdk export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
加載環境變量。apache
lap@lap-KVM:~$ source /etc/profile
查看是否配置成功。
java -version
顯示如下結果則配置成功:
第二步是Tomcat的安裝。
下載Tomcat,並解壓到指定目錄中。
lap@lap-KVM:~$ wget http://apache.fayea.com/tomcat/tomcat-8/v8.5.9/bin/apache-tomcat-8.5.9.tar.gz lap@lap-KVM:~$ tar zxvf apache-tomcat-8.5.9.tar.gz lap@lap-KVM:~$ sudo mv apache-tomcat-8.5.9/ /usr/local/tomcat
關於Tomcat的配置以及設置普通用戶等在這裏就不提了。直接啓動Tomcat。
lap@lap-KVM:~$ sudo /usr/local/tomcat/bin/startup.sh
若出現如下提示,表示找不到JAVA_HOME的路徑
此時須要在Tomcat的bin目錄下的catalina.sh中加入如下信息:
再次啓動Tomcat,成功
此時就能夠打開http://localhost:8080,看到Tomcat的主頁。
接下來就是主角Nginx。
下載Nginx,解壓,安裝到指定目錄。
lap@lap-KVM:~$ wget http://labfile.oss.aliyuncs.com/nginx-1.7.9.tar.gz lap@lap-KVM:~$ tar zxvf nginx-1.7.9.tar.gz lap@lap-KVM:~$ cd nginx-1.7.9 lap@lap-KVM:~/nginx-1.7.9$ ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module lap@lap-KVM:~/nginx-1.7.9$ # make && make install
切換到Nginx的安裝目錄下,啓動Nginx。
lap@lap-KVM:~$ cd /usr/local/nginx/ lap@lap-KVM:/usr/local/nginx$ sudo ./nginx-1.7.9/objs/nginx
此時訪問http://localhost,將能夠看到Nginx的歡迎界面。(由於我不是直接在Nginx本機上訪問的,因此是用的Nginx服務器的IP:192.168.6.86來訪問的,本文接下去的部分都是這樣。)
Nginx能夠經過調整配置文件的參數,對性能進行優化。這個配置文件就是nginx.conf。
題外話,因爲使用Nginx常常須要編輯nginx.conf,咱們能夠藉助nginx.vim來使nginx.conf語法高亮,看起來更清晰明瞭。
到http://www.vim.org/scripts/sc...下載nginx.vim。
移動到/usr/share/vim/vim74/syntax/目錄
在/usr/share/vim/vim74/filetypr.vim中添加:
au BufRead,BufNewFile /usr/local/nginx/conf/* set ft=nginx
再打開nginx.conf,已經有語法高亮了:
nginx.conf裏面提供了不少能夠調節優化的地方,這裏簡要了解http模塊的幾個經常使用參數。這一部份內容參考實驗樓的教程。
如圖,是個人nginx.conf的配置
簡單介紹一下紅色方框內的一些配置參數。
第一個方框內的是關於日誌的設置:
log_format 定義日誌格式
access_log 設置是否保存訪問日誌,設置爲off能夠下降磁盤IO而提高速度。
第二個方框內的是一些基本設置:
sendfile 指向sendfile()函數。sendfile()在磁盤和TCP端口(或者任意兩個文件描述符)之間複製數據。sendfile()直接從磁盤上讀取數據到操做系統緩衝,所以會更有效率。
tcp_nopush 配置nginx在一個包中發送所有的頭文件,而不是一個一個發送。
tcp_nodelay 配置nginx不要緩存數據,快速發送小數據。
keepalive_timeout 指定了與客戶端的keep-alive連接的超時時間。服務器會在這個時間後關閉連接。
第三個方框內的是關於壓縮功能的設置:
gzip 打開壓縮功能能夠減小須要發送的數據的數量。
gzip_disable 爲指定的客戶端禁用 gzip 功能。
gzip_proxied 容許或禁止基於請求、響應的壓縮。設置爲any,就能夠gzip全部的請求。
gzip_comp_level 設置了數據壓縮的等級。等級能夠是 1-9 的任意一個值,9 表示最慢可是最高比例的壓縮。
gzip_types 設置進行 gzip 的類型。
接下來看一下http模塊中的子模塊server,以及server中的子模塊location的配置:
其中:
listen 表示當前的代理服務器監聽的端口,默認的是監聽80端口。
server_name 表示監聽到以後須要轉到哪裏去,localhost表示轉到本地,也就是直接到nginx文件夾內。
location 表示匹配的路徑。
root 表示到指定文件路徑尋找文件,可用於靜態文件。
index 表示默認主頁,能夠指定多個,按順序查找。
deny和allow 是訪問控制設置,禁止或容許某個IP或者某個IP段訪問。也能夠指定unix,容許socket的訪問。
limit_rate_after 設置不限速傳輸的響應大小。當傳輸量大於此值時,超出部分將限速傳送。
limit_rate 限制向客戶端傳送響應的速率限制。參數的單位是字節/秒,設置爲0將關閉限速。好比圖片中表示不限速部分爲3m,超過了3m後限速爲20k/s。
關於Nginx的更多配置解釋,能夠參考這篇博文,講的很是詳細。
注意,修改完配置文件後須要重啓nginx生效。固然,若是你的Nginx是用apt-get安裝的,能夠用nginx -s reload命令從新加載配置文件便可。
接下來就進入本文的主題,將Nginx和Tomcat整合在一塊兒使用。這部分工做其實也就是修改nginx.conf裏的配置。
具體的,在nginx.conf中新建一個location,用正則表達式將全部JSP的請求匹配到該location中:
其中最核心的就是"proxy_pass http://localhost:8080;"這條配置,它將匹配到的請求都轉發給Tomcat去處理。
其餘的配置:
proxy_set_header Host $host; 後端的Web服務器能夠經過X-Forwarded-For獲取用戶真實IP。
client_max_body_size 10m; 容許客戶端請求的最大單文件字節數。
client_body_buffer_size 128k; 緩衝區代理緩衝用戶端請求的最大字節數。
proxy_connect_timeout 90; Nginx跟後端服務器鏈接超時時間。
proxy_read_timeout 90; 鏈接成功後,後端服務器響應時間。
proxy_buffer_size 4k; 設置代理服務器保存用戶頭信息的緩衝區大小。
proxy_buffers 6 32k; proxy_buffers緩衝區。
proxy_busy_buffers_size 64k; 高負荷下緩衝大小。
proxy_temp_file_write_size 64k; 設定緩存文件夾大小。
此時訪問http://localhost/index.jsp,會發現跳轉到了Tomcat的頁面。可是你會發現,此時的頁面是這樣的:
這是由於雖然JSP的請求轉發給Tomcat的了,可是圖片、css等靜態文件卻找不到。因此接下來咱們要配置靜態文件的路徑,完成動靜分離。
對於靜態文件的請求,咱們也新建一個location,將常見圖片、css、js等請求匹配到該location中
如圖所示,配置很是簡單,經過root關鍵字,將匹配到的請求都到tomcat/webapps/ROOT目錄下直接查找。而expires 30d則表示使用expires緩存模塊,緩存到客戶端30天。
配置完後重啓Nginx。再輸入http://localhost/index.jsp,會發現此時的Tomcat頁面已經正常顯示了。咱們已經完成了JSP請求與靜態文件請求的動靜分離。可是實際上也只是顯示這個頁面而已,當你點擊頁面上的其餘連接時,會顯示404,這是顯然的,由於咱們只配置了ROOT目錄。
若是配置完仍然發現沒法讀取靜態文件,看看訪問http://localhost/tomcat.png時是否顯示403 forbidden。若是是的話就是由於權限問題致使的,這裏簡單的解決辦法是把nginx.conf首行的user設爲root:
固然,若是不想使用root用戶運行,能夠經過修改目錄訪問權限解決403問題,但不能把目錄放在root用戶宿主目錄下,放在任意一個位置並給它755,或者經過chown改變它的擁有者與Nginx運行身份一致也能夠解決權限問題。
接下來咱們來實驗一下負載均衡。
在nginx.conf中,經過配置upstream,能夠很輕鬆配置後臺服務器的負載均衡:
具體的,能夠在upstream中配置後臺Tomcat服務器的地址,這裏我是配置了兩臺服務器,分別是本機也就是192.168.6.86和192.168.6.32,其中本機安裝的是Tomcat8,另外一臺安裝的是Tomcat7,以示區別。而後在location中,將請求轉發給配置好的upstream處理。這裏爲了避免跟前面的配置產生衝突,我新配置了一個server,監聽8888端口。
而後,訪問http://localhost:8888。刷新幾回,會發現請求轉發到了不一樣的服務器上:
能夠看到,顯示的頁面分別是Tomcat7和Tomcat8的主頁,證實請求轉發成功。
另外,你也能夠在server後面加上一個權重weight,權重越大表示訪問到的機會越大,默認爲1。