天天看點

Nginx 與Tomcat 實作動靜态分離、負載均衡

一. Nginx 簡介:

Nginx 一個高性能的 HTTP 和反向代理伺服器, 具有很高的穩定性和支援熱部署、子產品擴充也很容易。當遇到通路的峰值,或者有人惡意發起慢速連接配接時,也很可能會導緻伺服器實體記憶體耗盡頻繁交換,失去響應,隻能重新開機伺服器, Nginx 采取了分階段資源配置設定技術,處理靜态檔案和無緩存的反向代理加速,實作了負載均衡和容錯,在這樣高并發的通路情況下,能經受起高并發的處理。

二. Nginx 安裝與配置

第一步:下載下傳 Nginx  安裝包 

http://nginx.org/en/download.html

第二步:在 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 錯誤,如圖所示 :

Nginx 與Tomcat 實作動靜态分離、負載均衡

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

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

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

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

Nginx 與Tomcat 實作動靜态分離、負載均衡

第三步:在 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 與Tomcat 實作動靜态分離、負載均衡

第三步:啟動 Nginx 服務

#sbin/nginx   如圖所示:

Nginx 與Tomcat 實作動靜态分離、負載均衡

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

Nginx 與Tomcat 實作動靜态分離、負載均衡

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

采用了 Linux  ab 網站壓力測試指令來測試一下性能

1. 測試一下 Nginx  處理靜态頁面的性能

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

這個表示同時處理 100 個請求并運作 1000 次 index.html 檔案 , 如圖所示:

Nginx 與Tomcat 實作動靜态分離、負載均衡

2. 測試一下 Tomcat 處理靜态頁面的性能

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

這個表示同時處理 100 個請求并運作 1000 次 index.html 檔案 , 如圖所示:

Nginx 與Tomcat 實作動靜态分離、負載均衡

相同的處理靜态檔案, 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  同時使用。