nginx之安裝第三方模組及平滑升級

2020-09-30 14:00:24

一、安裝第三方模組

  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

1、未安裝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    #編譯
[root@nginx-server nginx-1.18.0]# make install    #安裝
[root@nginx-server nginx-1.18.0]# /usr/local/nginx/sbin/nginx    #啟動nginx

2、已安裝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引數中。

二、平滑升級

1、什麼是平滑升級?

  平滑升級是指線上上業務不停止的情況下,進行nginx的升級。nginx方便的幫助我們實現平滑升級,其過程簡單概括,就是:
     在不停掉老程序的情況下,啟動新程序。
     老程序負責處理任然沒有處理完的請求,但不在接受處理請求。
     新程序接受新請求。
     老程序處理完所有請求,關閉所有連線後停止。
     這樣就很方便的實現了平滑升級。一般有兩種情況下需要升級nginx,一種是確實需要升級nginx的新版本,另一種是要為nginx新增新模組。

2、訊號的接受和處理

① 主程序支援的訊號

信 號解 釋
TERM,INT立即退出
QUIT等待工作程序結束後再退出
KILL強制終止程序
HUP重新載入組態檔,使用新的組態檔啟動程序,並逐步關閉舊程序
USR1重新開啟紀錄檔檔案
USR2啟動新的主程序,實現熱升級
WINCH逐步關閉工作程序

② 工作程序支援的訊號

信 號解 釋
TERM,INT立即退出
QUIT等待請求結束後在退出
USR1重新開啟紀錄檔檔案

3、範例

  注:本篇以 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