apache22 (worker) + mod_fastcgi + php5-fcgi

這篇會講怎麼在 FreeBSD 上建立標題所說的環境。

Apache 2.2 的部份,透過 ports 編譯時加上 WITH_MPM=worker 即可:

# cd /usr/ports/www/apache22
# make WITH_MPM=worker install clean

裝好後將 /usr/local/etc/apache22/httpd.confhttpd-mpm.conf 前面的 # 拿掉,並修改 /usr/local/etc/apache22/extra/httpd-mpm.conf 內 mpm_worker_module 那段:

ThreadLimit 512
StartServers 1
MaxClients 512
MinSpareThreads 1
MaxSpareThreads 512
ThreadsPerChild 512
MaxRequestsPerChild 0

這些數字的設計是故意只跑起一隻 httpd,負責所有的連線。

再來是裝 mod_fastcgi

# cd /usr/ports/www/mod_fastcgi
# make install clean

/usr/local/etc/apache22/httpd.conf 裡把 fastcgi_module 的註解拿掉後,把設定檔放到 /usr/local/etc/apache22/Includes/fastcgi.conf 裡:

#
FastCgiConfig -maxClassProcesses 1
ScriptAlias /fcgi-bin/ "/usr/local/www/fcgi-bin/"
<Directory /usr/local/www/fcgi-bin/>
    SetHandler fastcgi-script
</Directory>
#
AddHandler php-fastcgi .php
Action php-fastcgi /fcgi-bin/php

這邊數字的設計是故意讓一隻 httpd 只能生出一隻 fastcgi,再加上前面限制只有一隻 httpd,可以確保整個 apache 只會透過這個 fastcgi socket 跑 php。

接著建立 /usr/local/www/fcgi-bin 這個目錄,並把 php 放進去:

#!/bin/sh
PHPRC="/usr/local/etc"
export PHPRC
PHP_FCGI_CHILDREN=128
export PHP_FCGI_CHILDREN
exec /usr/local/bin/php-cgi

然後把有支援 FastCGIPHPAPC 裝好 (www/pecl-APC) 就可以了。

這個架構下,httpd 會產生 512 threads 處理連線,並產生一個 fastcgi 的 socket 處理 PHP 程式,這個 socket 會由 128 隻 php-cgi 聽,且這 128 隻的 cache 會共用。

APC cache 預設是 30MB,在 Layeredtech 這台 (也就是 blog.gslin.org 這台) 上面開到 256MB (大約用掉 200MB),不過這是因為上面太多客人了,預設的 30MB 對於一般網站應該是不會滿。在安裝完 APC 後可以拿 /usr/local/share/doc/APC/apc.php 看目前 APC 的使用量。

PHP opcode cache 很重要,很久前 zonble 的「雜誌專訪產生器」造成機器速度很慢的原因,就是因為 APC 的空間滿了,常常需要重新編譯 PHP code。

這樣的設定大約會消耗 1.5GB ~ 2.5GB 的記憶體空間 (大小會依照你的 PHP 有多少模組而定),如果網站沒那麼大,可以把數字調低。

15 thoughts on “apache22 (worker) + mod_fastcgi + php5-fcgi”

  1. /usr/local/etc/Includes/fastcgi.conf

    是不是少了個apache22
    /usr/local/etc/apache22/Includes/fastcgi.conf

  2. PHP fastcgi 簡潔一點的設定法:

    AddType application/x-httpd-php .php

    ScriptAlias /php-fcgi "/usr/local/bin/php-cgi"

    FastCgiServer "/usr/local/bin/php-cgi" -initial-env PHP_FCGI_CHILDREN=128

    Options ExecCGI FollowSymLinks
    SetHandler fastcgi-script
    Order allow,deny
    Allow from all

    Action application/x-httpd-php /php-fcgi

  3. 請教一下, 這樣做跟純mpm worker跑mod_php的差別在?會比較有效率或是穩定性上的考量?

Leave a Reply

Your email address will not be published. Required fields are marked *