热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nginx服务器中使用ngx_lua_module开发web应用

ngx_lua_module是一个nginxhttp模块,它把lua解析器内嵌到nginx,用来解析并执行lua语言编写的网页后台脚本。特性:*)支持Windows和Linux平台。*)支持高并发高性能。*)HTML网页中内嵌LUA脚本代码,类似于PHP。*)支持非阻塞的数据库操作,目前只支持M
ngx_lua_module是一个nginx http模块,它把lua解析器内嵌到nginx,用来解析并执行lua语言编写的网页后台脚本。

特性:
*) 支持Windows和Linux平台。
*) 支持高并发高性能。
*) HTML网页中内嵌LUA脚本代码,类似于PHP。
*) 支持非阻塞的数据库操作,目前只支持MYSQL。
*) 支持异步的文件IO操作。
*) 支持非阻塞的SOCKET IO操作。
API简介:
*) nginx 表
    提供一些实用函数,例如URI转换、BASE64编解码、CRC校验、MURMURHASH2、MD5和SHA1。
    具体用法请查看下面示例代码。
*) nginx.database 表
    提供数据库操作的接口,这些接口的内部实现是基于非阻塞模式的,
    因此不会阻塞Nginx的事件处理,可以支持比较高的并发。
    具体用法请查看下面示例代码。
*)

nginx.file 表

    提供文件操作的接口,这些接口的内部实现是基于异步IO模式的,
    因此不会阻塞Nginx的事件处理,可以支持比较高的并发。
    具体用法请查看下面示例代码。
*) nginx.logger 表
    Nginx日志接口的封装,允许在LUA代码中写日志信息到Nginx的日志文件。
    具体用法请查看下面示例代码。
*) nginx.request 表
    提供与HTTP请求有关的接口,可以获取请求参数、请求头和COOKIE值,等等。
    具体用法请查看下面示例代码。
*) nginx.response 表
    提供与HTTP响应有关的接口。
    具体用法请查看下面示例代码。
*)

nginx.socket 表

    提供SOCKET操作的接口,这些接口的内部实现是基于非阻塞IO模式的,
    因此不会阻塞Nginx的事件处理,可以支持比较高的并发。
    具体用法请查看下面示例代码。
*) nginx.variable 表
    提供接口给LUA代码以获取Nginx的HTTP变量。
    具体用法请查看下面示例代码。

TODO:
*) API说明文档。
*) 更多实用功能的LUA表和接口实现,
    例如多台机器之间会话(Session)共享的透明处理。

下载:
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"
%>



hello, <%=name%>!









test_core.lsp
<%
local nginx = nginx
%>




<%
local uri = "id=你好&title=世界"
local escaped_uri = nginx.escape_uri(uri)
local unescaped_uri = nginx.unescape_uri(escaped_uri)
local str = "dsdsdtdkslddfsdfdffdfsdfsdfweijqawlkrklekefwklksldksksd"
local encoded_base64 = nginx.encode_base64(str)
local decoded_base64 = nginx.decode_base64(encoded_base64)
local crc16 = nginx.crc16(str) or "crc16 error";
local crc32 = nginx.crc32(str) or "crc32 error";
local murmur_hash2 = nginx.murmur_hash2(str) or "murmur_hash2 error"
local md5 = nginx.md5(str) or "md5 error"
local sha1 = nginx.sha1(str) or "sha1 error"
%>
URI escape test
<%=uri%>
<%=escaped_uri%>


URI unescape test
<%=escaped_uri%>
<%=unescaped_uri%>


BASE64 encode test
<%=str%>
<%=encoded_base64%>


BASE64 decode test
<%=encoded_base64%>
<%=decoded_base64%>


CRC16 test
<%=str%>
<%=crc16%>


CRC32 test
<%=str%>
<%=crc32%>


MURMURHASH2 test
<%=str%>
<%=murmur_hash2%>


MD5 test
<%=str%>
<%=md5%>


SHA1 test
<%=str%>
<%=sha1%>


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"
})
%>




err: <%=res.err%>


errstr: <%=res.errstr%>


col_count: <%=res.col_count or ""%>


row_count: <%=res.row_count or ""%>


affected_rows: <%=res.affected_rows or ""%>


insert_id: <%=res.insert_id or ""%>


<% if res.err ~= 0 then print("error") return end %>




<% for i=1,#res.columns do %>
<%=res.columns[i]%>
<% end %>

<% for r=1,#res.rows do %>

<% for i=1,#res.rows[r] do %>
<%=res.rows[r][i]%>
<% end %>

<% end %>



request_time: <%=req.request_time%>ms



test_file.lsp
<%
local nginx = nginx
local file = nginx.file
%>




<% local f = file.open("c:/test.txt") %>
<% local n,res = f:read() %>
n: <%=n%>


res: <%=res%>


<% local n,err = f:write("kdkdksldskdlsdkkkkkkkkkkkkkkkkkkkkkkkkkk") %>
n: <%=n%>


err: <%=err or ""%>


<% f:close() %>


test_logger.lsp
<%
local print = print
local nginx = nginx
local log = nginx.logger
%>




<%
-- 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.


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
%>





<% for k,v in pairs(get_req_members()) do %>
<%=k%><%=v%>
<% end %>




<% for k,v in pairs(get_headers_members()) do %>
<%=k%><%=v%>
<% end %>

<%
-- TODO: test the table "req.COOKIEs"
%>


<%
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%>!


test_response.lsp
<%
local print = print
local nginx = nginx
local req = nginx.request
local resp = nginx.response
resp.content_type = "text/html"
%>



<%
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%>!














test_socket.lsp
<%
local nginx = nginx
local resp = nginx.response
local socket = nginx.socket
resp.content_type = "text/html"
%>
<% local s = socket.open("www.nginx.org", 80) %>
<%=s:send("GET / HTTP/1.1\r\nHost: www.nginx.org\r\n\r\n") or "send error"%>


<% local n,res = s:recv() %>
<%=n or "recv error"%>


<%=res or "recv error"%>


<% n,res = s:recv() %>
<%=n or "recv error"%>


<%=res or "recv error"%>


<% n,res = s:recv() %>
<%=n or "recv error"%>


<%=res or "recv error"%>
<% s:close() %>
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 ""
}
%>




<%=#array%>



<% for k,v in pairs(array) do %>
<%=k%><%=v%>
<% end %>




推荐阅读
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了在无法联网的情况下,通过下载rpm包离线安装zip和unzip的方法。详细介绍了如何搜索并下载合适的rpm包,以及如何使用rpm命令进行安装。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
author-avatar
洪佳蓉名羽明德
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有