操作
如何配置Lighttpd的多个负载均衡FastCGI后端¶
上周我曾试图找到关于这个主题的合适操作指南。我没找到,所以我决定一有时间就整理一个出来。
现在开始。
FastCGI速度很快,但在高流量下仍然会占用大量CPU。如果你无法负担外部负载均衡器设备(价格或增加的复杂性可能令人望而却步)
并且你运行lighttpd,你仍然可以以相对较少的时间或金钱投入达到大致相同的效果。
FastCGI处理程序会在多个后端之间分发传入的请求。你唯一需要做的就是定义这些后端。
不幸的是,文档在这方面并没有提供太多帮助(要么是我阅读能力不够好 :))。
下面的例子有一个虚拟主机,其中定义了三个PHP FastCGI后端。
$HTTP["host"] =~ "tst" {
server.name = "tst"
server.document-root = "/var/www/"
fastcgi.server = ( ".php" =>
(
"R1" => ( "host" => "192.168.0.10",
"port" => 1029 ),
"R2" => ( "host" => "192.168.0.11",
"port" => 1029 ),
"S1" => ( "socket" => "/tmp/php-fastcgi.socket",
"bin-path" => "/usr/bin/php5-cgi",
"max-procs" => 1,
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "4",
"PHP_FCGI_MAX_REQUESTS" => "1000"))
)
)
status.statistics-url = "/server-counters"
status.status-url = "/server-status"
status.config-url = "/server-config"
}
注意:如果你碰巧为IPC方法定义了一个“host”,lighty会静默失败。
上述后端中有两个通过TCP可用,一个通过IPC。IPC的CPU开销稍低。所以如果你想要一个本地的fcgi实例,走这条路是值得的。
内容必须在所有主机上复制(实际上,只需要复制php、perl、ruby等脚本)。Web服务器仅使用动态内容文件来确定请求的URI是否为404(如果你没有本地fastcgi实例的话)。另外,请务必确保所有机器都能访问数据库。
这是一个简短的脚本,可用于在后端机器上启动FastCGI进程(丑陋、粗糙、能用)
#!/bin/bash
PHP_FCGI_CHILDREN=4
PHP_FCGI_MAX_REQUESTS=1000
FCGI_WEB_SERVER_ADDRS="127.0.0.1,192.168.0.9"
USER=www-data
GROUP=www-data
PHP=/usr/bin/php5-cgi
PORT=1029
PIDF=/var/run/fcgi.pid
export PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS
case $1 in
start)
/usr/bin/spawn-fcgi -P $PIDF -p $PORT -C $PHP_FCGI_CHILDREN -u $USER -g $GROUP -f $PHP 2>&1
;;
stop)
kill `cat $PIDF`
esac
你可以看到请求正在进入,并通过lighty在后端之间分发
fastcgi.active-requests: 5 fastcgi.backend.R1.0.connected: 655 fastcgi.backend.R1.0.died: 0 fastcgi.backend.R1.0.disabled: 0 fastcgi.backend.R1.0.load: 5 fastcgi.backend.R1.0.overloaded: 0 fastcgi.backend.R1.load: 309 fastcgi.backend.R2.0.connected: 4361 fastcgi.backend.R2.0.died: 0 fastcgi.backend.R2.0.disabled: 0 fastcgi.backend.R2.0.load: 0 fastcgi.backend.R2.0.overloaded: 0 fastcgi.backend.R2.load: 53 fastcgi.backend.S1.0.connected: 4989 fastcgi.backend.S1.0.died: 0 fastcgi.backend.S1.0.disabled: 0 fastcgi.backend.S1.0.load: 0 fastcgi.backend.S1.0.overloaded: 6 fastcgi.backend.S1.load: 48 fastcgi.requests: 10005
连接线告诉你每个后端到目前为止收到了多少请求。
就这些了。
备注- 如果你在运行lighty的机器上提供静态部分时遇到I/O瓶颈,所有这些都无济于事。
- 示例中的FastCGI参数未针对性能进行调优。
- 请求数量不均匀,因为后端R1连接线路非常慢。
- 请看这里:http://trac.lighttpd.net/trac/ticket/596