OpenResty(ngx_lua)+Moochine 完整实例
这个项目演示了如何使用OpenResty和Moochine开发Web应用。
一、安装配置
1.1 OpenResty 安装
参看:http://openresty.org/#Installation 编译时选择luajit, ./configure --with-luajit
1.2 Moochine 安装
#Checkout Moochine 代码
git clone git://github.com/appwilldev/moochine.git
1.3 配置环境变量
#设置OpenResty环境变量
export OPENRESTY_HOME=/usr/local/openresty
#设置Moochine环境变量
export MOOCHINE_HOME=/path/to/moochine
#将以上两个环境变量 加到 ~/.bash_profile 里,下次登陆自动生效
vim ~/.bash_profile
#使环境变量立即生效
source ~/.bash_profile
二、示例(模版)程序
2.1 Checkout 示例代码
git clone git://github.com/appwilldev/moochine-demo.git
cd moochine-demo
2.2 程序目录结构
moochine-demo #程序根目录
|
|-- routing.lua # URL Routing配置
|-- application.lua # moochine app 描述文件
|
|-- app #应用目录
| `-- test.lua #请求处理函数
|
|-- bin #脚本目录
| |-- debug.sh #关闭服务->清空error log->启动服务->查看error log
| |-- reload.sh #平滑重载配置
| |-- start.sh #启动
| |-- stop.sh #关闭
| |-- console.sh #moochine控制台。注意:moochine控制台需要安装Python2.7或Python3.2。
| `-- cut_nginx_log_daily.sh #Nginx日志切割脚本
|
|-- conf #配置目录
| `-- nginx.conf #Nginx配置文件模版。需要配置 `set $MOOCHINE_APP_NAME 'moochine-demo';` 为真实App的名字。
|
|-- templates #ltp模版目录
| `-- ltp.html #ltp模版文件
|
|-- static #静态文件(图片,css,js等)目录
| `-- main.js #js文件
|
|-- moochine_demo.log #调试日志文件。在 application.lua 可以配置路径和Level。
|
`-- nginx_runtime #Nginx运行时目录。这个目录下的文件由程序自动生成,无需手动管理。
|-- conf
| `-- p-nginx.conf #Nginx配置文件(自动生成),执行 ./bin/start.sh 时会根据conf/nginx.conf 自动生成。
|
`-- logs #Nginx运行时日志目录
|-- access.log #Nginx 访问日志
|-- error.log #Nginx 错误日志
`-- nginx.pid #Nginx进程ID文件
2.3 启动/停止/重载/重启 方法
./bin/start.sh #启动
./bin/stop.sh #停止
./bin/reload.sh #平滑重载配置
./bin/debug.sh #关闭服务->清空error log->启动服务->查看error log
注意:以上命令只能在程序根目录执行,类似 ./bin/xxx.sh 的方式。
2.4 测试
curl "http://localhost:9800/hello?name=xxxxxxxx"
curl "http://localhost:9800/ltp"
tail -f moochine_demo.log #查看 调试日志的输出
tail -f nginx_runtime/logs/access.log #查看 Nginx 访问日志的输出
tail -f nginx_runtime/logs/error.log #查看 Nginx 错误日志和调试日志 的输出
2.5 通过moochine控制台调试
./bin/console.sh #运行后会打开一个console,可以输入调试代码检查结果。注意:moochine控制台需要安装Python2.7或Python3.2。
三、开发Web应用
3.1 URL Routing: routing.lua
#!/usr/bin/env lua
-- -*- lua -*-
-- copyright: 2012 Appwill Inc.
-- author : ldmiao
--
local router = require('mch.router')
router.setup()
---------------------------------------------------------------------
map('^/hello%?name=(.*)', 'test.hello')
---------------------------------------------------------------------
3.2 请求处理函数:app/test.lua
请求处理函数接收2个参数,request和response,分别对应HTTP的request和response。从request对象拿到客户端发送过来的数据,通过response对象返回数据。request和response对象也可以通过ngx.ctx.request, ngx.ctx.response来获取。
#!/usr/bin/env lua
-- -*- lua -*-
-- copyright: 2012 Appwill Inc.
-- author : ldmiao
--
module("test", package.seeall)
local JSON = require("cjson")
local Redis = require("resty.redis")
function hello(req, resp, name)
if req.method=='GET' then
-- resp:writeln('Host: ' .. req.host)
-- resp:writeln('Hello, ' .. ngx.unescape_uri(name))
-- resp:writeln('name, ' .. req.uri_args['name'])
resp.headers['Content-Type'] = 'application/json'
resp:writeln(JSON.encode(req.uri_args))
resp:writeln({{'a','c',{'d','e', {'f','b'})
elseif req.method=='POST' then
-- resp:writeln('POST to Host: ' .. req.host)
req:read_body()
resp.headers['Content-Type'] = 'application/json'
resp:writeln(JSON.encode(req.post_args))
end
end
3.3 request对象的属性和方法
以下属性值的详细解释,可以通过 http://wiki.nginx.org/HttpLuaModule 和 http://wiki.nginx.org/HttpCoreModule 查找到。
--属性
method = ngx.var.request_method -- http://wiki.nginx.org/HttpCoreModule#.24request_method
schema = ngx.var.schema -- http://wiki.nginx.org/HttpCoreModule#.24scheme
host = ngx.var.host -- http://wiki.nginx.org/HttpCoreModule#.24host
hostname = ngx.var.hostname -- http://wiki.nginx.org/HttpCoreModule#.24hostname
uri = ngx.var.request_uri -- http://wiki.nginx.org/HttpCoreModule#.24request_uri
path = ngx.var.uri -- http://wiki.nginx.org/HttpCoreModule#.24uri
filename = ngx.var.request_filename -- http://wiki.nginx.org/HttpCoreModule#.24request_filename
query_string = ngx.var.query_string -- http://wiki.nginx.org/HttpCoreModule#.24query_string
user_agent = ngx.var.http_user_agent -- http://wiki.nginx.org/HttpCoreModule#.24http_HEADER
remote_addr = ngx.var.remote_addr -- http://wiki.nginx.org/HttpCoreModule#.24remote_addr
remote_port = ngx.var.remote_port -- http://wiki.nginx.org/HttpCoreModule#.24remote_port
remote_user = ngx.var.remote_user -- http://wiki.nginx.org/HttpCoreModule#.24remote_user
remote_passwd = ngx.var.remote_passwd -- http://wiki.nginx.org/HttpCoreModule#.24remote_passwd
content_type = ngx.var.content_type -- http://wiki.nginx.org/HttpCoreModule#.24content_type
content_length = ngx.var.content_length -- http://wiki.nginx.org/HttpCoreModule#.24content_length
headers = ngx.req.get_headers() -- http://wiki.nginx.org/HttpLuaModule#ngx.req.get_headers
uri_args = ngx.req.get_uri_args() -- http://wiki.nginx.org/HttpLuaModule#ngx.req.get_uri_args
post_args = ngx.req.get_post_args() -- http://wiki.nginx.org/HttpLuaModule#ngx.req.get_post_args
socket = ngx.req.socket -- http://wiki.nginx.org/HttpLuaModule#ngx.req.socket
--方法
request:read_body() -- http://wiki.nginx.org/HttpLuaModule#ngx.req.read_body
request:get_uri_arg(name, default)
request:get_post_arg(name, default)
request:get_arg(name, default)
request:get_cookie(key, decrypt)
request:rewrite(uri, jump) -- http://wiki.nginx.org/HttpLuaModule#ngx.req.set_uri
request:set_uri_args(args) -- http://wiki.nginx.org/HttpLuaModule#ngx.req.set_uri_args
3.4 response对象的属性和方法
--属性
headers = ngx.header -- http://wiki.nginx.org/HttpLuaModule#ngx.header.HEADER
--方法
response:set_cookie(key, value, encrypt, duration, path)
response:write(content)
response:writeln(content)
response:ltp(template,data)
response:redirect(url, status) -- http://wiki.nginx.org/HttpLuaModule#ngx.redirect
response:finish() -- http://wiki.nginx.org/HttpLuaModule#ngx.eof
response:is_finished()
response:defer(func, ...) -- 在response返回后执行
3.5 打印调试日志
在 application.lua 里定义log文件的位置和Level
logger:i(format, ...) -- INFO
logger:d(format, ...) -- DEBUG
logger:w(format, ...) -- WARN
logger:e(format, ...) -- ERROR
logger:f(format, ...) -- FATAL
-- format 和string.format(s, ...) 保持一致:http://www.lua.org/manual/5.1/manual.html#pdf-string.format
查看调试日志
tail -f moochine_demo.log
查看nginx错误日志
tail -f nginx_runtime/logs/error.log #查看 Nginx 错误日志和调试日志 的输出
3.6 常见错误
MOOCHINE URL Mapping Error
Error while doing defers
Moochine ERROR
四、Multi-App 与 Sub-App
4.1 multi-app
多个 moochine-app 可以运行与同一nginx进程中,只要将本例子中nginx.conf内moochine-app相关段配置多份即可。
4.2 sub-app
某moochine-app可以作为另一app的sub-app运行,在主app的application.lua内配置:
subapps={
subapp1 = {path="/path/to/subapp1", config={}},
...
}
五、参考
http://wiki.nginx.org/HttpLuaModule
http://wiki.nginx.org/HttpCoreModule
http://openresty.org
https://github.com/appwilldev/moochine
分享到:
相关推荐
【基于ngx_lua的动态服务路由方案】 在现代微服务架构中,动态服务路由是一个至关重要的环节,它确保了服务的高可用性和零停机更新。本文将深入探讨如何利用lua语言和OpenResty(一个强化版的Nginx,集成了lua脚本...
ngx+lua实现前端缓存应用实例分享
`ngx_lua`通常通过`OpenResty`项目提供,它是一个包含了Nginx、`ngx_lua`以及其他相关模块的打包版本。 ```bash # 下载并解压OpenResty wget https://openresty.org/download/ngx_openresty-1.19.3.1.tar.gz tar -...
OpenResty提供了ngx_lua模块,允许我们在Nginx服务器端直接运行Lua脚本,实现高性能的动态内容生成和处理。这包括但不限于动态路由、会话管理、API网关、限流策略等。通过Lua,开发者可以编写灵活且高效的服务器逻辑...
安装完成后,OpenResty会提供一套完整的环境,包括Nginx、LuaJIT(用于执行Lua脚本的Just-In-Time编译器)和其他相关的模块。 接下来,我们来配置Nginx。在OpenResty的配置文件(通常是`nginx.conf`)中,我们可以...
在OpenResty中使用Lua-nginx模块创建Socket实例是该技术组合的典型应用之一。OpenResty是一个基于Nginx与LuaJIT的高性能Web平台,它能够将Lua脚本作为Nginx的一部分运行。Lua-nginx模块提供了Lua接口来操作Nginx内部...
2. **初始化**:在Openresty的Lua脚本中,我们需要创建一个`resty.redis.cluster`实例,提供集群节点的IP和端口。例如: ```lua local red = require "resty.redis.cluster" local ok, err = red:new{ nodes = {...
可以创建多个隔离的实例,以在依赖相同的lua_shared_dict L2高速缓存时保存各种类型的数据。 此库中内置的各种缓存级别的说明: ┌─────────────────────────────────────...
`lua-resty-ipmatcher`是基于OpenResty(一个扩展了Nginx的开源项目)的库,主要目标是提供IPv4和IPv6地址的CIDR(Classless Inter-Domain Routing)格式匹配功能。CIDR是一种用于表示IP地址前缀的方法,有助于简化...
openresty-web-dev 本项目是我写的一系列openresty web 前端开发文章的实例demo,方便测试运行,喜欢请点↑↑↑右上角Star↑↑↑ ...openresty 之 nginx-api-for-lua ngx所有API都在这里,最好的文档
这个驱动程序的出现使得在基于Lua的应用,如Luajit、OpenResty(ngx-lua)或者任何支持Lua的环境,能够无缝地集成Cassandra的数据存储和处理能力。 **1. 纯Lua实现的优势** - **轻量级**:由于是纯Lua编写,lua-...
使用 `lua-resty-redis-util` 首先需要在 OpenResty 配置文件中引入库,并初始化实例: ```lua local redis_util = require "resty.redis.util" local red = redis_util:new() red:set_timeout(1000) -- 设置超时...
为了方便读者,作者推荐使用他维护的名为 ngx_openresty 的软件包,这个包中包含了最新的 Nginx 稳定版核心以及其他经过生产环境检验的非标准第三方模块。这些内容已经被包含在一个开源项目中,并托管在 GitHub 上,...
3. 编译并安装模块:`./configure --add-module=/path/to/ngx_devel_kit --add-module=/path/to/lua-nginx-module && make && make install` #### 五、Java客户端 **5.1 搭建FastDFS客户端Java开发环境** 为了实现...