FreeBSD下以CGI模式运行PHP
一般情况下,很多人会选择把PHP以Apache的模块来运行。这样会导致静动态都由Apache的线程处理,并且PHP无法使用到Cache。Apache下跑PHP,应该是以CGI方式运行性能会更好。下面简单地记录,我使用FreeBSD安装以及配置以CGI模式运行PHP的经过。
1、安装Apache以Worker方式运行
- cd /usr/ports/www/apache22
- make WITH_MPM=worker install clean
2、安装PHP5
- cd /usr/ports/ports-mgmt/portmaster
- make install clean
- rehash
- portmaster /usr/ports/lang/php5 /usr/ports/lang/php5-extensions/
3、安装mod_fastcgi
- portmaster /usr/ports/www/mod_fastcgi
4、配置Worker
- vi /usr/local/etc/apache22/httpd.conf
- #把下面这行unmas 掉
- LoadModule fastcgi_module libexec/apache22/mod_fastcgi.so
- #把下面这行 unmask掉
- Include etc/apache22/extra/httpd-mpm.conf
- #在文件最后加入fastcgi文件的调用
- Include etc/apache22/extra/fastcgi.conf
- vi /usr/local/etc/apache22/extra/httpd-mpm.conf
- #将Worker那段修改为以下内容,一般2G内存的机器建议在800以内。设多与少需要看应用程序的复杂程序,而不是随便设一个数就好。
- ThreadLimit 512
- StartServers 1
- MaxClients 512
- MinSpareThreads 1
- MaxSpareThreads 512
- ThreadsPerChild 512
- MaxRequestsPerChild 0
新建一个文件vi /usr/local/etc/apache22/extra/fastcgi.conf保存Fastcgi的配置
- FastCgiConfig -maxClassProcesses 1
- ScriptAlias /php-cgi/ "/usr/local/www/fcgi-bin/"
- <Directory /usr/local/www/fcgi-bin/>
- SetHandler fastcgi-script
- AllowOverride All
- Order allow,deny
- Allow from all
- </Directory>
- AddHandler php-fastcgi .php
- Action php-fastcgi /php-cgi/php
- AddType application/x-httpd-php .php
这里设置只能跑一个 fastcgi 配合前面的 MPM worker,这样确保所有的 apache 只能通过这个 fastcgi socket 跑 php。
- mkdir /usr/local/www/fcgi-bin/
- vi /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
最后将/usr/local/www/fcgi-bin/php设置为执行文件。
经过这个的设置之后PHP就是通过CGI模式通行了。PHP的进一步优化是安装apc 、 xcache 、eaccelerator这类的加速器,具体哪个加速器效果更好,各有各的说法,主要还是看程序的应用吧。
补充一点:
这样的架构下,httpd会产生 512 threads 处理相关连接,并产生一个 fastcgi 的 socket 处理 PHP 程序, 这个 socket 会由 128 个 php-cgi 进程来处理,并且 这 128 个进程的 cache 会共用。