1. 程式人生 > >Nginx 與Tomcat 實現動靜態分離、負載均衡

Nginx 與Tomcat 實現動靜態分離、負載均衡

一. Nginx 簡介:

Nginx 一個高效能的 HTTP 和反向代理伺服器, 具有很高的穩定性和支援熱部署、模組擴充套件也很容易。當遇到訪問的峰值,或者有人惡意發起慢速連線時,也很可能會導致伺服器實體記憶體耗盡頻繁交換,失去響應,只能重啟伺服器, Nginx 採取了分階段資源分配技術,處理靜態檔案和無快取的反向代理加速,實現了負載均衡和容錯,在這樣高併發的訪問情況下,能經受起高併發的處理。

二. Nginx 安裝與配置

第一步:下載 Nginx  安裝包 

第二步:在 linux 上安裝 Nginx 

1.#tar zxvf nginx-1.7.8.tar.gz  // 解壓

2.#cd nginx-1.7.8

3.#./configure --with-http_stub_status_module --with-http_ssl_module// 啟動 server 狀態頁和 https 模組

會報缺少 PCRE library 錯誤,如圖所示 :

這時先執行第三步安裝 PCRE  ,然後在 3 執行一下,這就可以了

4.make && make install // 編譯並安裝

5. 測試一下安裝配置是否正確 ,Nginx 安裝在 /usr/local/nginx

#/usr/local/nginx/sbin/nginx -t ,如圖所示:

第三步:在 linux 上安裝 PCRE 

1.#tar zxvf pcre-8.10.tar.gz  // 解壓

2.cd pcre-8.10

3../configure

4.make && make install// 編譯並安裝

三. Nginx +Tomcat  實現動靜態分離

動靜態分離就是 Nginx 處理客戶端的請求的靜態頁面 (html 頁面 ) 或者圖片, Tomcat處理客戶端請求的動態頁面( jsp 頁面),因為 Nginx 處理的靜態頁面的效率高於Tomcat 。

第一步:我們要配置 Nginx 檔案

#vi /usr/local/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1
; error_log logs/error.log; pid logs/nginx.pid; events { use epoll; worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; keepalive_timeout 65; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; server { listen 80 default; server_name localhost; <span style="color:#ff0000;"> location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ //由nginx處理靜態頁面</span> { root /usr/tomcat/apache-tomcat-8081/webapps/ROOT; expires 30d; //快取到客戶端30天 } error_page 404 /404.html; #redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } <span style="color:#ff0000;"> location ~ \.(jsp|do)$ {//所有jsp的動態請求都交給Tomcat處理 </span> <span style="color:#ff0000;"> proxy_pass http://192.168.74.129:8081; //來自jsp或者do的字尾的請求交給tomcat處理</span> proxy_redirect off; proxy_set_header Host $host; //後端的Web伺服器可以通過X-Forwarded-For獲取使用者真實IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; //允許客戶端請求的最大單檔案位元組數 client_body_buffer_size 128k; //緩衝區代理緩衝使用者端請求的最大位元組數 proxy_connect_timeout 90; //nginx跟後端伺服器連線超時時間 proxy_read_timeout 90; //連線成功後,後端伺服器響應時間 proxy_buffer_size 4k; //設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小 proxy_buffers 6 32k; //proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設定 proxy_busy_buffers_size 64k;//高負荷下緩衝大小(proxy_buffers*2) proxy_temp_file_write_size 64k; //設定快取資料夾大小,大於這個值,將從upstream伺服器傳 } } }

第二步:在 tomcat  下的 webapps/ROOT 下新建 index.html 靜態頁面,如圖所示:

第三步:啟動 Nginx 服務

#sbin/nginx   如圖所示:

第四步:我們頁面訪問 http://192.168.74.129/index.html  能正常顯示正常的內容, 如圖所示:

第五步:測試 Nginx  和 Tomcat 高併發的情況下處理靜態頁面效能如何?

採用了 Linux  ab 網站壓力測試命令來測試一下效能

1. 測試一下 Nginx  處理靜態頁面的效能

ab -c 100 -n 1000 http://192.168.74.129/index.html

這個表示同時處理 100 個請求並執行 1000 次 index.html 檔案 , 如圖所示:

2. 測試一下 Tomcat 處理靜態頁面的效能

ab -c 100 -n 1000 http://192.168.74.129:8081/index.html

這個表示同時處理 100 個請求並執行 1000 次 index.html 檔案 , 如圖所示:

相同的處理靜態檔案, Nginx 處理的靜態效能比 Tomcat  好。 Nginx 每秒能請求5388 次,而 tomcat 只請求 2609 次。

總結:我們在 Nginx 配置檔案中,配置靜態交給 Nginx 處理,動態請求交給 Tomcat,提供了效能。

四. Nginx +Tomcat  負載均衡與容錯

我們在高併發的情況下,為了提高伺服器的效能,減少了單臺伺服器的併發壓力,我們採用了叢集部署,還能解決為了避免單臺伺服器掛掉,服務不能訪問這種情況下,處理容錯問題。

第一步:我們這邊部署了兩天 tomcat 伺服器, 192.168.74.129:8081 和192.168.74.129:8082

第二步: Nginx 作為了代理伺服器,客服端請求伺服器端時,採用了負載均衡來處理,這樣就能平均的把客服端請求分發到每一天伺服器,這樣減少伺服器端的壓力。配置 Nginx 下的 nginx.conf 檔案。

#vi /usr/local/nginx/conf/nginx.conf

#user  nobody;
worker_processes  1;
error_log  logs/error.log;
pid	   logs/nginx.pid;
events {
use epoll;
worker_connections  1024;
}
http {
include	   mime.types;
default_type  application/octet-stream;
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" "$http_x_forwarded_for"';
access_log  logs/access.log  main;
sendfile		on;
keepalive_timeout  65;
gzip on;  
gzip_min_length  1k;  
gzip_buffers	 4  16k;  
gzip_http_version 1.0;  
gzip_comp_level 2;  
gzip_types  text/plain application/x-javascript text/css application/xml;  
gzip_vary on;  
<span style="color:#ff0000;">upstream localhost_server {
ip_hash;
server 192.168.74.129:8081;
server 192.168.74.129:8082;
}</span>
server {
listen	   80 default;
server_name  localhost;
   <span style="color:#ff0000;">  location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ //由nginx處理靜態頁面</span>
 { 
  root   /usr/tomcat/apache-tomcat-8081/webapps/ROOT; 
   expires	  30d; //快取到客戶端30天
   } 
error_page  404			  /404.html;
#redirect server error pages to the static page /50x.html
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   html;
}
  <span style="color:#ff0000;">location ~  \.(jsp|do)$  {//所有jsp的動態請求都交給Tomcat處理 </span>
   <span style="color:#ff0000;">proxy_pass http://localhost_server;  //來自jsp或者do的字尾的請求交給tomcat處理</span>
proxy_redirect off;
proxy_set_header Host $host;	//後端的Web伺服器可以通過X-Forwarded-For獲取使用者真實IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;   //允許客戶端請求的最大單檔案位元組數
client_body_buffer_size 128k; //緩衝區代理緩衝使用者端請求的最大位元組數
 proxy_connect_timeout 90;   //nginx跟後端伺服器連線超時時間
 proxy_read_timeout 90;	 //連線成功後,後端伺服器響應時間
 proxy_buffer_size 4k;	  //設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小
 proxy_buffers  6  32k;	   //proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設定
proxy_busy_buffers_size 64k;//高負荷下緩衝大小(proxy_buffers*2)
   proxy_temp_file_write_size 64k; //設定快取資料夾大小,大於這個值,將從upstream伺服器傳
}
}  
}

說明:

1.upstream 中的 server 是指向伺服器的 IP (域名)和埠,後面還可以帶引數

1)weight :設定伺服器的轉發權重 預設值是 1 。

2)max_fails : 是與 fail_timeout 配合使用,是指在 fail_timeout 時間段內,如果伺服器轉發失敗次數超過 max_fails 設定的值,這臺伺服器就不                     可用,max_fails 預設值是 1

3)fail_timeout : 表示在該時間段內轉發失敗多少次就認為這臺伺服器不能用。

4)down :表示這臺伺服器不能用。

5)backup :表示使 ip_hash 設定的針對這臺伺服器無效,只有在所有非備份的伺服器都失效後,才會向伺服器轉發請求。

2.ip_hash 設定是在叢集的伺服器中,如果同一個客戶端請求轉發到多個伺服器上,每臺伺服器可能快取同一份資訊,這會造成資源的浪費,採用的 ip_hash 設定會把同一個客戶端第二次請求相同的資訊時,會轉發到第一次請求的伺服器端。但 ip_hash不能和 weight  同時使用。