FreeBSD下以CGI模式运行PHP

一般情况下,很多人会选择把PHP以Apache的模块来运行。这样会导致静动态都由Apache的线程处理,并且PHP无法使用到Cache。Apache下跑PHP,应该是以CGI方式运行性能会更好。下面简单地记录,我使用FreeBSD安装以及配置以CGI模式运行PHP的经过。

1、安装Apache以Worker方式运行

  1. cd /usr/ports/www/apache22
  2. make WITH_MPM=worker install clean

2、安装PHP5

  1. cd /usr/ports/ports-mgmt/portmaster
  2. make install clean
  3. rehash
  4. portmaster /usr/ports/lang/php5 /usr/ports/lang/php5-extensions/

3、安装mod_fastcgi

  1. portmaster /usr/ports/www/mod_fastcgi

4、配置Worker

  1. vi /usr/local/etc/apache22/httpd.conf
  2. #把下面这行unmas 掉
  3. LoadModule fastcgi_module     libexec/apache22/mod_fastcgi.so
  4. #把下面这行 unmask掉
  5. Include etc/apache22/extra/httpd-mpm.conf
  6. #在文件最后加入fastcgi文件的调用
  7. Include etc/apache22/extra/fastcgi.conf
  8.  
  9.  
  10. vi /usr/local/etc/apache22/extra/httpd-mpm.conf
  11. #将Worker那段修改为以下内容,一般2G内存的机器建议在800以内。设多与少需要看应用程序的复杂程序,而不是随便设一个数就好。
  12.     ThreadLimit 512
  13.     StartServers 1
  14.     MaxClients 512
  15.     MinSpareThreads 1
  16.     MaxSpareThreads 512
  17.     ThreadsPerChild 512
  18.     MaxRequestsPerChild 0

新建一个文件vi /usr/local/etc/apache22/extra/fastcgi.conf保存Fastcgi的配置

  1. FastCgiConfig -maxClassProcesses 1
  2. ScriptAlias /php-cgi/ "/usr/local/www/fcgi-bin/"
  3. <Directory /usr/local/www/fcgi-bin/>
  4.     SetHandler fastcgi-script
  5.     AllowOverride All
  6.     Order allow,deny
  7.     Allow from all
  8. </Directory>
  9. AddHandler  php-fastcgi .php
  10. Action php-fastcgi /php-cgi/php
  11. AddType application/x-httpd-php .php

这里设置只能跑一个 fastcgi 配合前面的 MPM worker,这样确保所有的 apache 只能通过这个 fastcgi socket 跑 php。

  1. mkdir /usr/local/www/fcgi-bin/
  2. vi /usr/local/www/fcgi-bin/php
  3. #!/bin/sh
  4. PHPRC="/usr/local/etc"
  5. export PHPRC
  6. PHP_FCGI_CHILDREN=128
  7. export PHP_FCGI_CHILDREN
  8. 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 会共用。

RSS feed for comments on this post · TrackBack URL

发表评论

You must be logged in to post a comment.