代码改变世界

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入手,下面是我做的笔记

image        从上面的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