10月 272009
 

我用的是windows的lighttpd。
lighttpd的ssl配置并不复杂,主要的也就如下几句话:
$SERVER["socket"] == "127.0.0.1:443" {
    ssl.engine                 = "enable"
    ssl.pemfile                = "d:/server.pem"
    setenv.add-environment = (
                "HTTPS" => "on"
        )

}
但是由于自己弄的pem证书有问题,结果总是无法正常启动,可恨的是错误日志中没有任何信息;后来发现有一个-D的参数,可以输出错误信息,才发现证书有问题,证书弄好之后,还发现错误日志写相对路径有问题,该成绝对路径就好了。

最后就是使用windows上提供的启动和停止服务的方式不好使,配置ssl后,启动服务后总是无法访问,最后只得自己用命令启动了,写了一个bat文件放到了启动目录:

START /B lighttpd.exe -f conf\lighttpd-inc.conf -m lib

 Posted by at 上午 9:37
4月 272008
 
作者:老王

Lighttpd和PHP的搭配现在越来越常见了。但是老实说,如非必要,我还是推荐你使用Apache和PHP的搭配方式,毕竟LAMP构架的成熟度和稳定度都是经过时间考验的。

那么什么时候Lighttpd和PHP的搭配更值得选择呢?可以从以下几点考虑:如果访问量比较大,硬件资源吃紧,那么Lighttpd适合你;如果和稳定相比,你倾向速度多一些,那么Lighttpd适合你。

题外话:NginX大有赶超Lighttpd的态势。

Lighttpd的安装,本文就不多说了,大家自己搜索一下就能找到大把大把的教程。这里我们着重讨论一下Lighttpd的配置。

安装好Lighttpd+PHP后,你的配置很可能是类似下面的代码:

fastcgi.server = ( ".php" =>
    (( "socket" => "/tmp/php-fastcgi.socket",
        "bin-path" => "/usr/bin/php-cgi",
        "max-procs" => 10,
        "bin-environment" => (
            "PHP_FCGI_CHILDREN" => "16",
            "PHP_FCGI_MAX_REQUESTS" => "1000"
        ),
        "broken-scriptfilename" => "enable"
    ))
)

其中,PHP_FCGI_MAX_REQUESTS的作用是在一个子进程工作一定次数后就干掉它,以免可能出现的问题连累系统,主进程会再创建一个相应的子进程来替补,保证子进程数一直是PHP_FCGI_CHILDREN个。

另外还有两个设置选项至关重要,分别是max-procs和PHP_FCGI_CHILDREN。如上所示的配置,系统将创建170个PHP-cgi的进程,它的计算公式如下:

num-procs = max-procs * ( 1 + PHP_FCGI_CHILDREN )

如果一个php-cgi进程占用十几兆内存的话,那么总计大约就要占用2G左右的内存。

我们先来看看max-procs的意思:从字面意思看,它似乎指得是最大进程数。实际它指的是Lighttpd一开始spawn多少个进程。

至于PHP_FCGI_CHILDREN的意思,和字面意思相同,指的就是每个主进程里产生多少个PHPFCGI子进程。

如果你的Lighttpd已经启动,你可以尝试执行一下命令:ps aux | grep php-cgi,将会看到大量的php-cgi进程:

nobody 10939 0.0 0.1 15556 4820 ? Ss 16:24 0:00 /usr/local/bin/php-cgi
nobody 11380 0.0 0.1 15452 5588 ? S 16:24 0:00 /usr/local/bin/php-cgi

仔细观察,你会发现这些php-cgi的状态不尽相同,有的是Ss,有的是S,通过man ps你能找到这些状态的含义:

S Interruptible sleep (waiting for an event to complete)
s is a session leader

也就是说,Ss状态的进程都是主进程(max-procs代表的那些进程),而S状态的进程都是子进程(PHP_FCGI_CHILDREN代表的那些进程)。如果不相信,你可以使用命令核实一下数量:

ps aux | grep php-cgi | grep Ss | grep -v grep | wc -l

确认了这些,我们再仔细看ps aux | grep php-cgi的结果,你还会发现主进程的内存占用(4840)和子进程的内存占用(5588)是不同的。这是因为主进程不处理实际的PHP请求,它唯一的工作就是看管好自己手下的子进程。而实际的PHP请求都是由子进程来完成的,所以子进程占用的内存要稍大一些。

如此,我们对max-procs和PHP_FCGI_CHILDREN的含义应该理解了吧,别急,还有一个问题:既然php-cgi的总进程数可以由上面的公式算出来,那么以下几个配置选项哪个好?

"max-procs" => 1,
"PHP_FCGI_CHILDREN" => "169",

"max-procs" => 2,
"PHP_FCGI_CHILDREN" => "84",

"max-procs" => 10,
"PHP_FCGI_CHILDREN" => "16",

以上三种配置产生的总进程数一样(都是170),我们如何判断配置的好坏呢?

如果使用了eAccelerator之类的PHP优化器,那么eAccelerator会为每一个主进程创建一个独立的缓存空间,这个时候如果你的max-procs是2的话,就会建立两个独立的缓存空间。一方面这浪费了一些内存,另一方面如果你的一个主进程挂了(它下面的子进程就失控了),至少你还有一个主进程可以保持正常运转。

总体来说,max-procs不宜为较小,否则没有容错性,在有PHP优化器的时候也不宜过大,否则会浪费很多内存做缓存空间,即便没有装PHP优化器,max-procs也不宜过大,因为主进程是不处理PHP请求的,过多的主进程自然就是一种浪费。确定了max-procs的值,剩下PHP_FCGI_CHILDREN的值就好说了。

另外:通过命令netstat -anp | grep php-cgi | wc -l可以得知当前有多少php-cgi处于连接状态,如果接近php-cgi的总进程数,就说明应该加大进程数了。

 Posted by at 上午 5:00
4月 272008
 

受影响系统:
LightTPD LightTPD 1.4.x
LightTPD LightTPD 1.3.x

不受影响系统:
LightTPD LightTPD 1.4.14

描述:
Lighttpd是一款轻型的开放源码Web Server软件包。

Lighttpd如果在解析/r/n/r/n期间连接中断的话,服务器就会陷入死循环,使用100%的CPU时间。攻击者可以反复利用这个漏洞,直至到达服务器的并行连接极限或到达文件描述符限制。

Lighttpd为mtime缓存所生成的字符串,缓存密钥默认值为0。这时字符串的指针仍为空,如果请求了mtime为0的文件就会试图访问空指针导致崩溃。利用这个漏洞要求恶意用户能够上传文件或操控文件的mtime。

厂商补丁:
LightTPD
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.lighttpd.net/assets/2007/4/13/lighttpd-1.4.x_crlf_parsing_dos.patch
http://www.lighttpd.net/assets/2007/4/13/lighttpd-1.4.x_zero_mtime_crash.patch

本篇文章来源于 黑客手册
原文链接:http://www.nohack.cn/bugs/other/20070419/42971.html

 Posted by at 上午 4:53
4月 272008
 

了解了web服务器的基本架构之后,再配置web服务器都是很类似的了;

1. 配置基于名称的虚拟主机
看个实例吧:

$HTTP["host"] == "blog.cn" {
server.name = "blog.cn"
server.document-root = "d:/www/MyBlog"
}

可以简单到这等地步的,里面没有配置的选项将都和外面的一样

2. 配置redirect和rewrite

注意一定要打开对应的这两个模块:

"mod_redirect",
"mod_rewrite",

看个简单例子:
如果我在跟目录输入/st 就像重定向到:http://phpor.net/server-status ,可以这么写:
url.redirect = ( "^/st$" => "http://phpor.net/server-status" )

如果我在跟目录输入/s 就像rewrite到:/server-status ,可以这么写:
url.rewrite = ( "^/s$" => "/server-status" )

看起来这两种写法很相似,不过一定要注意:
redirect是客户端重定向,可以重定向到另外一个网站,浏览器需要再发一个请求,所以redirect时目的地址可以是完整的uri

rewrite是服务器端重定向,不能重定向到另外一个网站,浏览器不用重新发出请求,所以rewrite 时不能目的地址中含有域名

当然还有更多的使用正则来redirect和rewrite的用法,自己看看手册吧!

3. 绑定服务到指定ip和指定端口

因为一个机器可能有多块网卡,就算只有一块网卡,还有一个环回地址呢,所以只对指定的网卡提供服务就需要这种配置了,目前我用web仅仅是本机管理自己的资源用,很多信息是秘密的,不能公开的,但是我又不想每次打开管理系统就需要输入密码,所以我就把web绑定到127.0.0.1,不允许对外提供服务,这样就确保绝对安全了,这样来写:

server.bind = "127.0.0.1"
server.port = 81
# 绑定到指定端口

相关文章:http://lighttpd.banma.com/bbs/b_17.html

 Posted by at 上午 4:25