操作
如何配置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