前言
首先需要说明的是做这个小项目纯粹出于学习目的,目前还没有多大的实用价值。只是觉得使用Lua和C结合来实现一个HTTP服务器的这种架构非常简洁和易用,值得专门造一个轮子来深入了解和学习这种用法,顺便也实际动手体验一下实现一个HTTP服务器的感觉,当然里面还有很多不完整或者说没有考虑周全的地方:比如接收HTTP请求的时候默认了HTTP请求头的所有数据都在一个数据包中一次性读取完成,这在生产环境中肯定不行(这个问题留着以后解决吧)。
首先介绍一下这个HTTP服务器实现的功能:
可以在Lua脚本中注册URL,浏览器访问这个URL时可以调用执行Lua中注册的钩子函数,实现HTTP服务器的业务逻辑使用Lua脚本语言来处理。
使用epoll系统调用,实现数据的接收和发送都是单进程异步的方式。
Log日志系统,提供一个分级的日志接口,实现将所有日志都存储在一个日志文件中。
实现这么一个HTTP服务器可以学习到的东西:
Lua和C两种语言之间的交互过程,以及如何使用C来编写Lua的函数库。
epoll系统调用实现数据的异步接收和发送
Log日志的集中处理
一个HTTP服务器的完整处理流程:接受到请求、解析请求、请求处理、构造请求回复头、发送请求文件给浏览器。
Lua注册钩子函数的实现
在lua/task_test.lua文件中给出了Lua中注册钩子函数的示例程序,首先要加载libtask这个库,然后调用task.regExecutor("HTTPGET:/lua_hello.html", 0, callback)来注册钩子函数,他的意思是假如你使用GET请求访问这个链接http://server_ip/lua_hello.html时会调用到Lua中的callback函数。其中第二个参数0表示这个钩子函数的优先级,也就是说同一个URI可以注册多个钩子函数来处理,然后服务器会按照这个优先级来依次调用注册的钩子函数。
注册钩子函数的功能是在libtask.c这个文件中实现的,它的实质就是以URI为哈希的Key,一