1 openresty简介

        通过各种插件、模块,极大的扩展了nginx能干的事情,而lua扩展更是可以用来定制非常复杂的业务逻辑。作者给nginx赋予的这些新的特性,使openresty在业务开发上变得更加简单,对程序员更加友好,开发者可以在不需要对nginx源码熟悉的情况下就直接使用一些高级特性

2 openresty安装

        2.1 安装编译工具、依赖库

        yum -y install readline-devel pcre-devel openssl-devel gcc

        2.2 下载openresty-1.13.6.1.tar.gz 源码包,并解压;下载ngx_cache_purge模块,该模块用于清理nginx缓存;下载nginx_upstream_check_module模块,该模块用于ustream健康检查

https://openresty.org/download/openresty-1.13.6.1.tar.gz

openresty 源码安装 非root openresty/1.13.6.2_nginx

        2.3、配置需安装的模块

        

./configure --prefix=/usr/local/openresty --with-luajit --with-http_ssl_module --user=root --group=root --with-http_realip_module --add-module=./bundle/ngx_cache_purge-2.3/ --add-module=./bundle/nginx_upstream_check_module-0.3.0/
        2.4 编译和安装
        gmake && gmake install
        2.5、制作https证书 
        cd /usr/local/openresty/nginx/cert
        openssl genrsa -des3 -out server.key 1024
        openssl req -new -key server.key -out server.csr
        cp server.key server.key.org
        openssl rsa -in server.key.org -out server.key
        openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
        2.6 修改nginx.conf配置(怎么配置https这种服务)

openresty 源码安装 非root openresty/1.13.6.2_nginx_02

        2.7 开机自启动

openresty 源码安装 非root openresty/1.13.6.2_lua_03

        systemctl enable nginx

3 配置nginx+lua环境

        3.1 为了开发方便,我在/usr/local/openresty/nginx/conf/目录下创建一个lua.conf

openresty 源码安装 非root openresty/1.13.6.2_Lua_04

        同时要修改nginx.conf,在nginx.conf中的http部分添加include lua.conf包含此文件片段

openresty 源码安装 非root openresty/1.13.6.2_Lua_05

        3.2 在lua.conf中server部分添加如下配置

openresty 源码安装 非root openresty/1.13.6.2_Lua_06

        3.3 测试nginx能不能通过,重启nginx

        ./sbin/nginx -t &&./sbin/nginx -s reload

        3.4 访问页面,看看能否访问到

openresty 源码安装 非root openresty/1.13.6.2_lua_07

        3.5 lua代码

        我们把lua代码放在nginx配置中会随着lua的代码的增加导致配置文件太长不好维护,因此我们应该把lua代码移到外部文件中存储

openresty 源码安装 非root openresty/1.13.6.2_lua_08

 

        然后修改lua.conf

openresty 源码安装 非root openresty/1.13.6.2_lua_09

        lua目录,lua/test.lua 都在nginx的conf目录下

openresty 源码安装 非root openresty/1.13.6.2_nginx_10

        3.6、lua_code_cache

        默认情况下lua_code_cache  是开启的,即缓存lua代码,即每次lua代码变更必须reload nginx才生效,如果在开发阶段可以通过lua_code_cache  off;关闭缓存,这样调试时每次修改lua代码不需要reload nginx;但是正式环境一定记得开启缓存。

openresty 源码安装 非root openresty/1.13.6.2_nginx_11

        重新加载nginx出现这样的情况

openresty 源码安装 非root openresty/1.13.6.2_nginx_12

4 nginx+lua项目构建(全新的部署)

        部署的目录结构

openresty 源码安装 非root openresty/1.13.6.2_lua_13

openresty 源码安装 非root openresty/1.13.6.2_Lua_14

        nginx.conf配置文件修改

openresty 源码安装 非root openresty/1.13.6.2_lua_15

        code.conf配置文件

openresty 源码安装 非root openresty/1.13.6.2_Lua_16

        这样以后直接把code目录提交就行。方便管理代码

5 ngx_lua模块

        1、每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;

        2、将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;

        3、每个外部请求都由一个Lua协程处理,协程之间数据隔离;

        4、Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;

        5、I/O等异步操作完成时还原相关协程上下文数据,并继续运行;

6 nginx平滑升级

        1 备份nginx二进制文件,然后将新的nginx二进制文件链接到旧的二进制文件

        向主进程发送USR2信号,Nginx会启动一个新版本的master进程和工作进程,和旧版一起处理请求

        2 kill -USR2 `cat usr/local/nginx/logs/nginx/nginx.pid`

        向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新版Nginx处理

        3 kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`

        等待请求处理结束后再退出

        4 kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

openresty 源码安装 非root openresty/1.13.6.2_lua_17

        5 修改nginx配置文件,主要是之前的路径可能不对

openresty 源码安装 非root openresty/1.13.6.2_Lua_18