worker_processes 1;
events {
worker_connections 512;
}
#其实 worker processes worker connections 都可以不写,默认值就是 worker 进程和最多 512 个连接,但配置块 events {}不能省略
http {
server {
listen 80;
server_name *.*; #HTTP 服务对应任意域名
location / {
content_by_lua_block {
ngx.print("hello world")
}
}
}
}
启动
/usr/local/openresty/bin/openresty -c "`pwd`/hello.conf"
停止
/usr/local/openresty/bin/openresty -c "`pwd`/hello.conf" -s stop
-p path 是增强版的-c
指定工作目录,openresty会使用这个目录下的conf/nginx.conf 日志也会放在该目录的logs下。
reopen重新打开日志文件,服务不会中断,常用于切分日志 rotate
-t -T检查默认的配置文件,T会打印输出
-v
-V
配置指令 30多个
ngx_lua stream_lua分别对应http和tcp/udp
lua_package_path "$prefix/service/?.lua;;";
lua_package_cpath "$prefix/service/?.so;;";
文件名使用?通配符 多个路径用; 默认路径用;; $prefix是启动时-p指定的目录
openresty默认会查找安装目录下的lualib site下的文件,所有不用刻意指定
lua_code_cache on/off
源码中的lua代码只会被luaVM加载缓存起来,只会读取一次。 测试时off,每次请求时自动载入修改,服务时on
--------------
运行机制
nginx吧web服务的整个生命周期和请求处理流程划分了若干个阶段 phase
web服务的生命周期刻意划分为三个阶段:
initing
running
exiting
openresty目前关注的是initing running
initing阶段在openresty里面又被分了三个子阶段
configuration 读取配置文件,解析配置,设置运行参数
master-initing 解析配置文件完毕,master进程初始化公用数据
worker-initing worker进程自己的初始化,进程专用的数据
在running阶段,收到客户端的请求后,openresty会对每个请求使用一个专门的流水线处理,即openresty定义的处理阶段
ssl ssl/tls安全通信和验证
preread 正式处理前的预读数据,接收http头
rewrite 检查改写uri,实现跳转或重定向
access 访问权限控制
content 产生响应内容
filter 对content阶段产生的内容进行过滤加工处理
log 请求处理完毕,记录日志或其他收尾工作
理论上所有的业务逻辑都可以放在content阶段完成
处理请求时前台任务,openresty还允许后台任务,即使用定时器分批次按计划执行。
如发送心跳、分析统计、更新内部数据
ngx.timer.*
执行程序:
init_by_lua master-initing
init_worker_by_lua worker-initing
ssl_certificatre_by_lua ssl阶段
ssl_session_fetch_by_lua
ssl_session_store_by_lua
set_by_lua rewrite阶段,改写nginx变量
rewrite_by_lua rewrite阶段,改写uri,实现跳转或重定向
access_by_lua
content_by_lua content阶段 产生响应内容
balancer_by_lua content阶段 反向代理时选择后端服务
header_filter_by_lua filer阶段 加工处理响应头
body_filter_by_lua filer阶段 加工处理响应体
log_by_lua
preread只能有nginx内部调用
这些指令通常有三种模式
xxx_by_lua 代码长度不能超过4k
xxx_by_lua_block 对上面的改进
xxx_by_lua_file 推荐
指令使用相对路径会从openresty的工作目录查找,这个和lua_package_c/path没有直接关系。
启动定时器,从redis获取数据
init_worker_by_lua_block {
...
}
使用uri作为文件名
location ~ ^/(\w+) {
content_by_lua_file service/http/$1.lua #查找openresty工作目录下的service/http/使用uri作为文件名的文件
}
ngx开头的都是nonblocking的 同步非阻塞
ngx.get_phase()返回当前所在的处理阶段
应用开发流程
设计、开发、测试、调试
设计阶段
1 web服务的能力 worker进程数 最大并发等
2 web服务的协议端口
3 web的http 的uri
4 执行业务逻辑的阶段
5 应用的目录结构,配置文件、程序文件的存放方式
6 设计对应的测试用例(如果可能)
开发阶段
1 配置文件中定义worker进程数和单个worker的最大并发数
2 配置文件中定义http stream,提供http或者udp/tcp服务
3 定义server
4 定义location
5 使用openresty指令
6 根据指令编写lua代码
openresty配置转发转发到某个网页首页 openresty 开发
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章