lighttpd高性能Web服务器源码分析?坑爹啊,原来是light httpd!-0 -
2011-08-10 16:40 Aga.J 阅读(19929) 评论(4) 编辑 收藏 举报最近刚打算学unix网络编程,所以做了点入门的准备后,就找了个轻量级的web服务器的源码来看,听网上介绍说lighttpd不错,所以我找了一下,把所谓的源码下了下来,研究了一下,最后发现哥玩的是light httpd(http://lhttpd.sourceforge.net/docs.html)不是lighttpd(http://www.lighttpd.net/),坑爹啊!!!尼玛怎么长那么像啊!!
所以下面说的全是light httpd的源码分析,要看lighttpd的同学就等我有空再贴文章吧。
(1)先看热闹
上 light httpd官方网址(http://lhttpd.sourceforge.net/docs.html)把该浏览的都浏览一遍,然后去sourceforge把源码下下来,在linux上解压后,按照http://lhttpd.sourceforge.net/docs.html 官方文档介绍,跑起服务器来,在浏览器上输入url确认服务运行成功。自己再试试放几个html文件到htdocs文件夹下然后访问访问也可以。
(2)后看门道
看玩热闹,开始看源码实现!
前些日子写过一个日志监控程序,要求用makefile来建立工程,那么很自然我就从源码文件的makefile入手,下面是我做的笔记
(1)makefile可以在编译时做一些编译控制
(2)尽量使用常量,方便修改
(3)一般的makefile需要我们执行 make , make install, make clean
make指令用来编译文件并生成目标文件
make install指令用来建立安装目录并存放程序资源(可执行文件,配置文件,脚本,资源等)
make clean指令用来清除已生成的obj文件
(4)light httpd web服务器的目录结构是这样的:
主目录(DESTDIR):可执行文件,错误页面,执行脚本
二级目录(htdocs):资源页面或者文件
二级目录(cgi-bin):cgi脚本
配置文件所在目录(/etc):服务器的配置文件
(5)最后注意要给每个文件和目录做权限控制
接下来当然是main.c的main函数(函数实体较长,这里不贴出来了):
(1)定义变量,初始化变量(包括默认host的基本信息)
(2)读取lhttpd.conf计算virtual host个数,并每个host的信息为分配内存空间
(3)readinconfig() 完成对lhttpd.conf的配置相关数据读取和变量赋值。
(4)创建并绑定监听socket
(5)使用fork子进程退出父进程的方式使得程序转为后台程序
(6)阻塞等待客户端连接,如果客户端连接成功,则fork子进程来处理通信(子进程会将一些从父进程继承来的没必要的东西销毁)
(7)借助fd_set和select来实现通信监控,一旦有通信信号被监控,执行serveconnection(new_fd)来做报文收发
erveconnection(new_fd)函数的分析:
(1)调用recv接收请求HTTP报文,并提取出关键字段(GET,目标资源,host)
(2)调用send发送HTTP响应报文
其他细节:
(1)使用系统日志
(2)做进程信号处理
(3)记录服务器进程号,方便使用脚本终止进程
(4)CGI模块
(5)多媒体资源请求响应
总的来说,light httpd(lhttpd)是一个比较简单的web服务器,并没有什么策略让它可以支持大量用户接入和大量请求响应,毕竟是一个很老很老的web 服务器,它短小精悍,代码写得挺不错,基本功能实现了同时也细心了考虑的一些可能出现的异常情况。
分析手记:lhttpd分析笔记.rar
作者:Aga.J
出处:http://www.cnblogs.com/aga-j
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
个人学习笔记仅供本人记录知识所用,不属发表性文章。