nginx 安装第三方模块(lua)并热升级

需求:

nginx上将特定请求拒绝,并返回特定值。

解决办法:

使用lua脚本,实现效果。

操作步骤:

  1. 安装Luajit环境
  2. 重新编译nginx(原先nginx -V 配置一致,并新增两个模块ngx_devel_kit,lua-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二进制文件(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启动时master进程会初始化每个模块的信息,reload只是重新开启新的worker进程。所以新增模块只能重启或热升级。

nginx 信号:

信号 nginx内置shell 说明
HUP nginx -s reload 重载配置文件
USR1 nginx -s reopen 重新打开日志文件,配置mv,用做日志切割
USR2 - 热升级nginx程序
WINCH - 优雅的关闭相关的worker进程
QUIT nginx -s squit 优雅的停止nginx
TERM,INT nginx -s stop 立即停止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热升级步骤

[[email protected] vhost]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf   #正确的启动nginx

重新执行编译nginx步骤,为了升级服务器可执行文件,应首先将新的可执行文件替换旧文件。之后,USR2信号应发送到主进程。主进程首先将其具有进程ID的文件重命名为带有.oldbin后缀的新文件,例如 /tmp/nginx.pid.oldbin,然后启动一个新的可执行文件,该文件又启动新的工作进程:

[[email protected] vhost]# kill -USR2 `cat /tmp/nginx.pid`  #发送热升级信号
[[email protected] 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
[[email protected] 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

之后,所有工作进程(旧的和新的)继续接受请求。如果WINCHQUIT信号发送到第一个主进程,它将向其工作进程发送消息,要求它们正常关闭,然后它们将开始退出:

[[email protected] vhost]# kill -QUIT `cat /tmp/nginx.pid.oldbin`       #优雅的退出进程
[[email protected] 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
[[email protected] vhost]#

总结:

nginx启动须使用绝对路径,不然无法处理USR2信号。

文档链接:
nginx 安装lua模块: https://github.com/openresty/lua-nginx-module#installation
nginx 信号: http://nginx.org/en/docs/control.html
nginx main初始化:https://blog.csdn.net/time_change/article/details/78470901

原文地址:https://www.cnblogs.com/dance-walter/p/11640700.html

时间: 2024-08-28 09:41:29

nginx 安装第三方模块(lua)并热升级的相关文章

nginx安装第三方模块

原已经安装好的nginx,现在需要添加一个未被编译安装的模块 举例说明:安装第三方的ngx_cache_purge模块(用于清除指定URL的缓存) nginx的模块是需要重新编译nginx,而不是像apache一样配置文件引用.so 1.wget http://labs.frickle.com/files/ngx_cache_purge-2.0.tar.gz tar -zxvf ngx_cache_purge-2.0.tar.gz cd /data0/software/nginx-1.1.10

nginx安装第三方模块file_md5

HTTP协议新增了Content-MD5 HTTP头,但是nginx并不支持这个功能,而且官方也明确表示不会增加这项功能,为什么呢?因为每次请求都需要读取整个文件来计算MD5值,以性能著称的nginx绝对不愿意干出违背软件宗旨的事情.但是有些应用中,需要验证文件的正确性,有些人通过下载当前文件,然后计算MD5值来比对当前文件是否正确.不仅仅浪费带宽资源也浪费了大把的时间.有需求就有解决方案,网友开发了file-md5模块. 1. 下载模块file-md5 # cd /usr/local/src

nginx安装第三方模块的方法

nginx第三方模块安装方法: ./configure --prefix=/你的安装目录 --add-module=/第三方模块目录 以安装fair模块实例 下载fair安装包并解压 1.在未安装nginx的情况下安装nginx第三方模块 # ./configure --prefix=/usr/local/nginx-1.9.9 --add-module=/temp/nginx-upstream-fair-master # make # make isntall # /usr/local/ngi

nginx安装第三方模块echo

要使用第三方模块ngx_echo的功能,请重新配置添加到nginx插件中 ##下载第三方模块 wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz tar -zxvf v0.61.tar.gz ##解压 cd nginx-1.15.8 ##进入nginx源码目录,准备重新配置nginx ##配置,--add-module指向模块目录即会安装插件到nginx中 ./configure --add-modul

nginx(四)安装第三方模块

nginx文件非常小但是性能非常的高效,这方面完胜apache,nginx文件小的一个原因之一是nginx自带的功能相对较少,好在nginx允许第三方模块,第三方模块使得nginx越发的强大. 在安装模块方面,nginx显得没有apache安装模块方便,当然也没有php安装扩展方便.在原生的nginx,他不可以动态加载模块,所以当你安装第三方模块的时候需要覆盖nginx文件.接下来看看如何安装nginx第三模块吧. nginx第三方模块安装方法: ./configure --prefix=/你的

nginx增加第三方模块

增加第三方模块 ============================================================ 一.概述nginx文件非常小但是性能非常的高效,这方面完胜apache.nginx文件小的一个原因之一是nginx自带的功能相对较少,好在nginx允许第三方模块,第三方模块使得nginx越发的强大. nginx已支持动态加载模块 二.安装第三方模块./configure --prefix=源安装目录 --add-module=/第三方模块解压目录 以安装ng

使用tengine DSO 来动态编译安装第三方模块(Lua

在使用nginx时,需要增加或者改动一个模块,都需要重新编译nginx文件.最近使用了tengine,它提供的DSO工具来动态加载模块.本例测试需要动态增加lua-nginx模块,记录一下安装过程. 1. 编译安装 luajit Lua 环境推荐使用成熟快速的 luajit. 1 2 3 4 5 cd /root/Download/ wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz tar zxvf LuaJIT-2.0.4.tar.gz c

Nginx的第三方模块ngx-fancyindex安装

一.ngx-fancyindex模块的简介: Nginx Web 服务器自带的目录浏览功能看起来并不是那么的美观,我们可以使用ngx-fancyindex插件来美化目录浏览功能. 我们到https://github.com/aperezdc/ngx-fancyindex 下载ngx-fancyindex 二.在未安装nginx的情况下安装nginx第三方模块: #tar xf nginx-1.8.0.tar.gz #unzip ngx-fancyindex-master.zip #cd ngin

安装第三方模块

python安装第三方模块 方法1:使用软件管理工具(pip,pip2,pip3) python2和python3都自带了pip,而pip就仿佛有一个仓库,将我们需要安装的第三方模块都收纳其中,使用简 单的安装命令即可完成安装. 注意事项:用python3自带的pip或者pip3安装的第三方模块就只能为python3的编译器使用,这对于python2 的pip和pip2是同理的. 所以在我们需要对某一版本的python安装第三方模块的时候,就将原先的路径删除,增加对应的路径至环境变量. 个人推荐