OpenResty是一个基于Nginx与Lua的高性能Web平台,OpenResty的目标是让你的Web服务直接跑在Nginx服务内部,充分利用Nginx的非阻塞I/O模型,来实现高性能响应。
OpenResty 地址 https://github.com/openresty
1、配置nginx,由于OpenResty也是基于nginx,所以入口还是在nginx中配置
worker_processes 1;#nginx worker 数量
pid var/run/nginx.pid;
error_log logs/error.log;#指定错误日志文件路径
events {
worker_connections 1024;
}
http {
lua_package_path ‘$prefix/lua/?.lua;lua/?.lua;;’;
server {
listen 80;
#可以设置环境变量来控制环境,在lua中可以获取
set $environment “development”;
location /gamelist {
#支持热编辑,不用重启可以试试调试
#lua_code_cache off;
# OpenResty 阶段中的准入阶段完成参数验证
access_by_lua_file lua/access.lua;
#OpenResty 阶段中的内容生成阶段搜索数据库
content_by_lua_file lua/content.lua;
#OpenResty 阶段中应答加密编码
body_filter_by_lua_file lua/closure.lua;
}}}
关于openresty运行流程可以参数官网,总体来说4大步,相互不影响,每大步中的小步会影响,如果存在小步中输出,后面小步会停止,进入下一个大步中
2、lua实现连接mysql和redis等数据操作服务,可以在content_by_lua_file阶段来执行
local mysql = require “resty.mysql”
local db, err = mysql:new()
if not db then
ngx.log(ngx.ERR, ” failed to instantiate mysql: “, err) –错误日志会记录在nginx中的error日子中
end
db:set_timeout(1000) –mysql超时时间
local environment = ngx.var.environment –获取环境变量
local ok, err, errno, sqlstate
if environment == “development” then
ok, err, errno, sqlstate = db:connect{
host = “***”,
port = 3306 ,
database = “***”,
user = “***”,
password = “***”,
max_packet_size = 1024 * 1024 }
end
if not ok then
ngx.log(ngx.ERR,”mysql failed to connect: “,err, “: “, errno, ” “, sqlstate)
else
ngx.ctx.mysqlconn = db –可以写入openresty线程缓存中
end
可以在 body_filter_by_lua_file 这一步中回收mysql连接池
mysql_conns:set_keepalive(10000, 100)
redis也和mysql差不多
local redis = require “resty.redis”
local red = redis:new()
red:set_timeout(1000)
local environment = ngx.var.environment
local ok, err
if environment == “product” then
ok, err = red:connect(“****”, 6379)
end
if not ok then
ngx.log(ngx.ERR,”redis failed to connect: “,err)
else
ngx.ctx.redisconn = red
end
可以在 body_filter_by_lua_file 这一步中回收mysql连接池
redis_conns:set_keepalive(10000, 100)
3、openresty语法
openresty是基于Nginx与Lua,nginx是服务,lua就是程序,具体可以查看lua官网
注意坑,openresty是非阻塞模型,但是lua是阻塞模型,建议使用openresty内部函数,减少使用lua内部函数
4、部署
目录可以 conf logs lua目录部署,conf为nginx配置文件,logs为nginx日志,lua里面为代码
自动化启动脚本
注conf中必须是nginx.development.conf、nginx.production.conf、nginx.testing.conf
#!/bin/bash
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ “$NETWORKING” = “no” ] && exit 0
script_file=$(readlink -f “$0”)
script_path=$(dirname “$script_file”)
prog=”openresty”
nginx=”/usr/bin/openresty”
APP_ENV=$2
NGINX_CONF_FILE=”$script_path/conf/nginx.$APP_ENV.conf”
pidfile=”$script_path/var/run/nginx.pid”
lockfile=”$script_path/var/run/nginx.lck”
make_dirs() {
mkdir -p $(dirname “$pidfile”)
mkdir -p $(dirname “$lockfile”)
}
check_env() {
if [ ! -f $NGINX_CONF_FILE ]; then
echo “Could not find openresty config file”
if [[ ! $APP_ENV =~ (development|testing|production) ]]; then
echo “You must specify env of config file as: ./service (start|restart|reload|configtest) (development|testing|production)”
fi
exit 6
fi
}
start() {
if [ ! -x $nginx ]; then
echo “Could not find the openresty executable”
exit 5
fi
check_env
echo -n $”Starting $prog: ”
daemon $nginx -p $script_path -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $”Stopping $prog: ”
killproc -p $pidfile $nginx -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $”Reloading $prog: ”
killproc -p $pidfile $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
check_env
$nginx -t -p $script_path -c $NGINX_CONF_FILE
}
rh_status() {
status -p $pidfile $nginx
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
make_dirs
case “$1″ in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $”Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}”
exit 2
esac
5、性能问题
总体来说openresty和PHP7对比,不管是查询数据库还是查询缓存,性能高2倍以上
比如 PHP7输出hello是4000QPS、openresty输出hello是10000QPS
PHP7查询缓存是3000QPS、openresty查询缓存是6000QPS
注环境不同结果不同,仅供参数,网络通信消耗不可忽略
相关的学习资料可以和我联系
2017 年 7 月 20 日
我也有过博客,不过那都是很多年前的事情了!
2017 年 9 月 27 日
一个卑微的网络编辑!希望有访必回!
2017 年 10 月 18 日
阅读博客获得的进步不亚于阅读一本书。
2018 年 1 月 7 日
毫无疑问,这个是要支持的!