nginx_lua 扩展让 nginx 拥有可编程能力

本文介绍了nginx_lua模块如何使Nginx具备更强的扩展性。通过lua语言,开发者可以方便地为Nginx添加功能,而无需像以往那样用C语言开发模块。nginx_lua利用lua的协程机制,在处理I/O操作时避免阻塞,实现了异步处理。文章详细阐述了nginx_lua中socket I/O的工作流程,并提到了京东对此技术的应用。
摘要由CSDN通过智能技术生成

         公司使用 lighttpd 的比较多, 主要是接入层的一些工作,而且增加了一些很多自己的模块防火墙等等. 
后来nginx开始流行起来因为 lighttpd 和 nginx整体是实现方式比较类似(个人感觉nginx 借鉴了 lighttpd的实
现方式),都使用了多进程异步非阻塞处理请求I/O和timer,对于静态文件服务使用sendfile系统调用.  作为
静态文件server 和接入层来说 lighttpd 已经足够的快,所以用lighttpd 和 nginx没太大区别.  简单来说nginx
 相对于lighttpd 没有 质的提高, 所以公司推广nginx 的动力不是太大.

         nginx_lua 模块的推出使得 nginx 和 lighttpd 不在一个水平线上了. nginx_lua大大降低了nginx moudle
开发的门槛,使用lua 语言可以替代以前使用c开发nginx moudle的很多场景. 可以很方便的给nginx 增加功能
这点lighttpd 很难做到.

        关于nginx_lua的介绍可以看看作者的一个演讲记录: 由Lua 粘合的Nginx生态环境 ,本文主要介绍lua
 socket I/O特点。 根据nginx 工作方式的特点每Nginx工作进程使用一个Lua VM,工作进程内所有协程共
享VM. 每一个外部请求都由一个新的Lua协程处理, 协程之间数据隔离. 当Lua代码调用I/O操作接口时,若
该操作无法立刻完成(例如 recv 会引起阻塞)协程会保存当前状态, 由Nginx 继续处理其他请求,  相关数据I/O
操作完成时resume相关协程并继续运行。


location = /tcptest {
    content_by_lua '
		local sock = ngx.socket.tcp()
		sock:settimeout(1000)   
		local ok, err = sock:connect("127.0.0.1", 11211)
		if not ok then
   			ngx.say("failed to connect: ", err)
   			return
		end

		local bytes, err = sock:send("flush_all\r\n")
		if not bytes then
    		ngx.say("failed to send query: ", err)
    		return
		end
 
		local line, err = sock:receive()
		if not line then
    		ngx.say("failed to receive a line: ", err)
    		return
		end
 
		ngx.say("result: ", line)
    ';
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值