Tag Archives: lighthttpd

lighttpd + php 详细配置指导

本文系摇篮网同事,范晓涛在工作中总结的,希望能对大家有帮助

一、下载地址:
lighttpd:http://www.lighttpd.net/download
php:http://www.php.net/downloads.php
使用wget命令,下载到本地

二、安装:
解压,使用:tar -xzvf path
1.安装lighttpd
./configure –prefix=/home/lighttpd
make
make install
将doc下的lighttpd.conf文件拷贝到/home/lighttpd/etc下

2.安装php
./configure –prefix=/home/php –enable-fastcgi –enable-force-cgi-redirect –enable-zend-multibyte –with-config-file-path=/home/php/etc –enable-discard-path –with-jpeg-dir –with-png-dir –with-zlib –enable-xml –enable-mbstring –with-mysql=/home/mysql
make
make install
将php.ini文件拷贝到/home/php/etc下

三、配置
1.配置lighttpd
server.document-root = “/home/fxt/www/discuz” #程序路径

四、lighttpd模块介绍
lighttpd 主要参考页面:
http://redmine.lighttpd.net/wiki/lighttpd/Docs

“mod_rewrite”,
“mod_redirect”,
“mod_access”,
“mod_fastcgi”,
“mod_expire”,
“mod_compress”

主要介绍以上模块:

1.mod_rewrite模块:
lighttpd不支持像apache中的.htaccess文件跳转,所以将.htaccess中的内容全部写到lighttpd.conf中去。
格式:
url.rewrite = (
“^/archiver/((fid|tid)-[w-]+.html)$” => “/archiver/index.php?$1”,
“^/frameboard_([0-9]+).aspx$” => “/forumdisplay.php?fid=$1&page=1”
}

2.mod_redirect模块:
格式:
url.redirect = ( “^/a.html” => “http://beta.bbs.yaolan.com/t.html” )

3.mod_fastcgi模块:
fastcgi.debug = 1 #调试fastcgi
修改php.ini文件(a)
cgi.fix_pathinfo = 1

说明:
( <extension> =>
(
( “host” => <string> ,                    # 主机
“port” => <integer> ,                    # 端口
“socket” => <string>,                 # either socket or host+port
“bin-path” => <string>,               # php中支持fastcgi能力的bin文件
“bin-environment” => <array>,         # optional
“bin-copy-environment” => <array>,    # optional
“mode” => <string>,                   # optional
“docroot” => <string> ,               # 需要解析的路径地址
“check-local” => <string>,            # 是否检测本地”enable”/”disable”
“max-procs” => <integer>,             # optional – when omitted, default is 4
“broken-scriptfilename” => <boolean>, # optional
“disable-time” => <integer>,          # optional
“allow-x-send-file” => <boolean>,     # optional
“kill-signal” => <integer>,           # optional (v1.4.14+ though option is accepted in earlier versions)
),
( “host” => …
)
)
)
例子:
a.解析不同的文件类型
fastcgi.server = (
“.php” =>
(( “host” => “127.0.0.1”,
“port” => 1026,
“bin-path” => “/usr/local/bin/php”
)),
“.php4” =>
(( “host” => “127.0.0.1”,
“port” => 1026
))
)

b.两台机器均衡负载,解析php(两台机器上已经单独启动fastcgi服务)
fastcgi.server = ( “.php” =>
(
( “host” => “127.0.0.1”,
“port” => 2026,
“docroot” => “/home/fxt/www/discuz”,
“check-local” => “disable”
),
( “host”=>”127.0.0.1”,
“port”=>2030,
“docroot” => “/home/fxt/www/discuz”,
“check-local” => “disable”
)
)
)

4.mod_expire模块:(b)(注意,该模块需要在mod_compress模块前加载,否则在使用了mod_compress模块后,会看不到头部的expires信息)
expire.url = ( “/images/” => “access 1 hours” )
<access|modification> <number> <years|months|days|hours|minutes|seconds>
例子:将以下类型设置有效期
$HTTP[“url”] =~ “^.*(css|jpg|png|jpeg|html|js|gif)$” {
expire.url = (“” => “access 1 months”)
}

5.mod_compress模块:
例子:将以下类型文件压缩
compress.filetype = (“text/plain”, “text/html”, “text/javascript”, “text/css”, “text/xml”)

6.检验方法:
使用火狐浏览器,下载调试功能插件
下载页面结束,按F12后,查看相应类型的头信息中,是否加了Expires,Content-Encoding  gzip,这两个信息。
如果有,则表示mod_expire和mod_compress模块已经正常工作了。

五、将fastcgi拿出来单说一下:
在机器上只启动fastcgi服务,配置如下:
将代码文件/doc/spawn-php.sh拷贝到./lighttpd/bin/目录下
spawn-php.sh中部分需要修改的代码:
SPAWNFCGI=”/home/lighttpd/bin/spawn-fcgi”    #spawn-fcgi的路径(bin)
FCGIPROGRAM=”/home/php/bin/php-cgi”        #php-cgi的路径(bin)
FCGIPORT=”2026″    #监听的端口号
PHP_FCGI_CHILDREN=10
PHP_FCGI_MAX_REQUESTS=1000
FCGI_WEB_SERVER_ADDRS=”127.0.0.1,192.168.1.39″    #D
ALLOWED_ENV=”ORACLE_HOME PATH USER”
USERID=lighttpd    #(c)用户名,好像不能用root;(d)注意该用户需要有权访问程序保存路径
GROUPID=lighttpd    #用户分组

将spawn-php.sh和配套文件拷贝到不同机器上,就可以单独启动了。
在lighttpd.conf文件中的fastcgi.server中配置相应的ip、port就可以了。

以上标有(a/b/c/d)的部分,是可能会出现问题的地方,还请多注意!

Seattle Conference on Scalability: YouTube Scalability

西雅图扩展性的技术研讨会上,YouTube 的 Cuong Do 做了关于 YouTube Scalability 的报告。视频内容在 Google Video 上有(地址),

Kyle Cordes 对这个视频中的内容做了介绍。里面有不少技术性的内容。值得分享一下。(Kyle Cordes 的介绍是本文的主要来源)

简单的说 YouTube 的数据流量, “一天的YouTube流量相当于发送750亿封电子邮件.”, 2006 年中就有消息说每日 PV 超过 1 亿,现在? 更夸张了,”每天有10亿次下载以及6,5000次上传”, 真假姑且不论, 的确是超乎寻常的海量. 国内的互联网应用,但从数据量来看,怕是只有 51.com 有这个规模. 但技术上和 YouTube 就没法子比了.

Web 服务器

YouTube 出于开发速度的考虑,大部分代码都是 Python 开发的。Web 服务器有部分是 Apache, 用 FastCGI 模式。对于视频内容则用 Lighttpd 。据我所知,MySpace 也有部分服务器用 Lighttpd ,但量不大。YouTube 是 Lighttpd 最成功的案例。(国内用 Lighttpd 站点不多,豆瓣用的比较舒服。by Fenng)

视频

视频的缩略图(Thumbnails)给服务器带来了很大的挑战。每个视频平均有4个缩略图,而每个 Web 页面上更是有多个,每秒钟因为这个带来的磁盘 IO 请求太大。YouTube 技术人员启用了单独的服务器群组来承担这个压力,并且针对 Cache 和 OS 做了部分优化。另一方面,缩略图请求的压力导致 Lighttpd 性能下降。通过 Hack Lighttpd 增加更多的 worker 线程很大程度解决了问题。而最新的解决方案是起用了 Google 的 BigTable, 这下子从性能、容错、缓存上都有更好表现。看人家这收购的,好钢用在了刀刃上。

出于冗余的考虑,每个视频文件放在一组迷你 Cluster 上,所谓 “迷你 Cluster” 就是一组具有相同内容的服务器。最火的视频放在 CDN 上,这样自己的服务器只需要承担一些”漏网”的随即访问即可。YouTube 使用简单、廉价、通用的硬件,这一点和 Google 风格倒是一致。至于维护手段,也都是常见的工具,如 rsync, SSH 等,只不过人家更手熟罢了。

数据库

YouTube 用 MySQL 存储元数据–用户信息、视频信息什么的。数据库服务器曾经一度遇到 SWAP 颠簸的问题,解决办法是删掉了 SWAP 分区! 管用。

最初的 DB 只有 10 块硬盘,RAID 10 ,后来追加了一组 RAID 1。够省的。这一波 Web 2.0 公司很少有用 Oracle 的(我知道的只有 Bebo,参见这里). 在扩展性方面,路线也是和其他站点类似,复制,分散 IO。最终的解决之道是”分区”,这个不是数据库层面的表分区,而是业务层面的分区(在用户名字或者 ID 上做文章,应用程序控制查找机制)

YouTube 也用 Memcached.