一. 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 錯誤,如圖所示 :

這時先執行第三步安裝 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 同時使用。