项目

通用

个人资料

操作

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

由匿名用户更新于近13年前 · 3个修订