Nginx中級篇-擴展第三方模塊

簡介

Nginx 是一款輕量級的 Web 服務器/反向代理及電子郵件代理服務器。其特點是佔有內存少,併發能力強,異步的,多個連接(萬級別)可以對應一個進程,進行響應。基於事件驅動模型。

Nginx 基礎-單機Nginx性能優化

Nginx ,Apache ,Tomcat 的簡單比較

Nginx

優點:負載均衡、反向代理、處理靜態文件優勢。

Apache

優點:Apache 是靜態解析,適合靜態 HTML 、圖片等,處理速度較快。雖然處理速度不及 Nginx,但是 Apache 提供的組件比 Nginx 多。

缺點:屬於同步多進程模型,一個連接對一個進程方式處理請求。在速度上和消耗來說,Apache 不能承受高併發,會導致宕機。

Tomcat

優點:處理動態請求,以線程的方式處理請求。

Nginx官方提供了Yum源安裝

因爲 Nginx 的一系列優點,所以已經慢慢成爲主流的 Web 服務器。

添加源

這裏講一下 Nginx 的 Yum 安裝方式,默認情況 Centos7 中無 Nginx 的源,最近發現 Nginx 官網提供了 Centos 的源地址。因此可以如下執行命令添加源:

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

安裝 Nginx

通過 yum search nginx 看是否已經添加源成功。
如果成功則執行下列命令安裝 Nginx。

sudo yum install -y nginx

啓動 Nginx 並設置開機自動運行

sudo systemctl enable nginx.service
sudo systemctl start nginx.service
sudo systemctl restart nginx.service

添加第三方擴展模塊

要知道,Nginx 本身集成模塊是有侷限性,所以有很多優秀的第三方模塊開發者開源了一些方便實用的模塊,提供給大家。

預處理安裝環境

爲了順利的安裝 Nginx 和它的擴展模塊,我們需要預裝下環境。

yum -y install libxml2 libxml2-dev libxslt-devel 
yum -y install gd-devel 
yum -y install perl-devel perl-ExtUtils-Embed 
yum -y install zip unzip

可編譯 Nginx 下載

因爲我們通過 Yum 下載的 Nginx 是無法重新編譯的。所以需要下載 Nginx 可編譯版本。

cd /usr/local/src
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar -zxvf nginx-1.14.2.tar.gz

第三方模塊下載

模塊擴展的操作是一樣的,首先確保 wget 命令可以使用,通過 wget 下載擴展文件到 /usr/local/src 文件夾、解壓。

健康檢查

在實際應用當中,如果你後端應用是能夠快速重啓的應用,比如 Nginx 的話,自帶的模塊是可以滿足需求的。但是需要注意。如果後端有不健康節點,負載均衡器依然會先把該請求轉發給該不健康節點,然後再轉發給別的節點,這樣就會浪費一次轉發。

可是,如果當後端應用重啓時,重啓操作需要很久才能完成的時候就會有可能拖死整個負載均衡器。此時,由於無法準確判斷節點健康狀態,導致請求 handle 住,出現假死狀態,最終整個負載均衡器上的所有節點都無法正常響應請求。

所以健康檢查模塊是非常重要的。nginx_upstream_check_module-master 這個就是淘寶技術團隊開發的 Nginx 模塊 ,通過它可以用來檢測後端 realserver 的健康狀態。如果後端 realserver 不可用,則所有的請求就不會轉發到該節點上。

模塊下載、解壓
wget -O /usr/local/src/nginx_upstream_check_module.zip https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master
unzip nginx_upstream_check_module.zip

interval 檢測間隔時間,單位爲毫秒,rsie 請求 2 次正常的話,標記此 realserver 的狀態爲 up,fall 表示請求 5 次都失敗的情況下,標記此 realserver 的狀態爲 down,timeout 爲超時時間,單位爲毫秒。

檢查規則配置示例:
upstream test {
    server [ip1]:[port1];
    server [ip2]:[port2];
    check interval=3000 rise=2 fall=5 timeout=1000;
}
清除緩存

我們爲了加速網站的訪問速度,所以很多時候需要緩存站點的靜態文件,但是對於緩存時間的控制,我們不是很好把握。雖然都有配置過期時間,但是在有些測試的情況下,我們只想修改部分緩存,這時候我們可以使用 purge 模塊來處理。

模塊下載、解壓
wget -O /usr/local/src/ngx_cache_purge-2.3.tar.gz  http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -zxvf ngx_cache_purge-2.3.tar.gz

ngx_cache_purge 模塊的作用:用於清除指定 url 的緩存。

緩存配置方式
#設置緩存空間,存儲緩存文件
proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50g inactive=168h;

#在location中使用緩存空間
location /pathname { 
	proxy_set_header X-Real-IP $remote_addr;
	proxy_cache nginx-cache;
	proxy_cache_valid 200 304 302 5d;
	proxy_cache_valid any 5d;
	proxy_cache_key '$host:$server_port$request_uri';
	add_header X-Cache '$upstream_cache_status from $host';
	proxy_set_header X-Real-IP $remote_addr;
	proxy_pass http://localhost/pathname;
}
緩存清除方式
http://[ip:port]/purge #清除所有緩存文件
http://[ip:port]/purge/test #清除單個文件夾緩存
http://[ip:port]/purge/test/123.jpg #清除單個文件
Session保持

疑問:我們爲什麼要用到 Session 保持?

首先,我們採用分佈式架構的時候,服務端的節點是很多的。Nginx 默認是無法保持 Session 會話的,所以當請求的服務端節點宕機的時候,我們需要重新登錄。想想用戶在下訂單,結果一下子給跳到登錄頁去了,這時候你可以想想用戶的臉色。
Nginx 負載均衡時會遇到會話保持的問題,常用的方法有:

  1. ip hash,根據客戶端的 IP,將請求分配到不同的服務器上
  2. cookie,服務器給客戶端下發一個 cookie,具有特定 cookie 的請求會分配給它的發佈者

sticky 是 nginx 的一個模塊,它是基於 cookie 的一種 nginx 的負載均衡解決方案,通過分發和識別 cookie ,來使同一個客戶端的請求落在同一臺服務器上,默認標識名爲 route。但是會導致一個問題,如果服務端節點宕機,那麼將會出現服務無法提供的情況。

注意:cookie 需要瀏覽器支持,且有時候會泄露數據。

模塊下載、解壓
wget -O /usr/local/src/nginx-sticky-module.zip https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip
unzip -D nginx-sticky-module.zip
sticky使用方式
upstream test {
   sticky expires=1h domain=xxx.com path=/;
   server [ip1]:[port1];
   server [ip2]:[port2];
}
sticky 配置規則
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] 
    [hash=index|md5|sha1] [no_fallback] [secure] [httponly];

[name=route]       設置用來記錄會話的cookie名稱
[domain=.foo.bar]    設置cookie作用的域名
[path=/]          設置cookie作用的URL路徑,默認根目錄
[expires=1h]        設置cookie的生存期,默認不設置,瀏覽器關閉即失效,需要是大於1秒的值
[hash=index|md5|sha1]   設置cookie中服務器的標識是用明文還是使用md5值,默認使用md5
[no_fallback]       設置該項,當sticky的後端機器掛了以後,nginx返回502 (Bad Gateway or Proxy Error) ,而不轉發到其他服務器,不建議設置
[secure]          設置啓用安全的cookie,需要HTTPS支持
[httponly]         允許cookie不通過JS泄漏,沒用過
吞吐量計算

實時統計網站的吞吐量,比較簡單,沒啥好說。這個主要觀察下服務器的帶寬、內存、硬盤等硬件資源能支撐多大壓力。

模塊下載、解壓
wget -O /usr/local/src/traffic-accounting-nginx-module.zip https://github.com/Lax/traffic-accounting-nginx-module/archive/master.zip
unzip -D traffic-accounting-nginx-module.zip
動態擴容、縮容

在分佈式服務下,我們會用 Nginx 做負載均衡。這裏考慮幾個問題:

  1. 網站上下線問題:單體應用更新站點的時候是直接覆蓋文件,然後重啓。這樣會造成請求中斷,如果是核心邏輯的請求中斷,勢必會影響數據的一致性,比如交易,訂單等,後果比較嚴重。
  2. 動態加減機器,比如某個站點訪問量大,要新增機器,那就需要修改 Nginx 的配置,然後 reload ,雖然 reload 很快,但是還是會有一瞬間的請求中斷。

所以我們在不需要重啓 Nginx 的基礎上,動態修改 Nginx 的配置,將是需求。ngx_dynamic_upstream 模塊很好的實現了上述功能。

模塊下載、解壓
wget -O /usr/local/src/ngx_dynamic_upstream.zip https://github.com/cubicdaiya/ngx_dynamic_upstream/archive/master.zip
unzip -D ngx_dynamic_upstream.zip

本模塊 Github 學習地址:https://github.com/cubicdaiya/ngx_dynamic_upstream

環境配置

將上述模塊進行統計的環境配置,然後編譯安裝。

cd /usr/local/src/nginx-1.14.2

./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/usr/local/src/ngx_cache_purge-2.3 --add-module=/usr/local/src/nginx_upstream_check_module-master/ --add-module=/usr/local/src/nginx-goodies-nginx-sticky-module-ng-08a395c66e42/ --add-module=/usr/local/src/ngx_dynamic_upstream-master  --add-module=/usr/local/src/traffic-accounting-nginx-module-master

編譯加載

cd /usr/local/src/nginx-1.14.2
make -j2
cp /usr/sbin/nginx /usr/sbin/nginx.bak #備份
cp /opt/nginx-1.14.2/objs/nginx /usr/sbin/nginx #替換
systemctl restart nginx #重啓 nginx 服務
nginx -t #檢查配置文件
nginx -V #查看nginx環境
nginx -s reload #重載配置文件

我們直接通過 systemctl restart nginx 多少會影響到正常業務使用。所以推薦使用 Nginx 平滑升級

Basic 安全認證

如果直接將 Nginx 訪問地址暴露出去,我們的服務配置全部可見,多少是有些不安全的。所以我們可以簡單的配置一下 Basic 認證,將陌生訪問者擋在外面。

yum -y install httpd-tools
htpasswd -c /etc/nginx/passwd.db pgy
#輸入密碼

# 使用示例
location / {
    auth_basic  "show me pass";
    auth_basic_user_file /etc/nginx/passwd.db;
}
有朋自遠方來,不亦樂乎?
爲提供更好的知識分享,歡迎提出建議、指正問題,博客:風流三月1,微信號是 pgy1607974129 ,公衆號是“ Ygo 工作室”。

關注公衆號,一起進步,一起成長。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章