nginxのサードパーティ製のモジュール(LUA)とホットアップグレード

要件:

特定の要求にnginxのは拒否し、特定の値を返します。

ソリューション:

結果を達成するためにLUAスクリプトを使用してください。

ステップ:

  1. インストールLuajit環境
  2. nginxの(コンフォーマルに元のnginxの-V 2つの新しいモジュールを再コンパイルしてngx_devel_kitlua-nginx-module
  3. ホットアップグレード(サービスの中断なし)

LUAスクリプトを追加するための設定ファイル:

#匹配请求体里的 hello=world时返回此变量和值
  location /hello {
    rewrite_by_lua_block {
    ngx.req.read_body()
    local own_a = ngx.req.get_post_args()["hello"]
    if ( own_a == "world" ) then
      ngx.say("hello world")
    end
    }
    proxy_pass  xxxx;
  }

まず、Luajit環境をインストールします

#安装lua-nginx模块需要先安装Luajit
$ tar xf LuaJIT-2.0.4.tar.gz 
$ cd LuaJIT-2.0.4
$ make PREFIX=/usr/local/luajit
$ make install PREFIX=/usr/local/luajit

$ cat <<EOF > /etc/profile.d/luajit.sh
export LUAJIT_LIB=/usr/local/luajit/lib
export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0
EOF

$ source /etc/profile.d/luajit.sh

#判断是否有库函数链接
if [ ! -f /lib64/libluajit-5.1.so.2 ];then
    ln -s /usr/local/luajit/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
fi
#添加库函数链接
if [ ! -f /lib64/libprofiler.so.0 ];then
    ln -sv /usr/local/lib/libprofiler.so.0.4.18 /lib64/libprofiler.so.0 || echo "/usr/local/lib/libprofiler.so.0.4.18 fasle,please check this" 
fi
#可以使用 ldd $(which /usr/local/nginx/sbin/nginx) 查看缺少的库文件

第二に、コンパイルされたバイナリファイル

最新のテストマシンnginxのコンパイル済みのバイナリファイルで(同じターゲットマシン環境)(CAN nginx -V同じと二つのモジュールを追加することができます)。マシンはまた、ディレクトリ上で直接コンパイルすることができますが、最終的にmake install、ターゲット環境のそれ以外のカバレッジを実行することはできません。

ターゲット環境:

#将生成的nginx二进制文件替换至目录机器
$ cd /usr/loca/nginx/sbin/
$ mv nginx{,_bak}   #先备份老的
$ mv /home/install_nginx/src/nginx ./    #将新的移动过来
$ nginx -t    #检查配置,这一步很重要,一但报错,说明nginx二进制文件编译有问题,需要重新核对环境信息并重新编译
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

$ nginx -s reload
$
$ curl -d "hello=world" http://192.168.20.13/hello
xxx                                 #返回结果不是hello world,lua脚本配置未生效。此时老的配置并不影响

エラー・ログの表示:

2019/10/08 17:25:22 [notice] 30580#0: signal process started
2019/10/08 17:25:22 [emerg] 22066#0: unknown directive "rewrite_by_lua_block" in /usr/local/nginx/conf/vhost/text.conf:41

認識されないrewrite_by_lua_block設定手順のluaスクリプトの設定は有効になりません。それは思わnginx -s reloadないだけというホットなアップグレードを通じて。

nginxのプロセスのみが再オープン新しいワーカープロセスをリロードし、各モジュールのとき、マスター初期化情報を開始します。だから、新しいモジュールは再起動またはホットアップグレードすることができます。

nginxの信号:

信号 シェル組み込みnginxの 説明
HUP nginxの-sリロード 設定ファイルをリロード
USR1 nginxのは、再度開く-s 丸太カットとして使用されるログファイル、構成MVを、再度開き
USR2 - ホットアップグレードプログラムnginxの
ウインチ - ワーカープロセスにエレガント閉じ関連
終了する nginxの-s SQUIT エレガントストップnginxの
TERM、INT nginxの-s停止 nginxの直後に停止します

ホットアップグレード送信信号:

$ kill -USR2 `cat /tmp/nginx.pid`
$
#执行完后查看进程,调接口都没生效
##查看error log
2019/10/08 17:25:41 [alert] 30599#0: execve() failed while executing new binary process "nginx" (2: No such file or directory)

上記のエラー:nginxのコマンドを見つけることができません。nginxのプログラムは、環境変数に依存している、と確かに絶対パスで最後のスタートは(nginxのは、直接甲斐コマンド)を開始しません。この状況はとても暑いアップグレードではありませんrestart、そしてrestart構成がを通じて、インタフェースの転送を有効になります。

アップグレードするnginxのホット右のステップ

[root@node2013 vhost]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf   #正确的启动nginx

再コンパイルサーバの実行可能ファイルをアップグレードするnginxの手順は、最初に古いファイル新しい実行可能ファイルを置き換える必要があります。後、USR2信号は、メインプロセスに送信されるべきです。まず、プロセスIDをファイルにメインプロセスは、/tmp/nginx.pid.oldbinとして.oldbinサフィックス、新しいファイルの名前を変更し、新しい実行可能ファイルを起動して、新しいワーカープロセスを開始します。

[root@node2013 vhost]# kill -USR2 `cat /tmp/nginx.pid`  #发送热升级信号
[root@node2013 vhost]# ps -ef | grep nginx            
root     31118     1  0 17:36 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody   31119 31118  0 17:36 ?        00:00:00 nginx: worker process
nobody   31120 31118  0 17:36 ?        00:00:00 nginx: worker process
nobody   31121 31118  0 17:36 ?        00:00:00 nginx: worker process
nobody   31122 31118  0 17:36 ?        00:00:00 nginx: worker process
root     31177 31118  0 17:36 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody   31178 31177  0 17:36 ?        00:00:00 nginx: worker process
nobody   31179 31177  0 17:36 ?        00:00:00 nginx: worker process
nobody   31180 31177  0 17:36 ?        00:00:00 nginx: worker process
nobody   31181 31177  0 17:36 ?        00:00:00 nginx: worker process
root     31185 30078  0 17:37 pts/0    00:00:00 grep --color=auto nginx
[root@node2013 vhost]# ll /tmp/
total 12
-rw-r--r-- 1 root   root     6 Oct  8 17:36 nginx.pid
-rw-r--r-- 1 root   root     6 Oct  8 17:36 nginx.pid.oldbin

$ curl -d "hello=world" http://192.168.20.13/hello  #正常返回结果,lua脚本生效。如未生效则直接发送`QUIT`信号给新的master进程。
hello world

すべての作業プロセスの後(新旧)要求を受け入れるように続けています。場合WINCHまたはQUIT信号は、第1メインプロセスに送信され、それは通常は閉じている必要があり、作業プロセスにメッセージを送信し、彼らが終了し始めます。

[root@node2013 vhost]# kill -QUIT `cat /tmp/nginx.pid.oldbin`       #优雅的退出进程
[root@node2013 vhost]# ps -ef | grep nginx              #最后查看效果,只剩下新的master和其worker进程
root     31177     1  0 17:36 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody   31178 31177  0 17:36 ?        00:00:00 nginx: worker process
nobody   31179 31177  0 17:36 ?        00:00:00 nginx: worker process
nobody   31180 31177  0 17:36 ?        00:00:00 nginx: worker process
nobody   31181 31177  0 17:36 ?        00:00:00 nginx: worker process
root     31254 30078  0 17:38 pts/0    00:00:00 grep --color=auto nginx
[root@node2013 vhost]# 

要約:

nginxの開始は、絶対パスを使用しなければならない、または処理できないUSR2信号を出力します。

ドキュメントのリンク:
nginxのは、Luaのモジュールをインストールします。https://github.com/openresty/lua-nginx-module#installation
nginxの信号:http://nginx.org/en/docs/control.html
nginxのメイン初期化します。https:/ /blog.csdn.net/time_change/article/details/78470901

おすすめ

転載: www.cnblogs.com/dance-walter/p/11640700.html