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代码