Ejet
eJet 是一个轻量级、高性能、嵌入式Web服务器,实现HTTP/1.1全栈功能,包括TLS/SSL、正向代理、反向代理、FastCGI、Cookie、Web Cache、访问日志、HTTP变量、HTTP Script脚本程序、JSon配置文件、虚拟主机、HTTP Location、Rewrite/Try_files等指令、HTTP Tunnel、应用回调和动态库回调等,是超大文件上传下载、网站、PHP、CDN、Web Cache、嵌入式Web等服务的理想平台
Install / Use
/learn @kehengzhong/EjetREADME
eJet - a lightweight high-performance embeded Web Server
eJet is a lightweight, high-performance, embedded Web server that implements the full-stack functions of the HTTP/1.1 protocol, including TLS/SSL, Forward/Reverse Proxy, FastCGI, Cookie, Web Cache, Access Log, HTTP Variable, HTTP Script, JSon-style configuration file, Virtual Host, HTTP Location, Directives such as Rewrite/Try_files, HTTP Tunnel, Application/Dynamic-Lib Callbacks, etc. It's an ideal service platform hosting for upload/download of super-large files, website, PHP, CDN, Web Cache, embedded Web, etc.
eJet 是一个轻量级、高性能、嵌入式Web服务器,实现HTTP/1.1协议全栈功能,包括TLS/SSL、正向代理、反向代理、FastCGI、Cookie、Web Cache、访问日志、HTTP变量、HTTP Script脚本程序、JSon配置文件、虚拟主机、HTTP Location、Rewrite/Try_files等指令、HTTP Tunnel、应用回调和动态库回调等,是承载超大文件上传下载、网站、PHP、CDN、Web Cache、嵌入式Web等服务的理想平台。
目录
- 一. eJet是什么?
- 二. eJet系统流程和工作原理
- 2.1 Web服务器基本功能
- 2.2 eJet Web服务器启动流程
- 2.3 启动监听服务
- 2.4 http_pump作为事件驱动核心入口
- 2.5 IOE_ACCEPT事件驱动eJet创建HTTPCon连接
- 2.6 IOE_READ事件驱动eJet读取请求数据
- 2.7 解析HTTP请求数据
- 2.8 创建HTTPMsg保存请求数据
- 2.9 设置DocURI并启动HTTPMsg资源实例化
- 2.10 Proxy代理转发
- 2.11 FastCGI转发
- 2.12 读取并解析请求体
- 2.13 由Handler处理HTTPMsg
- 2.14 发送响应到客户端
- 2.15 用状态机处理不完整请求
- 2.16 设置可写通知产生IOE_WRITE事件处理网络拥塞
- 2.17 利用定时器产生的IOE_TIMEOUT事件监管实例对象
- 三. eJet系统基本数据结构
- 3.1 HTTPMgmt - eJet内核
- 3.2 HTTPMsg - 消息
- 3.3 HTTPCon - 通信连接
- 3.4 HTTPListen - 监听服务
- 3.5 HTTPHost - 虚拟主机
- 3.6 HTTPLoc - 资源位置
- 3.7 HTTPHeader - 头信息
- 3.8 HTTPUri - 资源地址URL
- 3.9 HTTPVar - HTTP变量
- 3.10 HTTPLog - 日志信息
- 3.11 CacheInfo - 缓存信息管理
- 3.12 HTTPForm - 表单信息
- 3.13 HTTPScript - 脚本程序
- 3.14 HTTPSrv - 源服务器
- 3.15 HTTPChunk - HTTP数据块
- 3.16 HTTPCookie - Cookie数据
- 3.17 FcgiSrv - FastCGI服务器
- 3.18 FcgiCon - FastCGI通信连接
- 3.19 FcgiMsg - FastCGI消息
- 四. eJet核心功能模块
- 4.1 eJet资源管理架构
- 4.2 HTTP变量
- 4.3 HTTP Script脚本
- 4.3.1 HTTP Script脚本定义
- 4.3.2 HTTP Script脚本类型
- 4.3.3 Script脚本嵌入位置
- 4.3.4 Script脚本范例
- 4.3.5 Script脚本语句
- 4.3.5.1 条件语句
- 4.3.5.2 赋值语句
- 4.3.5.3 返回语句
- 4.3.5.4 响应语句
- 4.3.5.5 rewrite语句
- 4.3.5.6 addReqHeader语句
- 4.3.5.7 addResHeader语句
- 4.3.5.8 delReqHeader语句
- 4.3.5.9 delResHeader语句
- 4.3.5.10 addResBody语句
- 4.3.5.11 appendResBody语句
- 4.3.5.12 addFile2ResBody语句
- 4.3.5.13 appendFile2ResBody语句
- 4.3.5.14 try_files 语句
- 4.3.5.15 注释语句
- 4.3.5 Script脚本解释器
- 4.4 JSon格式的系统配置文件
- 4.5 事件驱动流程 http_pump
- 4.6 HTTP请求和响应
- 4.7 HTTPMsg的实例化流程
- 4.8 HTTP MIME管理
- 4.9 HTTP URI管理
- 4.10 chunk_t数据结构
- 4.11 HTTP请求/响应的发送流程(writev/sendfile)
- 4.12 eJet日志系统
- 4.13 Callback回调机制
- 4.14 正则表达式的使用
- 4.15 TLS/SSL
- 4.16 Chunk传输编码解析
- 4.17 反向代理和正向代理
- 4.18 FastCGI机制和启动PHP的流程
- 4.19 两个通信连接的串联Pipeline
- 4.20 HTTP Cache系统
- 4.21 HTTP Tunnel
- 4.22 HTTP Cookie机制
- 五. eJet为什么高性能
- 六. eJet Web服务应用案例
- 七. eJet相关的另外两个开源项目
- 八. 关于作者 老柯 (laoke)
一. eJet是什么?
eJet Web服务器是利用 adif数据结构和算法库 和 ePump框架,用C语言开发的一个事件驱动模型、多线程、大并发连接的轻量级的高性能Web服务器,支持HTTP/1.0和HTTP/1.1协议,并支持HTTP Proxy、Tunnel等功能。
在Linux下,eJet Web服务器编译成动态库或静态库的大小约为300K,可集成嵌入到任何应用程序中,增加应用程序使用HTTP通信和服务承载的能力,使其具备像Nginx服务器一样强大的Web功能。
eJet Web服务器完全构建在ePump框架之上,利用ePump框架的多线程事件驱动模型,实现完整的HTTP请求<-->HTTP响应事务流程。eJet并没有创建进程或线程,利用ePump框架的事件驱动多线程,高效地运用服务器的CPU处理能力。
eJet接收和处理各TCP连接上的HTTP请求头和请求体,经过解析、校验、关联、实例化等处理,执行HTTP请求,或获取Web服务器特定目录下的文件,或代理客户端发起向源HTTP服务器的请求,或将HTTP请求通过FastCGI接口转发到CGI服务器,或将客户端HTTP请求交给上层设置的回调函数处理等。所有处理结果,最终以HTTP响应方式,包括HTTP响应头和响应体,通过客户端建立的TCP连接,返回给客户端。该TCP连接可以Pipe-line方式继续发送和接收多个HTTP请求和响应。
eJet服务器提供了作为Web服务器所需的其他各项功能,包括基于TLS/SSL的安全和加密传输、虚拟主机、资源位置Location的各种匹配策略、对请求URI执行动态脚本指令(包括rewrite、reply、return、try_files等)、在配置文件中使用HTTP变量、正向代理和反向代理、HTTP Proxy、FastCGI、HTTP Proxy Cache功能、HTTP Tunnel、MultiPart文件上传、动态库回调或接口函数回调机制、HTTP日志功能、CDN分发等。
eJet Web服务器采用JSon格式的配置文件,进行系统配置管理。对JSon语法做了一定的扩展,使得JSon支持include文件指令,支持嵌入Script脚本程序语言。使用扩展JSon功能的配置文件,可更加灵活、方便地扩展Web服务功能。
eJet系统大量采用了Zero-Copy、内存池、缓存等技术,来提升Web服务器处理性能和效率,加快了请求响应的处理速度,支撑更大规模的并发处理能力,支持更大规模的网络吞吐容量等。
eJet Web服务器既可以面向程序员、系统架构师提供应用程序开发接口或直接嵌入到现有系统中,也可以面向运维工程师部署完全类似Nginx Web服务器、Web Cache、CDN回源等商业服务系统,还是面向程序员提供学习、研究开发框架、通信系统等的理想平台。
开发eJet Web服务器的原则是尽可能不依赖于第三方代码和库,降低版权和复杂部署等因素带来的潜在风险。系统使用的第三方代码或库主要为:OpenSSL库、Linux系统自带的符合POSIX标准的正则表达式regex库。gzip压缩需要依赖zlib开源库,目前没有添加进来,所以eJet Web服务器暂时不提供gzip、deflate的压缩支持。
二. eJet系统流程和工作原理
2.1 Web服务器基本功能
Web服务器,常称网站服务器,将具有独立IP地址的服务器上承载的图、文、音频、视频和数据文件等资源,以URL方式来标识,以HTTP协议对外提供下载、浏览、上传、交互等服务。HTTP协议是一个请求-响应的事务型协议,Web服务器的基本工作流程基本是围绕请求应答来完成的,具体包括:
- 建立连接 —— 接受客户端连接,或
