nginx本身自帶的功能比較少,但之所以nginx仍然這麼強大,因為它支援第三方模組。
這裡我們以安裝echo-nginx-module模組為例。未安裝echo-nginx-module這個模組的情況下,在nginx組態檔中如果使用"ehco"命令,就會出現unknown directive "echo"的報錯。起初我也不明白這是什麼情況,最後百度才知道是缺少echo-nginx-module這個模組。
首先需要下載echo-nginx-module模組的tar.gz包到本地。點選這裡進入下載介面!
#複製連結地址後,使用wget工具下載到本地/usr/local/src目錄下
[root@nginx-server ~]# cd /usr/local/src/ #進入/usr/local/src/目錄下
[root@nginx-server src]# wget https://github.com/openresty/echo-nginx-module/archive/v0.62.tar.gz #下載0.62版本
[root@nginx-server src]# ls
v0.62.tar.gz
下載完成後,將其解壓。
[root@nginx-server src]# tar xf v0.62.tar.gz #解壓安裝包
[root@nginx-server src]# ls
echo-nginx-module-0.62 v0.62.tar.gz
[root@nginx-server nginx-1.18.0]# ./configure \ #設定
> --prefix=/usr/local/nginx \ #指定安裝路徑
> --add-module=/usr/local/src/echo-nginx-module-0.62 #安裝第三方模組
[root@nginx-server nginx-1.18.0]# make #編譯
[root@nginx-server nginx-1.18.0]# make install #安裝
[root@nginx-server nginx-1.18.0]# /usr/local/nginx/sbin/nginx #啟動nginx
[root@nginx-server ~]# nginx -V #檢視之前的安裝資訊
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments: --prefix=/usr/local/nginx #這條便是上次安裝所設定的引數,可以複製使用哦!
[root@nginx-server nginx-1.18.0]# ./configure \ #重新進行編譯設定
> --prefix=/usr/local/nginx/ \
> --add-module=/usr/local/src/echo-nginx-module-0.62 #安裝第三方模組
[root@nginx-server nginx-1.18.0]# make #編譯,切記沒有make install
[root@nginx-server nginx-1.18.0]# cp objs/nginx /usr/local/nginx/sbin/nginx #將編譯目錄下objs/nginx檔案直接覆蓋老的 nginx檔案
cp:是否覆蓋"/usr/local/nginx/sbin/nginx"? y
[root@nginx-server nginx-1.18.0]# /usr/local/nginx/sbin/nginx -s reload #過載nginx
tips:重新編譯的時候,記得使用nginx -V檢視之前的設定,把以前編譯過的模組一同加到configure引數中。
平滑升級是指線上上業務不停止的情況下,進行nginx的升級。nginx方便的幫助我們實現平滑升級,其過程簡單概括,就是:
① 在不停掉老程序的情況下,啟動新程序。
② 老程序負責處理任然沒有處理完的請求,但不在接受處理請求。
③ 新程序接受新請求。
④ 老程序處理完所有請求,關閉所有連線後停止。
⑤ 這樣就很方便的實現了平滑升級。一般有兩種情況下需要升級nginx,一種是確實需要升級nginx的新版本,另一種是要為nginx新增新模組。
① 主程序支援的訊號
信 號 | 解 釋 |
---|---|
TERM,INT | 立即退出 |
QUIT | 等待工作程序結束後再退出 |
KILL | 強制終止程序 |
HUP | 重新載入組態檔,使用新的組態檔啟動程序,並逐步關閉舊程序 |
USR1 | 重新開啟紀錄檔檔案 |
USR2 | 啟動新的主程序,實現熱升級 |
WINCH | 逐步關閉工作程序 |
② 工作程序支援的訊號
信 號 | 解 釋 |
---|---|
TERM,INT | 立即退出 |
QUIT | 等待請求結束後在退出 |
USR1 | 重新開啟紀錄檔檔案 |
注:本篇以 Nginx-1.14.2 → Nginx-1.18.0 為例進行演示。
① 處理防火牆
[root@nginx-server ~]# systemctl stop firewalld #關閉firewalld防火牆
[root@nginx-server ~]# systemctl disable firewalld #開機不自啟
[root@nginx-server ~]# setenforce 0 #關閉selinux防火牆(臨時生效)
[root@nginx-server ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config #關閉selinux防火牆(永久生效,通常需要重新啟動生效,這裡與臨時生效配合使用,相當於開機不自啟)
② 編譯安裝nginx-1.14.2
#安裝依賴
[root@nginx-server ~]# yum install gcc-c++ openssl openssl-devel zlib zlib-devel pcre pcre-devel -y
#將rpm包下載到/usr/local/src/目錄下
[root@nginx-server ~]# cd /usr/local/src/ //進入/usr/local/src目錄下
[root@nginx-server src]# [root@localhost ~]# wget http://nginx.org/download/nginx-1.14.2.tar.gz //下載rpm包
#進行安裝前的準備
[root@nginx-server src]# groupadd -r nginx //建立nginx使用者組
[root@nginx-server src]# useradd -r -g nginx nginx //建立nginx使用者
[root@nginx-server src]# tar zxvf nginx-1.14.2.tar.gz -C /usr/local/src //解壓安裝包
#進行安裝
[root@nginx-server src]# cd nginx-1.14.2
[root@nginx-server src]# ./configure --prefix=/opt/data/nginx --user=nginx --group=nginx --with-http_stub_status_module //設定
[root@nginx-server nginx-1.14.2]# make && make install //編譯並安裝
#啟動nginx
[root@server03 nginx-1.14.2]# /opt/data/nginx/sbin/nginx
#檢視是否啟動成功
[root@server03 nginx-1.14.2]# ps -ef | grep nginx
root 9783 1 0 16:54 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 9784 9783 0 16:54 ? 00:00:00 nginx: worker process
root 9792 7097 0 16:54 pts/0 00:00:00 grep --color=auto nginx
③ 檢視已安裝nginx的版本及安裝模組
[root@server03 nginx-1.14.2]# /opt/data/nginx/sbin/nginx -V
nginx version: nginx/1.14.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments: --prefix=/opt/data/nginx --user=nginx --group=nginx --with-http_stub_status_module
④ 備份已安裝nginx檔案
[root@nginx-server ~]# cp /opt/data/nginx/sbin/nginx /opt/data/nginx/sbin/nginx_$(date '+%F')
[root@nginx-server ~]# cp /opt/data/nginx/conf/nginx.conf /opt/data/nginx/conf/nginx.conf_$(date '+%F')
⑤ 模擬工作狀態
#用另一個終端進行指令碼迴圈測試,讓nginx一直處於工作狀態
[root@server01 ~]# while true ;do curl 192.168.140.131 ;sleep 5 ;done
⑥ 編譯安裝nginx-1.18.0
#將rpm包下載到/usr/local/src/目錄下
[root@nginx-server ~]# cd /usr/local/src/ //進入/usr/local/src目錄下
[root@nginx-server src]# wget http://nginx.org/download/nginx-1.18.0.tar.gz //下載rpm包
#進行安裝
[root@nginx-server src]# cd nginx-1.18.0
[root@nginx-server src]# ./configure --prefix=/opt/data/nginx --user=nginx --group=nginx --with-http_stub_status_module //設定
[root@nginx-server nginx-1.14.2]# make && make install //編譯並安裝
⑦ 傳送USR2訊號
#向主程序傳送USR2訊號,Nginx會啟動一個新版本的Master程序和工作程序,和舊版本一起處理請求。
[root@nginx-server nginx-1.18.0]# ps -ef | grep nginx | grep -v grep
root 9783 1 0 16:54 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx #主程序
nginx 9784 9783 0 16:54 ? 00:00:00 nginx: worker process
[root@nginx-server nginx-1.18.0]# kill -USR2 9783
[root@nginx-server nginx-1.18.0]# ps -ef | grep nginx | grep -v grep
root 9783 1 0 16:54 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 9784 9783 0 16:54 ? 00:00:00 nginx: worker process
root 12462 9783 0 17:11 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 12463 12462 0 17:11 ? 00:00:00 nginx: worker process
⑧ 傳送WINCH訊號
#向原Nginx主程序傳送WINCH訊號,它會逐步關閉其下的工作程序(主程序不退出),這時所有請求都會由新版本處理。
[root@nginx-server nginx-1.18.0]# kill -WINCH 9783
[root@nginx-server nginx-1.18.0]# ps -ef | grep nginx | grep -v grep #原nginx的工作程序已經退出
root 9783 1 0 16:54 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
root 12462 9783 0 17:11 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 12463 12462 0 17:11 ? 00:00:00 nginx: worker process
⑨ 傳送HUP訊號(非必須,看情況)
#如果需要回滾操作,可向原Nginx主程序傳送HUP訊號,它會重新啟動工作程序,仍使用舊版本組態檔。然後可以將新版本Nginx程序殺死(使用QUIT,TERM,或者KIll)
⑩ 殺死原Nginx主程序,升級結束
[root@nginx-server nginx-1.18.0]# kill 9783 #殺死原Nginx主程序
[root@nginx-server nginx-1.18.0]# ps -ef | grep nginx | grep -v grep
root 12462 1 0 17:11 ? 00:00:00 nginx: master process /opt/data/nginx/sbin/nginx
nginx 12463 12462 0 17:11 ? 00:00:00 nginx: worker process
[root@nginx-server nginx-1.18.0]# /opt/data/nginx/sbin/nginx -V #檢視現在的Nginx版本
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments: --prefix=/opt/data/nginx --user=nginx --group=nginx --with-http_stub_status_module