精华内容
参与话题
问答
  • Lighttpd的安装与配置

    万次阅读 2009-08-18 17:37:00
    Lighttpd的安装与配置作者:zccst 理论篇lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的webserver环境。具有非常低的内存开销,cpu占用率低,...

    Lighttpd的安装与配置

    作者:zccst

     

     

    理论篇

    lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的webserver环境。具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的webserver中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能,而Apache之所以流行,很大程度也是因为功能丰富,在lighttpd上很多功能都有相应的实现了,这点对于apache的用户是非常重要的,因为迁移到lighttpd就必须面对这些问题。

     

        为什么使用Lighttpd,从性能方面来说,首先考虑单进程与多进程问题,这也是我为什么不想使用Apache的原因,多进程服务器的惊群问题,简单来说多进程服务(例如Apache)在一个请求发送时候会唤醒所有sleep的进程,但是最终服务的只有一个,在进程数目很多,请求频繁的时候这会造成一个大困扰,系统会忙于切换进程,如果看Top会发现CPU使用在system的比例很高,至于Lighttpd则使用单进程来响应 quest,使用 libeventpoll()作为event handler,如果在linux2.4下,还可以选择rtsig作为event handler。如果不使用大文件(>4G)支持,lighttpd使用sendfile()来发送文件,完全的zero-copy,在这方面性能表现是占优的。同时Lighttpd使用FastCGI来做动态脚本处理,经过实测,在性能表现上也可以接受。

     

        另外就是原先使用Apache的用户迁移成本会比较少,Lighttpd语法与Apache接近,并且核心功能基本实现,我关注的就是 url_rewrite,PHP(这是当然的),alias,custom_log这几个模块,语法接近,并且也同样支持跟cronolog的管道配合日志,所以迁移之后功能都可以实现。另外我比较了ApacheLighttpdSuexec方案,虽然目前Lighttpd并没有官方模块来支持这一特性,但是就实现的难度来看,跟 Apache1.3乃至Apache2+MPM差不多……(如果希望安全的使用Apache2+MPM+PHP,一样需要 FastCGI模式)

     

        实用起来lighttpd确实非常不错,apache主要的问题是密集并发下,不断的fork()和切换,以及较高(相对于 lighttpd而言)的内存占用,使系统的资源几尽枯竭。而lighttpd采用了Multiplex技术,代码经过优化,体积非常小,资源占用很低,而且反应速度相当快。

     

    利用apacherewrite技术,将繁重的cgi/fastcgi任务交给lighttpd来完成,充分利用两者的优点,现在那台服务器的负载下降了一个数量级,而且反应速度也提高了一个甚至是2个数量级!

     

    实践篇

    系统RedHat

    一、           安装

    1, Pcre

    (1)     下载。

    ftp://ftp.pbone.net/mirror/www.startcom.org/AS-4.0.0/os/i386/StartCom/RPMS/pcre-devel-4.5-3.2.SEL4.i386.rpm

    (2)     安装。rpm -ivh pcre-devel-4.5-3.2.SEL4.i386.rpm --nodeps(强制安装)

    (3)     输入rpm -qa |grep pcre

      返回结果:pcre-4.5-3 pcre-devel-4.5-3.2.SEL4 表示已经成功安装

    2, lighttpd

    tar

    cd

    ./configure --prefix=/opt/lighttpd

    make

    make install

     

    二、           配置

    1cp doc/sysconfig.lighttpd /etc/sysconfig/lighttpd

     

    2cp doc/rc.lighttpd.redhat /etc/init.d/lighttpd   

    注:/etc/init.d/lighttpd           此脚本用来控制启动、关闭和重起。

    修改/etc/init.d/lighttpd,

    lighttpd="/usr/sbin/lighttpd" 改为 lighttpd="/usr/local/lighttpd/sbin/lighttpd"

     

    3,创建文件夹

    1)创建网站根目录文件夹

    mkdir /var -p /www/htdocs

    2)创建日志文件夹

    mkdir /usr/local/lighttpd/logs

    3)创建静态文件压缩

    mkdir /usr/local/lighttpd/compress

     

    4, 修改主配置文件

    mkdir /etc/lighttpd

    注:/etc/lighttpd/lighttpd.conf    此文件是lighttpd的主配置文件

    cp doc/lighttpd.conf /etc/lighttpd/lighttpd.conf

    1)修改网站根目录路径

        server.document-root    = "/srv/www/htdocs/" (40)

    改为  server.document-root    = "/var/www/htdocs/"

    2)设置错误日志文件路径

    server.errorlog = "/usr/local/lighttpd/logs/lighttpd.error.log" (43)

    设置访问日志文件路径

    accesslog.filename = "/usr/local/lighttpd/logs/access.log" (116)

     

    3compress.cache-dir = "/usr/local/lighttpd/compress/"

    compress.filetype = ("text/plain", "text/html","text/javascript","text/css")

    可以指定某些静态资源类型使用压缩方式传输,节省带宽,对于大量AJAX应用来说,可以极大提高页面加载速度。

     

    4)把#server.port                = 81 前的#去掉

     

    5server.modules(24)

    取消需要用到模块的注释,mod_rewritemod_accessmod_fastcgi

    mod_simple_vhostmod_cgimod_compressmod_accesslog是一般需要用到的。

    "mod_fastcgi"前边的#去掉(24);把"mod_cgi"前边的#去掉(29)

     

    6)用什么权限来运行lighttpd

    server.username = "lighttpd"

    server.groupname = "lighttpd"

    从安全角度来说,不建议用root权限运行web server,可以指定普通用户权限。

     

    7#$HTTP["url"] =~ "/.pdf$" {

    # server.range-requests = "disable"

    #}

     

    5,创建lighttpd用户

    useradd lighttpd

    chown –R lighttpd:lighttpd /usr/local/lighttpd/

    chown –R lighttpd:lighttpd /var/www/htdocs/

     

     

    三、           启动并测试

    1, 启动

    /etc/init.d/lighttpd start 

    /usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/etc/lighttpd.conf

    相关指令一览:

    /etc/init.d/lighttpd stop

    /etc/init.d/lighttpd restart

    /etc/init.d/lighttpd status

    如果你希望服务器启动的时候就启动lighttpd,那么:chkconfig lighttpd on

    2, 测试

    /var/www/htdocs里建一个index.html

    然后在浏览器里输入192.168.233.142:81

    输出:hello,I am lighttpd!

    测试成功!~~~

     

     

    四、           总结

    服务器软件至今一共有3种,分别为apache,lighttpd,nginx。他们之间的共同点是

    1,  都需要创建网站根目录文件夹

    2,  都需要各自用户权限,而不是root权限。

    3,  主配置文件是修改重点。其实这一点几乎对所有的软件都是正确的。

    他们的区别是:apache+mysql+php(mod),而lighttpd/nginx+mysql+php(fastcgi),在安装后续软件mysql,php时需注意。

    展开全文
  • 简介:Lighttpd是一个轻量级的Web 服务器,支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。它具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。其静态文件的响
    分类: Linux C/C++ 237人阅读 评论(0)收藏举报

    一、    前言

    简介:Lighttpd是一个轻量级的Web 服务器,支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。它具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。其静态文件的响应能力远高于Apache,可谓Web服务器的后期之秀。

    功能:接收、响应用户请求,网元间消息通信,资源传递等。

    我将lighttpd理解为一个平台,提供了一整套开发流程以及各种高效的工具。使得我们在服务器功能开发时就像使用VC在现有工程中添加模块一样简单:

    VC

    Lighttpd

    打开已有工程并添加新模块的源文件

    添加空的插件,自定义插件名,将其加入到makefile中

    编码,调用各种库函数完成对字符串、数组等数据的处理。

    编码,调用各种库函数(array、buffer、 chunk等等)完成对字符串、数组等数据的处理。

    编译、连接(点图标或按快捷键)

    编译、连接(执行makefile或封装好的脚本)

    运行、调试

    运行、调试

    Lighttpd架构的设计初衷,所有具体的业务功能都应由插件实现。插件之间通常是完全独立(无内联)的,我们可以根据需要选择性的加载所需插件。

    因此我们在开发时主要也是针对业务插件的编写和修改以完成我们所需的功能。

    二、    架构

    1.     状态机

    谈到架构就必须从状态机说起,Lighttpd启动时完成了Server实例初始化、默认配置读取(lighttpd.conf)、插件加载等初始化操作,之后就进入了一个包含11个状态的有限状态机中。每个连接(事件)都是一个connection实例(con)。状态的切换完全取决于con->state。

    ※     我们在插件中对事件的处理就是针对这个con实例;lighttpd经过初步处理后将con的基本信息初始化;插件拿到con后按照业务需要进行相应处理,然后再交还给lighttpd;lighttpd根据con中的信息完成响应。至此一次请求(事件)结束。

    typedef enum {

           CON_STATE_CONNECT,

           CON_STATE_REQUEST_START,

           CON_STATE_READ,

           CON_STATE_REQUEST_END,

           CON_STATE_READ_POST,

           CON_STATE_HANDLE_REQUEST,

           CON_STATE_RESPONSE_START,

           CON_STATE_WRITE,

           CON_STATE_RESPONSE_END,

           CON_STATE_ERROR,

           CON_STATE_CLOSE

    } connection_state_t;

     

    Lighttpd状态转换图

    2.     插件

    我们编写的插件会注册15(或其中的几个)回调接口(1.4.20)。lighttpd在初始化阶段、状态机执行阶段、退出阶段会分别调用这些回调函数,完成插件的实例化,初始化,连接重置,事件处理,插件释放等功能。它们分别是:

    名称

    handle_uri_raw

    handle_uri_clean

    handle_subrequest_start

    handle_subrequest

    handle_request_done

    handle_docroot

    handle_physical

    handle_connection_close

    handle_joblist

    connection_reset

    handle_trigger

    handle_sighup

    init

    set_defaults

    cleanup

    上述每个接口在调用时大多传入了参数(server *srv,connection *con),有一部分接口是不针对事件本身的,例如插件初始化接口init,因此只传入了(server*srv)。

    前面提到过,我们的开发工作主要集中在编写业务插件上,而插件被调用的方式就是通过上述这些接口;我们的插件与lighttpd都在针对本次事件con进行相关操作。因此我们需要关注以下几点:

            这些函数的执行顺序、执行位置、执行次数和执行条件;

            接口调用时我们有哪些数据可用;(con实例下的哪些数据有效)

            接口内我们应该完成的工作;(填写con实例下的哪些数据,返回什么值)

    3.     状态机与插件

    二者联系:

    事件所处状态机中的各个状态,lighttpd都会对事件进行相应处理。有些是lighttpd自身做的,有些是通过调用插件完成的。插件中那些负责事件处理的接口分布在某几个状态中。

    我们只需在插件的各个阶段完成指定工作并返回相应的返回值,就可以促使状态机完成状态切换,完成事件的整套处理流程,并最终由lighttpd完成事件的响应。

    例如:

    在CON_STATE_REQUEST_END状态,lighttpd对请求进行了解析,并获得了con->request.http_method,con->request.uri,con->request.http_host等重要数据。——lighttpd自身对con的处理。

    在CON_STATE_HANDLE_REQUEST状态,lighttpd除了自身对con中数据处理外还调用了插件的接口:handle_uri_raw;handle_uri_clean;handle_docroot;handle_physical;handle_subrequest_start;handle_subrequest。——插件对con的处理。

    插件处理:

    在CON_STATE_HANDLE_REQUEST状态,lighttpd调用了插件的handle_uri_raw接口。但是我们有几十个插件,每个插件都注册了handle_uri_raw这个接口。如何让我们指定的插件来完成对事件数据的处理而不受其他插件的影响呢?

    lighttpd对插件的调用方式:在lighttpd中每次需要调用插件某一个阶段的接口函数时,会对所有插件注册在该位置接口顺序调用,顺序与插件加载顺序相同。例如:调用uri_raw接口,会先调用A插件的mod_A_uri_raw,然后调用B插件的mod_B_uri_raw,直到将所有已加载插件这个位置的接口全部调用完成。但实际处理这次事件通常只有一个插件,这里引出一个重要概念——事件接管。每个事件都有一个mode字段(con->mode)。该字段的定义:

    typedef enum { DIRECT, EXTERNAL } connection_type;

    连接对象有一个字段mode用来标识该连接是最初由服务器accept产生的客户端连接还是插件产生的其他辅助连接,当mode=DIRECT时表示对应连接由lighttpd服务器accept产生,mode!=DIRECT时表示对应连接是由插件产生的。——网络释义

    通过搜索代码得到以下信息:

                事件(con)初始化时mode是DIRECT;connection_reset(srv,con);

                lighttpd在大部分流程中还会在入口判到mode != DIRECT时就直接返回GO_ON。可以理解为:此事件由用户插件接管,lighttpd不参与。

                用户编写的插件应通过将mode置为插件自身的ID达到接管的作用。插件ID是在插件加载时由插件的加载顺序确定的,是插件的唯一标识。

                用户编写插件在每个接口的一开始应该判断mode是否等于自身的ID,若相等才能继续执行,否则直接退出,返回GO_ON。

    ※     我曾遇这样一种情况,在自己编写的插件中将响应码设置为所需值后返回FINISH,本期望lighttpd可以直接构造所需响应并把响应码返回给用户。可实际在用户侧抓包看到的返回值却是其他值,肯定是由lighttpd或其他插件改写过。经专家指点,把mode赋值为DIRECT后结果才得以正确返回。因此在某些特定阶段,如果插件想要直接停止事件的处理并返回(通常是出错返回),还需要将mode置回为DIRECT,令lighttpd及时接管并处理。(原因在之后的源码学习中会补充上)

    4.     各状态工作简述

    Lighttpd事件处理的返回值定义:

    typedef enum {

    HANDLER_UNSET,

                  HANDLER_GO_ON,

                  HANDLER_FINISHED,

                  HANDLER_COMEBACK,

                  HANDLER_WAIT_FOR_EVENT,

                  HANDLER_ERROR,

                  HANDLER_WAIT_FOR_FD

    } handler_t;

    这里针对各状态的主要内容作一简单描述:

    CON_STATE_CONNECT

            清除待读取队列中的数据chunkqueue_reset(con->read_queue);

            置con->request_count = 0。(本次连接还未处理过请求)

    CON_STATE_REQUEST_START  /*transient */

            记录事件起始时间;

            con->request_count++(一次长连接最多可以处理的请求数量是有限制的);

            转移到CON_STATE_READ状态。

    CON_STATE_READCON_STATE_READ_POST

            connection_handle_read_state(srv,con);

    CON_STATE_REQUEST_END    /*transient */

            http_request_parse(srv, con);解析请求,若是POST请求则转移到CON_STATE_READ_POST状态,否则转移到CON_STATE_HANDLE_REQUEST状态。

    CON_STATE_HANDLE_REQUEST

            http_response_prepare(srv, con);函数中调用了handle_uri_raw;handle_uri_clean;handle_docroot;handle_physical;handle_subrequest_start;handle_subrequest。

            如果函数返回了HANDLER_FINISHED,且con->mode!=DIRECT(事件已经被我们的业务插件接管),则直接进入CON_STATE_RESPONSE_START。否则lighttpd会做一些处理后再进入CON_STATE_RESPONSE_START状态。

            如果函数返回了HANDLER_WAIT_FOR_FD或HANDLER_WAIT_FOR_EVENT,状态依旧会停留在CON_STATE_HANDLE_REQUEST,等待事件或数据。

            如果函数返回了HANDLER_ERROR,进入到CON_STATE_ERROR状态。

    CON_STATE_RESPONSE_START

            connection_handle_write_prepare(srv,con);

    CON_STATE_WRITE

            connection_handle_write(srv,con);

    CON_STATE_RESPONSE_END

            调用插件的handle_request_done接口。

            如果是长连接,重新回到CON_STATE_REQUEST_START;否则调用插件的handle_connection_close接口。

            执行connection_close(srv, con);和connection_reset(srv, con);将连接关闭。

    CON_STATE_ERROR   /* transient */

            调用插件handle_request_done;

            调用插件handle_connection_close;

            执行connection_close将连接关闭。

    CON_STATE_CLOSE

            connection_close(srv, con);将连接关闭。

    三、    源码学习:(待续)

    这里向大家推荐一个博客http://www.cnblogs.com/kernel_hcy/category/218768.html,对lighttpd的入门很有帮助。

    http://www.lighttpd.net/这是lighttpd的官方网站。需要权威的、官方的说明就去看看。可以下到各个版本的lighttpd源码,周末跟家可以搭个服务器学习学习。

    1.     概述

    Lighttpd (1.4.20)中包含.c和.h文件供134个,共计代码量3.8+w。其余还有makefile,conf,doc,可执行文件等。

    比较独立的有:

            以mod_开头的是插件,共45个;

            基础数据结构和配套方法有Array,Buffer,Chunk,Bitset,Etag等;

            数据校验有MD5和CRC;

            Log.c/h,日志相关;

            以data_开头的数据操作方法6个;

    非常重要的有:


    2.     代码

    这里只对两三个重要的函数进行了研读,等以后有机会慢慢补充。

    Request.c

    inthttp_request_parse(server *srv, connection *con)

    只在CON_STATE_REQUEST_END状态调用,此时插件处理流程还未开始。在此函数中完成请求的合理性判断,完成用户请求的最基本解析:获取con->request.http_method,con->request.uri,con->request.http_host。

            解析请求的第一行,应该是<method> <uri> <protocol>\r\n格式

            请求行不符合规定格式回复400;

            请求方法不可识别回复501,方法识别完成保存在con->request.http_method中;

            协议版本不是1.1或1.0则回复505;

            将http://xxx.xx.xx.xx/中的x区域忽略掉,后面的部分保存在con->request.uri中;

            ……

            是否为长连接,置con->keep_alive的值;

            有些方法需要配合相应头域,若没有配套头域则返对应错误;GET和HEAD不能有content-length;POST则必须有content-length;

            完成con->request.http_host 的赋值,由上面解析获得。

     

    Response.c

    handler_thttp_response_prepare(server *srv, connection *con)

    只在CON_STATE_HANDLE_REQUEST状态调用,此时插件处理流程还未开始。

    l        /* looks like someone hasalready done a decision */
    if (con->mode == DIRECT &&(con->http_status != 0 && con->http_status != 200));满足上述3个条件,return HANDLER_FINISHED;可以理解为连接是由lighttpd内部产生的,并且经过之前的处理已经得到了最终结果(非0——被处理过,非200)。

    其中这段需要学习con->file_finished标志

    /* remove apackets in the queue */

           if(con->file_finished == 0) {

                  chunkqueue_reset(con->write_queue);

           }

            con->uri.scheme赋值;若采用SSL设置为https,否则设置为http。

            con->uri.authority赋值;直接使用了con->request.http_host。

            进行了一系列的config_patch_connection()操作,具体还需再深入看。

            con->uri.path_raw和con->uri.query赋值;将请求中con->request.uri的'#'后面部分去除。将con->request.uri的'?'(如果存在)后面的部分保存在con->uri.query中;然后将剩下的字符串保存在con->uri.path_raw中。

            if (con->request_count >con->conf.max_keep_alive_requests);判断如果当前长连接处理的请求数量超过了lighttpd.conf中配置的最大数,在本次处理结束后将连接断开。con->keep_alive = 0;

            con->uri.path赋值;如果是OPTIONS方法并且只是一个'*',则不需要解码,直接使用con->uri.path_raw对con->uri.path赋值;如果不是前面所描述的方法和格式,则需要进行解码处理buffer_urldecode_path,将con->uri.path_raw中的%20转换为空格符' '。然后将转换后的字符串赋值给con->uri.path。

    ※     至此,经过lighttpd对请求中uri的最基本处理,我们得到了完整的con->uri,可以在插件中通过对con->uri的分析和处理完成所需功能;uri是request_uri结构体实例。具体定义见下:

    typedef struct {

           buffer*scheme;

           buffer*authority;

           buffer*path;

           buffer*path_raw;

           buffer*query;

    } request_uri;

            调用插件的uri_raw;plugins_call_handle_uri_raw(srv, con);如果返回GO_ON,则继续向下执行;否则直接将结果return,退出本函数。

            调用插件的uri_clean;plugins_call_handle_uri_clean(srv, con); 如果返回GO_ON,则继续向下执行;否则直接将结果return,退出本函数。

    ※     从代码中可见uri_raw到uri_clean之间lighttpd本身并没有在插件外做额外操作。我们应该在uri_raw中根据uri的特征决定该交由哪个业务插件进行处理;在uri_clean中对uri按我们的需要进行处理,以满足后面通过uri进一步获取资源在Server中的物理路径。

     

            如果是OPTIONS方法并且con->uri.path_raw只是'*',则调用response_header_insert(),设置返回状态200(con->http_status = 200;),并置con->file_finished=1,return FINISH。

    typedef struct {

           buffer*path;

           buffer*basedir;  /* path ="(basedir)(.*)" */

           buffer*doc_root; /* path = doc_root + rel_path */

           buffer*rel_path;

           buffer*etag;

    } physical;

            con->physical.doc_root和con->physical.rel_path赋初值。最终值应该在下面的docroot插件中设置。将con->physical.doc_root设置为conf中的con->conf.document_root;将con->physical.rel_path设置为前面获得的con->uri.path;

            调用插件的docroot;plugins_call_handle_docroot(srv, con);在docroot中完成con->physical.doc_root的设置;如果返回GO_ON,则继续向下执行;否则直接将结果return,退出本函数。

    ※     关于docroot的含义可参见http://www.karelia.com/sandvox/help/z/Document_Root.html

            判断在之前的docroot插件中是否设置了con->server_name,若没有设置则使用con->uri.authority作为con->server_name。

            con->physical.basedir赋值;使用con->physical.doc_root对其赋值并通过处理保证以字符'/'结尾。

            con->physical.path赋值;path =doc_root + rel_path。

    ※     上面步骤完成的工作:设置请求资源的根目录,可用默认值也可在插件中重新设置;再根据基准目录+用户请求中的uri完成资源的物理路径定位,保存在con->physical.path。

            调用插件的physical;plugins_call_handle_physical(srv, con);如果返回GO_ON,则继续向下执行;否则直接将结果return,退出本函数。

            如果在physical阶段还是返回了GO_ON,lighttpd认为No one catched away the file fromnormal path of execution yet (like mod_access)。

    ※     根据这里的注释反推,在插件的physical阶段,业务插件应该根据文件的物理路径获取文件,构建响应并返回FINISH。

            lighttpd判断此事件是否已被用户的业务插件接管(con->mode==DIRECT)。如果没被接管,lighttpd自己要亲自去访问这个文件,如果没有权限返回403;如果不存在返回404等等。这里还会调到插件的plugins_call_handle_subrequest_start(srv, con);具体lighttpd做了什么目前没深入看,涉及到了Etag。

            如果已被用户的业务插件接管,lighttpd不会做上一步的处理,而是直接调用插件plugins_call_handle_subrequest(srv, con);此处返回GO_ON和FINISH都会向上返回FINISH结果。其他返回值则如实返回。

            函数结束

     

    Connections.c

    connection_state_machine()

    前面所说的状态机。函数中主要是一个大循环while(done == 0)。

    两个控制循环走向的标志:

    int done=0;

    size_t ostate = con->state;

    循环最后有一个对标志的改写:

    if (done == -1)

    {

           done = 0;

    }

    else if (ostate == con->state)

    {

           done = 1;

    }

    综上,循环达成的条件是:done没有被改为-1并且con->state没有改变(连接状态没有改变)。

    done和con->state是理解这个函数需要时刻关注的变量,同时con->state是状态机的控制变量。switch (con->state){包含了11个connection_state_t的元素和default}

    done在循环中只会被赋值为-1,且只在连接状态为CON_STATE_HANDLE_REQUEST时才会发生。待将上面的标志控制与状态中的返回值对应

    static intconnection_handle_write_prepare(server *srv, connection *con)

            此时如果con->http_status == 0,将其改为403。

            如果con->http_status是204或205或304,此时没有内容需要返回,构建的响应中只有响应头即可,进行一些清理工作后将con->file_finished置为 1;如果不是以上三种返回值则需再判con->mode是否是DIRECT。如果不是DIRECT证明业务插件已做好相应处理,直接进入下一步;是DIRECT的情况下,如果不是4xx或5xx响应,也直接进入下一步。


    …………………………

    ……………………

    ………………

    …………

    ……

    待续

    展开全文
  • lighttpd 服务器搭建过程记录

    千次阅读 2016-08-27 13:26:49
    除去大名鼎鼎的apache、nigix 等,我找了一个 轻量级的,lightttpd 。 本想着搭建应该十分简单,但也有坑。记录如下: 说明: ... 包名为: lighttpd-1.4.4.41.tar.gz. 1、解压 tar -xzf lighttp

    因为想要学下CGI 程序,所以在寻求一个简单easy 的http 服务器。 除去大名鼎鼎的apache、nigix 等,我找了一个 轻量级的,lightttpd 。

    本想着搭建应该十分简单,但也有坑。记录如下:

    说明:

    搭建平台: Centos


    0、下载  ,到官网下载。 包名为: lighttpd-1.4.4.41.tar.gz.
    1、解压  tar -xzf  lighttpd-1.4.4.41.tar.gz.
    2、cd  到 lighttpd-1.4.4.41

    到了此处,建议使用 专有用户进行操作,不要使用root。使用root 会有麻烦,且不符合规范。

    新建用户:

    useradd  lighttpd

    su lighttpd

    passwd (设置密码)


    3、配置安装路径 

        configure --prefix=/usr/local/lighttpd

        由于我图简单,没有安装依赖库 pcre,所以我的配置如下:

    configure --prefix=/usr/local/lighttpd --without-pcre

        这里不好,不要这样做,对使用lighttpd 有很多不方便,建议 还是先安装 pcre库,使用 http://chenzhou123520.iteye.com/blog/1817563 的过程。

    configure --prefix=/usr/local/lighttpd

         来生成makefile。

       若configure 命令成功, 会在当前目录下生成一个makefile。
    4、编译:

         make 

          如果出现没有 target,说明上一步没能成功生产 makefile。回到上一步,解决configure 错误的原因。

          make 成功后, 

         执行 make install 进行安装。

    5、拷贝配置文件。
           为了便于管理,在lighttpd的安装目录下(此刻为/usr/local/lighttpd ),

             新建一个目录:config,专门用于存放此http服务器的配置文件。      

            将安装源文件的doc目录下的config目录的所有文件 都要复制到此处的config目录下。

    注意是:是拷贝所有,不是只拷贝 config/lighttpd.conf。

    6、修改配置文件

             打开 安装目录下的 config/lighttpd.conf ,进行编辑:

            1)修改端口 server.port ,默认是 80,改为8080. 为什么要改,因为默认80 在防火墙里,当然你也可以去防火墙里打开80 端口。

          2)修改 IP,server.bind , 我设置为 127.0.0.1

            3)修改 web 服务器的根目录 server.cocument-root  ,这样改为 你的web应用的目录,由你设置,

                比如  /home/lighttpd/web/webapp/htdos

         4)修改 server.errlog 你可以设置任何一个可以访问的 log 文件夹。 如果没有你可以建立一个。

          5)注释掉 server.use-ipv6

                    注释掉 HTTP["url"]    = "~.pdf"

                   注释掉  #include  “conf.d/dirlisting.conf”

                  为什么呢,因为我没有安装 prec。

    7、语法检查
    ./lighttpd  -t  -f  /usr/local/lighttpd/config/lighttpd.conf
    Syntax OK

    如果有错,就去改那个 lighttpd.conf 和 检查相应的文件是否建立了。直到出现 Syntax 成功。

    8、./lighttpd  -f /usr/local/lighttpd/config/lighttpd.conf
    启动。


    到这为止,都是用户 lighttpd在操作。


    9、测试

     在 你设置的 server.cocument-root 下新建一个 index.html 文件,输出HelloWorld!然后使用浏览器进行访问。

    结果如下:



    PS:

    我这都是自己胡乱记录,未见得对。官方配置文档:

    http://www.mamicode.com/info-detail-1489392.html 


    展开全文
  • lighttpd配置介绍

    千次阅读 2012-07-09 11:48:23
    一,为什么要使用lighttpd?  apache不可以吗?  在支持纯静态的对象时,比如图片,文件等 ,  lighttpd速度更快,更理想  至于它和apache的比较,很多文档,大家可以google一下 二,从何处下载lighttpd...
    一,为什么要使用lighttpd? 
         apache不可以吗?
         在支持纯静态的对象时,比如图片,文件等 ,
         lighttpd速度更快,更理想
         至于它和apache的比较,很多文档,大家可以google一下
    二,从何处下载lighttpd?
         
    http://www.lighttpd.net/download/

         这个是它的官方站
    三,如何安装?
         1,编译安装
           ./configure --prefix=/usr/local/lighttpd
           make
           make install
    configure完毕以后,会给出一个激活的模块和没有激活模块的清单,可以检查一下,是否自己需要的模块都已经激活,在enable的模块中一定要有“mod_rewrite”这一项,否则重新检查pcre是否安装。
         2,编译后配置
           cp doc/sysconfig.lighttpd /etc/sysconfig/lighttpd
           mkdir /etc/lighttpd
           cp doc/lighttpd.conf /etc/lighttpd/lighttpd.conf
           如果你的Linux是RedHat/CentOS,那么:
           cp doc/rc.lighttpd.redhat /etc/init.d/lighttpd
           如果你的Linux是SuSE,那么:
           cp doc/rc.lighttpd /etc/init.d/lighttpd
           其他Linux发行版本可以自行参考该文件内容进行修改。
           然后修改/etc/init.d/lighttpd,把
           LIGHTTPD_BIN=/usr/sbin/lighttpd
           改为
           LIGHTTPD_BIN=/usr/local/lighttpd/sbin/lighttpd
           此脚本用来控制lighttpd的启动关闭和重起:
           /etc/init.d/lighttpd start
           /etc/init.d/lighttpd stop
           /etc/init.d/lighttpd restart
         3,配置
           修改/etc/lighttpd/lighttpd.conf
           1)server.modules
           取消需要用到模块的注释,mod_rewrite,mod_access,mod_fastcgi,mod_simple_vhost,mod_cgi,       mod_compress,mod_accesslog是一般需要用到的。
           我们放开                                "mod_rewrite"
                                                  "mod_compress",
           2)server.document-root, server.error-log,accesslog.filename需要指定相应的目录
              server.document-root         = "/www/phc/html/"
              mkdir /usr/local/lighttpd/logs
              chmod 777 /usr/local/lighttpd/logs/
               touch /usr/local/lighttpd/logs/error.log
               chmod 777 /usr/local/lighttpd/logs/error.log
              server.errorlog              = "/usr/local/lighttpd/logs/error.log"
    accesslog.filename              = "|/usr/sbin/cronolog /usr/local/lighttpd/logs/%Y/%m/%d/accesslog.log"
           3)用什么权限来运行lighttpd
              server.username             = "nobody"
              server.groupname            = "nobody"
              从安全角度来说,不建议用root权限运行web server,可以自行指定普通用户权限。
            4)静态文件压缩
               mkdir /usr/local/lighttpd/compress
               chmod 777 /usr/local/lighttpd/compress/
    compress.cache-dir          = "/usr/local/lighttpd/compress/"
    compress.filetype           = ("text/plain", "text/html","text/javascript","text/css")
               可以指定某些静态资源类型使用压缩方式传输,节省带宽,
               对于大量AJAX应用来说,可以极大提高页面加载速度。
             5)server.port                 = 81
             6)#$HTTP["url"] =~ ".pdf$" {
         131 #  server.range-requests = "disable"
         132 #}
         4,优化
          1 最大连接数
                 默认是1024
                 修改 server.max-fds,大流量网站推荐2048.
                 因为lighttpd基于线程,而apache(MPM-prefork)基于子进程,
                 所以apache需要设置startservers,maxclients等,这里不需要
          2 stat() 缓存
                    stat() 这样的系统调用,开销也是相当明显的.
                   缓存能够节约时间和环境切换次数(context switches)
                   一句话,lighttpd.conf加上
                   server.stat-cache-engine = “fam”
                   lighttpd还另外提供simple(缓存1秒内的stat()),disabled选项.
                   相信没人会选disabled吧.
           3 常连接(HTTP Keep-Alive)
                  一般来说,一个系统能够打开的文件个数是有限制的(文件描述符限制)
                 常连接占用文件描述符,对非并发的访问没有什么意义.
                 (文件描述符的数量和许多原因有关,比如日志文件数量,并发数目等)
                这是lighttpd在keep-alive方面的默认值.
    server.max-keep-alive-requests = 128
    server.max-keep-alive-idle = 30
    换言之,lighttpd最多可以同时承受30秒长的常连接,每个连接最多请求128个文件.
    但这个默认值确实不适合非并发这种多数情况.
    lighttpd.conf 中减小
    server.max-keep-alive-requests
    server.max-keep-alive-idle
    两个值,可以减缓这种现象.
    甚至可以关闭lighttpd keep-alive.
    server.max-keep-alive-requests = 0
    4 事件处理
    对于linux kernel 2.6来说,没有别的可说
    lighttpd.conf中加上这一句足矣
    server.event-handler = “linux-sysepoll”
    另外,
    linux 2.4 使用 linux-rtsig
    freebsd 使用 freebsd-kqueue
    unix 使用 poll
    5 网络处理
    lighttpd 大量使用了 sendfile() 这样一个高效的系统调用.
    减少了从应用程序到网卡间的距离.
    (同时也减少了lighttpd对cpu的占用,这部分占用转嫁到内核身上了)
    根据平台,可以设置不同的参数.
    server.network-backend = “linux-sendfile”
    (linux)
    freebsd: freebsd-sendfile
    unix: writev
    如果有兴趣的话,也可以看看lighttpd在async io(aio)上的实现,仅限 lighttpd 1.5
    (linux-aio-sendfile, posix-aio, gthread-aio)
    此外,网络方面,核心的参数也需要适当进行修改,
    这里就不需要详细说明了.
         5,启动
         6,配置日志
         logrotate & cronolog
    logrotate很粗暴,直接把进程砍了然后移动日志
    cronolog就是比较不错的方式.
    lighttpd用法:
    accesslog.filename = " |/usr/sbin/cronolog /var/log/lighttpd/%Y/%m/%d/access_XXXX.log"
         7,安装pcre
           从何处下载?
          
    http://www.pcre.org/

            wget
    ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.4.tar.bz2

          安装过程:
              ./configure
      make clean
      make
      make install
    8,支持fam
        gamin默认已安装了此包
        yum install gamin-devel
        另外配置时需添加:
        ./configure --prefix=/usr/local/lighttpd --with-fam
    9,测试lighttpd的启动:
    /usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/etc/lighttpd.conf
    10,防止盗链
      #$HTTP["referer"] !~ "^($|http://.*.(chinafotopress.com|chinafotopress.cn))" {      
    #     $HTTP["url"] =~ ".(jpg|jpeg|png|gif|rar|zip|mp3)$" {
    #        #url.redirect = (".*"     => "
    http://www.baidu.com/
    ")
    #         url.access-deny = (".jpg")
    #     }
    #}
    #$HTTP["referer"] == "" {
    #     $HTTP["url"] =~ ".(jpg|jpeg|png|gif|rar|zip|mp3)$" {
    #        #url.redirect = (".*"     => "
    http://www.baidu.com/
    ")
    #         url.access-deny = (".jpg")
    #     }
    #}
    日志处理

    Sometimes, Google Analytics just isn't enough when it comes to
    keeping and interpreting server stats. After finding a suitable log
    file analyzer, AWStats, the next step involved separating out the log
    files on a per domain basis. When the server was first set up,
    everything was shuttled to one set of access and error log files. While
    AWStats could technically analyze this log, the suggested set up
    involves having one set per domain. This article details the process of
    separating out the log files and making sure that these new files get
    rotated correctly.
    Create Log Directories
    While it would be possible to keep all of the files in one directory
    and to just name them relative to the domain, for this tutorial we will
    assume that we will create subdirectories based on the domain name. The
    first step would be to create a directory for each domain.
    sudo -u www-data mkdir /var/log/lighttpd/www.example1.com
    sudo -u www-data mkdir /var/log/lighttpd/www.example2.com
    Update lighttpd.conf
    After creating the directories, it's time to update the lighttpd
    conf file in /etc/lighttpd. We'll want to set the log files by host
    name. We already had directives setting the server.document-root for
    these domains so we only added the bolded lines.
    $HTTP["host"] =~ "(^|\.)example1.com"$" {
    server.document-root = "/var/www/www.example1.com",
    server.errorlog = "/var/log/lighttpd/www.example1.com/error.log",
    accesslog.filename = "/var/log/lighttpd/www.example1.com/access.log",
    }
    $HTTP["host"] =~ "(^|\.)example2.com$" {
    server.document-root = "/var/www/www.example2.com",
    server.errorlog = "/var/log/lighttpd/www.example2.com/error.log",
    accesslog.filename = "/var/log/lighttpd/www.example2.com/access.log",
    }
    After adding these directives, you will need to restart the server.
    sudo /etc/init.d/lighttpd restart
    Update Logrotate
    Finally, we will want logrotate to rotate these new directories.
    Since our main goal is to integrate the logs with AWStats, it made
    sense to add a separate entry for each log directory. However, if you
    don't need call different scripts for the different domains, feel free
    to create one directive. We just copied the existing logrotate
    configuration and editted it for each of the domains. Below are
    examples of what this might look like.
    /var/log/lighttpd/*.log {
    daily
    missingok
    copytruncate
    rotate 60
    compress
    notifempty
    sharedscripts
    postrotate
    if [ -f /var/run/lighttpd.pid ]; then \
    kill -HUP $(
    fi;
    endscript
    }
    /var/log/lighttpd/www.example1.com/*.log {
    daily
    missingok
    copytruncate
    rotate 60
    compress
    notifempty
    sharedscripts
    postrotate
    if [ -f /var/run/lighttpd.pid ]; then \
    kill -HUP $(
    fi;
    endscript
    }
    /var/log/lighttpd/www.example2.com/*.log {
    daily
    missingok
    copytruncate
    rotate 60
    compress
    notifempty
    sharedscripts
    postrotate
    if [ -f /var/run/lighttpd.pid ]; then \
    kill -HUP $(
    fi;
    endscript
    }
    To make just one configuration entry, it would look like this:
    "/var/log/lighttpd/*.log" "/var/log/lighttpd/www.example1.com/*.log" "/var/log/lighttpd/www.example2.com/*.log" {
    daily
    missingok
    copytruncate
    rotate 60
    compress
    notifempty
    sharedscripts
    postrotate
    if [ -f /var/run/lighttpd.pid ]; then \
    kill -HUP $(
    fi;
    endscript
    }
    Sources
         * Lighttpd rotating log files with logrotate tool
         * Howto: Lighttpd web server setting up virtual hosting
    Trackback URL for this post:
    http://tracy.hurleyit.com/trackback/1140
    lighttpd虚拟主机配置
    $HTTP["host"] == "bbs.xxx.com" {
    server.name = "bbs.xxx.com"
    server.document-root = "/var/www/bbs"
    server.errorlog = "/var/www/bbs/error.log"
    accesslog.filename = "/var/www/bbs/access.log"
    }
    else
    lighttpd.conf解释
    server.use-ipv6 = "disable" # 缺省为禁用
    server.event-handler = "linux-sysepoll" # Linux环境下epoll系统调用可提高吞吐量
    #server.max-worker = 10 # 如果你的系统资源没跑满,可考虑调高 lighttpd进程数
    server.max-fds = 4096 # 默认的,应该够用了,可根据实际情况调整
    server.max-connections = 4096 # 默认等于 server.max-fds
    server.network-backend = "linux-sendfile"
    server.max-keep-alive-requests = 0 # 在一个keep-alive会话终止连接前能接受处理的最大请求数。0为禁止
    # 设置要加载的module
    server.modules = (
      "mod_rewrite",
      "mod_redirect",
    # "mod_alias",
      "mod_access",
    # "mod_cml",
    # "mod_trigger_b4_dl",
      "mod_auth",
      "mod_expire",
    # "mod_status",
    # "mod_setenv",
      "mod_proxy_core",
      "mod_proxy_backend_http",
      "mod_proxy_backend_fastcgi",
    # "mod_proxy_backend_scgi",
    # "mod_proxy_backend_ajp13",
    # "mod_simple_vhost",
      "mod_evhost",
    # "mod_userdir",
    # "mod_cgi",
      "mod_compress",
    # "mod_ssi",
    # "mod_usertrack",
    # "mod_secdownload",
    # "mod_rrdtool",
      "mod_accesslog" )
    # 网站根目录
    server.document-root = "/var/www/"
    # 错误日志位置
    server.errorlog = "/var/log/lighttpd/error.log"
    # 网站Index
    index-file.names = ( "index.php", "index.html",
      "index.htm", "default.htm" )
    # 访问日志, 以及日志格式 (combined), 使用X-Forwarded-For可越过代理读取真实ip
    accesslog.filename = "/var/log/lighttpd/access.log"
    accesslog.format = "%{X-Forwarded-For}i %v %u %t \"%r\" %s %b \"%{User-Agent}i\" \"%{Referer}i\""
    # 设置禁止访问的文件扩展名
    url.access-deny = ( "~", ".inc", ".tpl" )
    # 服务监听端口
    server.port = 80
    # 进程id记录位置
    server.pid-file = "/var/run/lighttpd.pid"
    # virtual directory listings 如果没有找到index文件就列出目录。建议disable。
    dir-listing.activate = "disable"
    # 服务运行使用的用户及用户组
    server.username = "www"
    server.groupname = "www"
    # gzip压缩存放的目录以及需要压缩的文件类型
    compress.cache-dir = "/tmp/lighttpd/cache/compress/"
    compress.filetype = ("text/plain", "text/html")
    # fastcgi module
    # for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini
    $HTTP["url"] =~ "\.php$" {
      proxy-core.balancer = "round-robin"
      proxy-core.allow-x-sendfile = "enable"
    # proxy-core.check-local = "enable"
      proxy-core.protocol = "fastcgi"
      proxy-core.backends = ( "unix:/tmp/php-fastcgi1.sock","unix:/tmp/php-fastcgi2.sock" )
      proxy-core.max-pool-size = 16
    }
    # 权限控制
    auth.backend = "htpasswd"
    auth.backend.htpasswd.userfile = "/var/www/htpasswd.userfile"
    # 基于 evhost 的虚拟主机 针对域名
    $HTTP["host"] == "a.lostk.com" {
      server.document-root = "/var/www/lostk/"
      server.errorlog = "/var/log/lighttpd/lostk-error.log"
      accesslog.filename = "/var/log/lighttpd/lostk-access.log"
      # 设定文件过期时间
      expire.url = (
      "/css/" => "access 2 hours",
      "/js/" => "access 2 hours",
      )
      # url 跳转
      url.redirect = (
      "^/$" => "/xxx/index.html",
      )
      # url 重写 (cakephp可用)
      url.rewrite = (
      "^/(css|js)/(.*)$" => "/$1/$2",
      "^/([^.]+)$" => "/index.php?url=$1",
      )
      # 权限控制
      auth.require = ( "" =>
      (
      "method" => "basic",
      "realm" => "admin only",
      "require" => "user=admin1|user=admin2" # 允许的用户, 用户列表文件 在上面配置的auth.backend.htpasswd.userfile 里
      ),
      )
    }
    # 针对端口的虚拟主机
    $SERVER["socket"] == "192.168.0.1:8000" {
      server.document-root = "/var/www/xxx/"
      server.errorlog = "/var/log/lighttpd/test-error.log"
      accesslog.filename = "/var/log/lighttpd/test-access.log"
      # ...

    }


    ------------------------------------------------------------------------------------------------------------------------------------------------------------

    另一篇

    Linux系统下Lighttpd的安装配置

    lighttpd(http://lighttpd.net/)和apache一样是开源的,与apache相比,虽然功能不及apache完善,稳定性也不如apache,但是,不管是服务静态页面,还是服务动态内容(CGI,PHP),它都比apache快,用于ad banner之类的WEB服务器是最恰当不过了。 

    本文从应用的角度,说明如何安装、配置lighttpd。 

    (1) 安装 

    可从http://lighttpd.net/download/下载最新的源码(.tar.gz)或者rpm包。如果下载的是.tar.gz文件,则和GNU的其他软件一样,先./configure一下,然后 make && make install就搞定了。但是如果你想定制一些功能,就得好好看看解压后README, INSTALL以及./configure --help的输出结果了。这里仅仅说一下如何从源码安装,其他安装方式可参考 http://trac.lighttpd.net/trac/wiki/TutorialInstallation。 

    $ gzip -cd lighttpd-1.4.9.tar.gz   tar xf - 
    ... 
    $ cd lighttpd-1.4.9 
    $ ./configure --help 
    `configure' configures lighttpd 1.4.9 to adapt to many kinds of systems. 

    Usage: ./configure [OPTION]... [VAR=VALUE]... 

    To assign environment variables (e.g., CC, CFLAGS...), specify them as 
    VAR=VALUE. See below for descriptions of some of the useful variables. 

    Defaults for the options are specified in brackets. 

    Configuration: 
    ... 

    Installation directories: 
    --prefix=PREFIX install architecture-independent files in PREFIX 
    [/usr/local] 
    --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX 
    [PREFIX] 

    By default, `make install' will install all the files in 
    `/usr/local/bin', `/usr/local/lib' etc. You can specify 
    an installation prefix other than `/usr/local' using `--prefix', 
    for instance `--prefix=$HOME'. 

    For better control, use the options below. 

    Fine tuning of the installation directories: 
    ... 

    Program names: 
    ... 

    System types: 
    ... 

    Optional Features: 
    --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) 
    --enable-FEATURE[=ARG] include FEATURE [ARG=yes] 
    --enable-maintainer-mode enable make rules and dependencies not useful 
    (and sometimes confusing) to the casual installer 
    --disable-dependency-tracking speeds up one-time build 
    --enable-dependency-tracking do not reject slow dependency extractors 
    --enable-static[=PKGS] 
    build static libraries [default=no] 
    --enable-shared[=PKGS] 
    build shared libraries [default=yes] 
    --enable-fast-install[=PKGS] 
    optimize for fast installation [default=yes] 
    --disable-libtool-lock avoid locking (might break parallel builds) 
    --enable-lfs Turn on Large File System (default) 
    --disable-ipv6 disable IPv6 support 

    Optional Packages: 
    --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] 
    --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) 
    --with-gnu-ld assume the C compiler uses GNU ld [default=no] 
    --with-pic try to use only PIC/non-PIC objects [default=use 
    both] 
    --with-tags[=TAGS] 
    include additional configurations [automatic] 
    --with-mysql[=PATH] 
    Include MySQL support. PATH is the path to 
    'mysql_config' 
    --with-ldap enable LDAP support 
    --with-attr enable extended attribute support 
    --with-valgrind enable internal support for valgrind 
    --with-openssl[=DIR] 
    Include openssl support (default no) 
    --with-openssl-includes=DIR 
    OpenSSL includes 
    --with-openssl-libs=DIR OpenSSL libraries 
    --with-kerberos5 use Kerberos5 support with OpenSSL 
    --with-pcre Enable pcre support (default yes) 
    --with-bzip2 Enable bzip2 support for mod_compress 
    --with-fam fam/gamin for reducing number of stat() calls 
    --with-webdav-props properties in mod_webdav 
    --with-gdbm gdbm storage for mod_trigger_b4_dl 
    --with-memcache memcached storage for mod_trigger_b4_dl 
    --with-lua lua engine for mod_cml 

    Some influential environment variables: 
    ... 
    如上所述,可通过--prefix指定安装路径,默认安装在/usr/local下。可以指定启用哪些特征(插件),禁用哪些特征(插件)。假定我们要把lighttpd安装到/usr/local/lighttpd-1.4.9下面。 

    $ ./configure --prefix=/usr/local/lighttpd-1.4.9 
    $ make 
    $ make install 
    $ cp doc/lighttpd.conf /usr/local/lighttpd-1.4.9/ # 拷贝配置文件 
    $ cd /usr/local/lighttpd-1.4.9 
    $ vi lighttpd.conf # 修改配置文件 
    配置文件很直观明了,一般只要把server.document-root、server.errorlog、accesslog.filename改成你的实际目录和文件名字就可以了。 

    $ sbin/lighttpd -f lighttpd.conf # 启动lighttpd服务 
    $ ps aux   grep lighttpd 
    www 15403 0.0 0.9 2860 1148 ? S 00:15 0:00 sbin/lighttpd -f 
    这就完成了从安装到启动的整个过程,很简单吧。从最后一行的输出可以看出,lighttpd是单进程服务的,这和apache不一样(也许是它的稳定性不如apache的一个原因)。 

    (2) 整合php和fastcgi 

    以php-4.3.11为例,编译PHP的时候,不能指定 --with-apxs选项,编译命令行大致如下: 

    $ ./configure ... --enable-force-cgi-redirect --enable-fastcgi 
    $ make 
    $ sapi/cgi/php -v 
    PHP 4.3.11 (cgi-fcgi) (built: Jan 30 2006 00:12:34) 
    Copyright (c) 1997-2004 The PHP Group 
    Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies 
    make完了后,会在sapi/cli目录生成命令行下的php程序,sapi/cgi下生成fastcgi下的php程序。如果执行sapi/cgi下的php显示版本号,你会发现有 cgi-fcgi的说明,这就表明你成功了。 

    $ mkdir /usr/local/lighttpd-1.4.9/fcgi 
    $ cp sapi/cgi/php /usr/local/lighttpd-1.4.9/fcgi/ 
    $ vi /usr/local/lighttpd-1.4.9/lighttpd.conf 
    我们建立一个子目录fcgi用来保存所有的fast-cgi程序,然后把php拷贝到该目录下。编辑lighttpd.conf,如下所示: 

    ... 
    server.modules = ( 
    ... 
    "mod_fastcgi", 
    ...) 
    ... 
    fastcgi.server = (".php" => 
    ( "127.0.0.1" => 

    "socket" => "/tmp/fcgi_php.sock", 
    "bin-path" => "/usr/local/lighttpd-1.4.9/fcgi/php" 



    重新启动lighttpd就可以了。Lighttpd和fastcgi通信有两种方式:通过Unix socket通信,如以上PHP的启动;通过TCP/IP socket通信。Lighttpd支持基于fastcgi的负载均衡,不过我没尝试过。 

    关于fastcgi的协议规范,请参考http://www.fastcgi.com/,以下是我自己写的一个fastcgi的配置样例: 

    fastcgi.server = ( "/fastcgi/adsim" => 
    ( "127.0.0.1" => 

    "host" => "127.0.0.1", 
    "port" => 4000, 
    "bin-path" => "/usr/local/lighttpd-1.4.9/fcgi/adsim", 
    "check-local" => "disable" 


    check-local必须设置为disable,否则因为找不到/fastcgi/adsim会导致请求失败。 

    (3) 制作lighttpd启动脚本 

    每次启动lighttpd时我们要指定配置文件的位置,停止lighttpd时要先找到进程号,然后用kill发送停止信号,有点太麻烦了。好在lighttpd自带了一个脚本程序能辅助完成这些操作,只要稍微改改就能用了,那就是源码目录doc/rc.lighttpd和doc/rc.lighttpd.redhat,后者专用于RedHat Linux。主要的改动之处在于: 

    ... 
    if [ -z "$LIGHTTPD_CONF_PATH" ]; then 
    LIGHTTPD_CONF_PATH="/usr/local/lighttpd-1.4.9/lighttpd.conf" 
    fi 
    ... 
    lighttpd="/usr/local/lighttpd-1.4.9/usr/sbin/lighttpd" 
    ... 
    用这个脚本管理lighttpd是不是方便多了。 

    (4) Lighttpd和OpenSSL 

    Lighttpd默认不编译ssl模块,所以必须在编译的时候明确指定 --with-openssl,然后再生成自签署的服务器证书或者从CA那里获取。生成自签署证书的方法如下: 

    $ openssl req -new -x509 -keyout server.pem \ 
    -out server.pem -days 365 -nodes 
    Lighttpd要求证书和私匙保存在同一个文件里,如果是分开的,则需要合并: 

    $ cat host.key host.crt > host.pem 
    配置lighttpd.conf,大致样子如下: 

    ssl.engine = "enable" 
    ssl.pemfile = "server.pem" 
    你可以针对某个虚拟主机做这样的设置,但是由于SSL工作在TCP层,所以不能设置基于名称的虚拟主机,只能设置基于端口的。 以下是一个配置样例: 

    $SERVER["socket"] == "192.168.146.128:443" { 
    ssl.engine = "enable" 
    ssl.pemfile = "/usr/local/lighttpd/certs/server.pem" 
    server.document-root = "/home/www/wfs/www" 

    (5) 配置目录列表 

    修改 lighttpd.conf,大致如下所示: 

    server.module = { 
    ... 
    "mod_dirlisting", 
    ...} 

    dir-listing.activate = "enable" 

    (6) 配置CGI 

    修改lighttpd.conf,首先需要启动mod_cgi,然后在static-file.exclude-extensions中指定cgi文件的扩展名,最后通过cgi.assign配置指令进行关联。 

    对于带扩展名且需要特定解析程序执行的CGI,可以指定解析程序的路径,比如: 

    cgi.assign = ( ".pl" => "/usr/bin/perl", 
    ".cgi" => "/usr/bin/perl" ) 
    对于带扩展名切不需要特定解析程序就能执行的CGI,可指定解析程序为空,比如: 

    cgi.assign = (".cgi" => "") 
    对于不带扩展名的CGI程序,只能通过固定路径存取了,比如: 

    cgi.assgin = ( "/cgi-bin/mycgi" => "/usr/local/cgi/mycgi ) 

    (7) 配置虚拟主机 

    配置基于端口的虚拟主机上文有所描述,基于名称的虚拟主机也很简单。修改lighttpd.conf,启动模块mod_simple_vhost,然后指定你的虚拟主机信息,比如: 

    $HTTP["host"] == "news.example.org" { 
    server.document-root = "/var/www/servers/news2.example.org/pages/" 

    Lighttpd注重于速度,而Apache注重于稳定性和功能,怎么选择还得看具体的应用。

    展开全文
  • lighttpd Lighttpd是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress),...
  • lighttpd配置(转载)

    千次阅读 2015-11-02 22:10:55
    lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的webserver环境。具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是...
  • linux安装lighttpd及配置lighttpd .

    千次阅读 2014-06-27 10:41:43
    1.1 lighttpd源码准备及相关网站 lighttpd官方网站:http://www.lighttpd.net/,最新的稳定版本为1.4.20,开发版本为1.5.0,1.5的同以前的版本相比变大很大(相关信息可以查询该站点以及相关链接),而我这里分析的...
  • lighttpd学习笔记

    2019-09-29 17:31:48
    Lighttpd简介: Lighttpd是一个轻量级的Web 服务器,支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。它具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。其静态...
  • Web服务器 之 lighttpd 轻量级WEB服务器

    千次阅读 2019-06-17 15:16:44
    作者:tonyvicky来自:LinuxSir.Org摘要:lighttpd是一个轻量级的WEB服务器软件,支持CGI FASTCGI等本文重点介绍lighttpd的CGI和FASTCGI模块的使用; 目录一、关于测试环境二、下载相关软件三、安装和配置1、安装...
  • lighttpd使用

    千次阅读 2019-11-21 19:51:06
    之前在项目中使用的是thttpd,由于... lighttpd支持了cgi和fcgi,thttpd只支持了cgi,为了兼容的同时避免重复开发,仅在lighttpd上配置了支持cgi功能。 接下来简单了记录下自己的一些配置内容,后续有用到新功能...
  • lighttpd 各种配置详细文档

    千次阅读 2018-07-24 11:05:28
    网址:http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs 网址内容链接 Documentation Overview¶ 目录 Documentation Overview Core Features Modules Modules (1.5 only (abandoned)) ...
  • C10k问题:网络服务程序在处理的客户端连接数达到上万时,往往会出现效率低下甚至...源码下载:Lighttpd1.4.20,下载完成后src目录下的137个文件即为源文件。 源码分析工具:source insight 或 source navigator(...
  • lighttpd

    千次阅读 2009-04-27 15:24:00
    搭建lighttpd+php+mysql环境宿主机的配置:Linux pojaa101 内核:2.6.18-92.1.18.el5.028stab060.2 主机架构:i686 i686 i386 GNU/Linux php版本是:php-5.2.9mysql版本是:mysql-5.0.67lighttpd版本是:lighttpd-...
  • Lighttpd

    2009-03-31 11:23:00
    Lighttpd Lighttpd是一个新兴的、轻量级的 web 服务器,它开始越来越多的应用在一些重要场合,如:YouTobe、Sourceforge、豆瓣…… Lighttpd 以安全、快速和内存消耗低著称,还专门为大型分布式连接环境做了...
  • /etc/lighttpd/lighttpd.conf

    千次阅读 2012-06-15 16:56:06
    ####################################################################### ...## /etc/lighttpd/lighttpd.conf ## ## check /etc/lighttpd/conf.d/*.conf for the configuration of modules. ## ###########
  • lighttpd缓存配置

    2011-12-31 16:58:32
    1,首先去下载带缓存模块的lighttpd源代码包lighttpd-1.4.26.modcache.v.1.8.3-2.tar.gzwget-Shttp://lighttpd-improved.googlecode.com/files/lighttpd-1.4.26.modcache.v.1.8.3-2.tar.gz2,安装包tarzxvflighttpd-...
  • lighttpd.conf 注释

    千次阅读 2009-09-08 16:04:00
    # lighttpd configuration file## use it as a base for lighttpd 1.0.0 and above## $Id: lighttpd.conf,v 1.7 2004/11/03 22:26:05 weigon Exp $# ############ Options you really have to take car
  • lighttpd-1.4.20源码分析

    千次阅读 2009-02-15 09:59:00
    lighttpd-1.4.20源码分析 以后的更新都在这个地址 http://bbs3.chinaunix.net/thread-1369986-1-1.html网络编程讨论QQ群号:454389690...我要说的是,从这开始,我将陆续写一些有关lighttpd源码分析的资料。 对于lightt
  • lightTPD配置

    千次阅读 2009-09-03 10:13:00
    lightTPD F5F5中IP端口80指向为lightTPD的端口在lightTPD中的lightpd-inc.conf中的配置如下: # LightTPD Configuration file (INCLUDE)## Use it as a base for LightTPD 1.0.0 and above.# This version is built ...
  • 开发板上搭建lighttpd+php

    千次阅读 2015-03-19 16:18:39
    要在开发板上搭建lighttpd环境,首先要在ubuntu上搭建交叉编译环境,然后对lighttpd的源码进行编译,最后将编译好的文件和配置文件拷贝到开发板上,就可以运行了。 一、安装lighttpd 1、在ubuntu下搭建交叉...

空空如也

1 2 3 4 5 ... 20
收藏数 21,252
精华内容 8,500
关键字:

lighttpd