由于对lua语言非常喜欢,加上工作是做web开发,所以一直在关注lua的web服务器项目,包括xavante、aLiLua、openresty、tengine等
xavante是我最早接触到的,当时还没有阻塞这个概念,现在知道它是阻塞的,在lua单线程下使用会有性能问题,而且没有文件上传、websocket等功能。
aLiLua、openresty都是非阻塞的,aLiLua名字带个ali最初被我误以为是阿里的项目,其实是个私人项目,网站已经不能访问了,支持websocket,但是不支持文件上传。
openresty比较出名,社区很活跃,通过扩展既支持文件上传也支持websockt。但是有一点不满足我的需求,它基于nginx的,nginx的多进程架构使得它没有传统java服务器那样上下文的概念,不支持常驻内存的数据和代码,意味着在lua代码里面定义一个全局变量,不能在下次请求的时候使用它,因为它有可能被销毁了,下一次请求可能是别的进程处理的,这也直接导致了openresty的websocket实现不能主动推消息给客户端,只能通过消息订阅等不友好的方法来推送消息给客户端,虽然很强大,但是我只能放弃。
tengine是阿里的项目,也是基于nginx,类似openresty,了解得不多,也不满足我的要求。
最近学了一些http协议相关的知识,就想自己来实现文件上传和websocket报文的解析,终于磨刀霍霍,把它写完了。由于是个人项目,没经过严格测试,bug肯定不少,这个在以后使用中慢慢调优。这些功能都是基于luvit项目之上开发的,不然要自己写完整的http服务器太浪费时间。
目前这个基于luvit的二次开发服务器已经包含了我所需要的所有功能:Cookie解析和设置,session会话,基于If-Modified-Since请求头的客户端缓存机制,类似j2ee的过滤器实现,multipart/form-data报文解析(用于文件上传),websocket报文解析。
下载地址:http://resource.omega.pw/software/lua/luv/luv-http-server.tar.gz
luvit项目介绍:
luvit项目是在luv项目的基础上实现一套类似nodejs的库,基本上实现了nodejs大部分api,但是nodejs是在不停更新的,luvit肯定追不上,项目地址:https://github.com/luvit/luvit
luv项目是lua对libuv库的绑定,项目地址:https://github.com/luvit/luv