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
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这种服务)
2.7 开机自启动
systemctl enable nginx
3 配置nginx+lua环境
3.1 为了开发方便,我在/usr/local/openresty/nginx/conf/目录下创建一个lua.conf
同时要修改nginx.conf,在nginx.conf中的http部分添加include lua.conf包含此文件片段
3.2 在lua.conf中server部分添加如下配置
3.3 测试nginx能不能通过,重启nginx
./sbin/nginx -t &&./sbin/nginx -s reload
3.4 访问页面,看看能否访问到
3.5 lua代码
我们把lua代码放在nginx配置中会随着lua的代码的增加导致配置文件太长不好维护,因此我们应该把lua代码移到外部文件中存储
然后修改lua.conf
lua目录,lua/test.lua 都在nginx的conf目录下
3.6、lua_code_cache
默认情况下lua_code_cache 是开启的,即缓存lua代码,即每次lua代码变更必须reload nginx才生效,如果在开发阶段可以通过lua_code_cache off;关闭缓存,这样调试时每次修改lua代码不需要reload nginx;但是正式环境一定记得开启缓存。
重新加载nginx出现这样的情况
4 nginx+lua项目构建(全新的部署)
部署的目录结构
nginx.conf配置文件修改
code.conf配置文件
这样以后直接把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`
5 修改nginx配置文件,主要是之前的路径可能不对