前面,已经将 "hello world" 跑起来了。
在考虑正式项目要怎么做之前,应该对服务器开发有一个初步的整体认识。
从我入门的角度来看,至少应该学习掌握的东西(后面再补充或更改):
具体内容暂时不展开来说。
________________________________ NRatel割 ________________________________
对于 openresty 的使用,
可以参考一些基于 openresty 的开源项目,如:openresty-china
另外,参考,openresty/lua-nginx-module
如下图,openresty 提供了一系列 lua 的钩子函数,让你可以在不同的阶段做不同的事情
(简单说就是:在这些钩子函数,完成自己的业务逻辑即可)。
这些钩子函数都可以在 nginx.conf 中以指令的方式配置生效。
说明表格:
Directive | context | phase | 简要说明 |
http | loading-config | 当 Nginx 接收到 HUP 信号并开始重新加载配置文件时,Lua VM 也将被重新创建,此时,init_by_lua 将在新的 Lua VM 上再次运行。通常用于 预加载 Lua模块、初始化 lua_shared_dict shm 存储等。 | |
http | starting-worker | 若主进程被启用,这个钩子在每个Nginx工作进程启动时运行。若主进程被禁用,这个钩子将在 init_by_lua 之后运行。通常被用于创建 单工作重复发生的计时器,如后端健康检查。 | |
server, server if, location, location if | rewrite | 可以将一些参数从 nginx.conf 传入Lua,并把处理结果从Lua中返回给 nginx.conf。 | |
location, location if | content | 充当内容处理程序。 | |
http, server, location, location if | rewrite tail | 充当重写阶段处理程序,用于实现复杂的转发/重定向等功能。 | |
http, server, location, location if | access tail | 充当访问阶段处理程序。 | |
http, server, location, location if | output-header-filter | 处理响应头,如设置header等。 例:ngx.header.Foo = "blah"。 | |
http, server, location, location if | output-body-filter | 处理响应数据,比如截断、替换等。 输入数据块通过 ngx.arg[1](Lua字符串值)传递,标示响应体数据流结束的 “eof”标志 通过 ngx.arg[2](Lua布尔值) 传递。 例:转换响应体中的所有小写字母,ngx.arg[1] = string.upper(ngx.arg[1])。 | |
http, server, location, location if | log | log阶段处理,如记录访问量/统计平均响应时间等。 | |
upstream | content | 作用于upstream上,作为其均衡器运行。 | |
server | right-before-SSL-handshake | 当Nginx准备启动下游 SSL (https) 连接的 SSL握手时执行。用例:SSL握手流量控制、拒绝使用了低版本SSL协议的客户端连接等。 | |
http | right-before-SSL-handshake | todo | |
http | right-after-SSL-handshake | todo |
________________________________ NRatel割 ________________________________
我当前的 nginx.conf:
user nratel; # 指定nginx用户
pid tmp/nginx.pid; # 指定worker进程ID保存文件的位置
worker_processes 1; # 指定worker进程数
error_log logs/error.log; # 指定错误日志位置
events {
worker_connections 1024; # 每个工作进程的最大连接数
}
http {
include ./mime.types; # 根据请求文件的后缀名,匹配决定HTTP Response的Content-Type
sendfile on; # 设置为on表示启动高效传输文件的模式
keepalive_timeout 65; # 完成请求后保持连接
charset utf-8; # 字符编码
lua_code_cache off; # lua代码缓存,off方便热调试,生产环境需设为on
lua_package_path '${prefix}/app/lualib/?.lua;;'; # 设置Lua扩展库的搜寻路径(';;' 中的空,指默认路径, 指从${prefix}开始查找)
lua_package_cpath '${prefix}/app/luaclib/?.so;;'; # 设置C编写的Lua扩展模块的搜寻路径(';;' 中的空,指默认路径, 指从${prefix}开始查找)
init_by_lua_file ./app/phase/init.lua;
init_worker_by_lua_file ./app/phase/init_worker.lua;
server { # 定义虚拟主机
listen 81; # 监听端口。游戏服不占用80端口
server_name game-dev; # 监听域名。虚拟服务器的识别路径
location /game {
set_by_lua_file $_ ./app/phase/set.lua; #根据传入变量做不同处理,类似于加宏
rewrite_by_lua_file ./app/phase/rewrite.lua;
access_by_lua_file ./app/phase/access.lua;
content_by_lua_file ./app/phase/content.lua;
header_filter_by_lua_file ./app/phase/header_filter.lua;
body_filter_by_lua_file ./app/phase/body_filter.lua;
log_by_lua_file ./app/phase/log.lua;
}
}
}