LUA編寫網頁腳本 ngx_lua_module-1.0.5.1發布
注:最新版本在以下博客首發:
ngx_lua_module是一個nginx http模塊,它把lua解析器內嵌到nginx,用來解析并執行lua語言編寫的網頁后臺腳本。
更新說明:
*) 更改LUA表的名稱,具體如下:
nginx.dbd變成nginx.database;
nginx.log變成nginx.logger;
nginx.req變成nginx.request;
nginx.resp變成nginx.response;
nginx.var變成nginx.variable。
*) 重新實現nginx.database表,原有函數全部去掉,新增execute函數,
簡化了LUA代碼中的數據庫操作。具體請查看下面示例代碼的用法。
*) ngx_lua_module模塊核心代碼的優化。
特性:
*) HTML網頁中內嵌LUA腳本代碼,類似于PHP。
*) 支持非阻塞的數據庫操作,目前只支持MYSQL。
API說明:
*) nginx 表
*) nginx.database 表
提供數據庫操作的接口,這些接口的內部實現是基于非阻塞模式的,
因此不會阻塞Nginx的事件處理,可以支持比較高的并發。
具體用法請查看下面的示例代碼。
*) nginx.logger 表
Nginx日志接口的封裝,允許在LUA代碼寫日志信息到Nginx的日志文件中。
具體用法請查看下面的示例代碼。
*) nginx.request 表
提供與HTTP請求有關的接口,可以獲取請求參數、請求頭和Cookie值。
具體用法請查看下面的示例代碼。
*) nginx.response 表
提供與HTTP響應有關的接口。
具體用法請查看下面的示例代碼。
*) ngnx.variable 表
提供接口給LUA代碼以獲取Nginx的HTTP變量。
具體用法請查看下面的示例代碼。
TODO:
*) API說明文檔。
*) 更多實用功能的LUA表和接口實現,
例如多臺機器之間會話(Session)共享的透明處理。
最新版本:
windows:https://github.com/downloads/hehaiqiang/ngwsx/ngx_lua_module-windows-1.0.5.1.rar
linux:(暫無)
歷史版本:
https://github.com/hehaiqiang/ngwsx/downloads
示例代碼:
index.lsp
<% local req = nginx.request --local name = req["name"] --local name = req.name if req.method == req.GET then name = req.get["name"] name = req.get.name else name = req.post["name"] name = req.post.name end name = name or "world" %> <html> <head><title>hello, <%=name%>!</title></head> <body> hello, <%=name%>! <hr> <form action="index.lsp" method="post"> <input type="text" name="name"/> <input type="submit" value="submit"/> </form> </body> </html>
test_database.lsp
<%
local print = print
local nginx = nginx
local req = nginx.request
local db = nginx.database
local res = db.execute({
driver = "libdrizzle",
host = "127.0.0.1",
port = 3306,
user = "root",
password = "123456",
database = "mysql",
sql = "show databases"
})
%>
<html>
<head>
</head>
<body>
err: <%=res.err%>
<br/>
errstr: <%=res.errstr%>
<br/>
col_count: <%=res.col_count or ""%>
<br/>
row_count: <%=res.row_count or ""%>
<br/>
affected_rows: <%=res.affected_rows or ""%>
<br/>
insert_id: <%=res.insert_id or ""%>
<br/>
<% if res.err ~= 0 then print("error") return end %>
<hr>
<table border="1">
<tr>
<% for i=1,#res.columns do %>
<td><b><%=res.columns[i]%></b></td>
<% end %>
</tr>
<% for r=1,#res.rows do %>
<tr>
<% for i=1,#res.rows[r] do %>
<td><%=res.rows[r][i]%></td>
<% end %>
</tr>
<% end %>
</table>
<hr>
request_time: <%=req.request_time%>ms
</body>
</html>
test_logger.lsp
<% local print = print local nginx = nginx local log = nginx.logger %> <html> <head> </head> <body> <% -- writing some messages into the log file of the nginx log.error(log.ALERT, "test alert" .. 1 .. 10) log.debug(log.DEBUG_HTTP, "test debug http") log.error(log.ERR, "test error") log.error(log.EMERG, 1000) %> please opening the log file of the nginx to view messages. </body> </html>
test_request.lsp
<%
local print = print
local nginx = nginx
local req = nginx.request
local get_req_members = function()
return {
uri = req.uri,
args = req.args,
host = req.host,
exten = req.exten,
method = req.method,
referer = req.referer,
user_agent = req.user_agent,
method_name = req.method_name,
request_time = req.request_time .. "ms",
request_line = req.request_line,
unparsed_uri = req.unparsed_uri,
http_protocol = req.http_protocol
}
end
function get_headers_members()
local headers = req.headers
return {
host = headers.host,
user_agent = headers.user_agent
}
end
%>
<html>
<head>
</head>
<body>
<table border="1">
<% for k,v in pairs(get_req_members()) do %>
<tr><td><%=k%></td><td><%=v%></td></tr>
<% end %>
</table>
<hr>
<table border="1">
<% for k,v in pairs(get_headers_members()) do %>
<tr><td><%=k%></td><td><%=v%></td></tr>
<% end %>
</table>
<%
-- TODO: test the table "req.cookies"
%>
<hr>
<%
local one = req["one"] or 1
local two = req.two or 2
local three = req.get["three"] or 3
local four = req.get.four or 4
%>
hello, <%=one%><%=two%><%=three%><%=four%>!
</body>
</html>
test_response.lsp
<% local print = print local nginx = nginx local req = nginx.request local resp = nginx.response resp.content_type = "text/html" %> <html> <head><title></title></head> <body> <% local one = req["one"] or 1 local two = req.two or 2 local three = req.post["three"] or 3 local four = req.post.four or 4 %> hello, <%=one%><%=two%><%=three%><%=four%>! <hr> <form action="test_response.lsp" method="post"> <input type="text" name="one"/> <input type="text" name="two"/> <input type="text" name="three"/> <input type="text" name="four"/> <input type="submit" value="submit"/> </form> <hr> </body> </html>
test_variable.lsp
<%
local print = print
local nginx = nginx
local var = nginx.variable
local array = {
--var.arg_PARAMETER or "",
args = var.args or "",
binary_remote_addr = var.binary_remote_addr or "",
body_bytes_sent = var.body_bytes_sent or "",
content_length = var.content_length or "",
content_type = var.content_type or "",
--var.cookie_COOKIE or "",
document_root = var.document_root or "",
document_uri = var.document_uri or "",
host = var.host or "",
hostname = var.hostname or "",
--var.http_HEADER or "",
user_agent = var.http_user_agent or "",
is_args = var.is_args or "",
limit_rate = var.limit_rate or "",
nginx_version = var.nginx_version or "",
query_string = var.query_string or "",
remote_addr = var.remote_addr or "",
remote_port = var.remote_port or "",
remote_user = var.remote_user or "",
request_filename = var.request_filename or "",
request_body = var.request_body or "",
request_body_file = var.request_body_file or "",
request_completion = var.request_completion or "",
request_method = var.request_method or "",
request_uri = var.request_uri or "",
scheme = var.scheme or "",
server_addr = var.server_addr or "",
server_name = var.server_name or "",
server_port = var.server_port or "",
server_protocol = var.server_protocol or "",
uri = var.uri or ""
}
%>
<html>
<head>
</head>
<body>
<%=#array%>
<hr>
<table border="1">
<% for k,v in pairs(array) do %>
<tr><td><%=k%></td><td><%=v%></td></tr>
<% end %>
</table>
</body>
</html>
項目地址:http://blog.csdn.net/ngwsx/