Apache + mpm_worker + mod_fastcgi + php-cgi

之前大神rafan 等長輩都寫過要怎麼搞這種東西,不過我試的時候總是因為某些奇怪的原因沒有跑起來,直到昨天 ckmarkhsu 也說他做作業也跑起來了,我今天早上又試了一下終於成功了 :Q

基本上和這篇差不多,不過編 www/apache22 的時候加上 WITH_MPM=worker 讓它用 mpm_worker。然後之前如果有裝過 php 的話會需要重編過一次讓 extension 編成 Thread Safe,如果之前沒有選 CGI 的話記得要重新 make config 選起來。

接著就

  1. cd /usr/ports/www/mod_fastcgi ; make install clean
  2. mkdir /usr/local/www/fastcgi
  3. 然後寫個 script 給 fastcgi 來跑 php:
    #!/bin/sh
    PHPRC="/usr/local/etc"
    export PHPRC
    PHP_FCGI_CHILDREN=5
    export PHP_FCGI_CHILDREN
    exec /usr/local/bin/php-cgi

    存成 /usr/local/www/fastcgi/php.fcgi,記得要 chmod 755 /usr/local/www/fastcgi/php.fcgi

  4. 編輯 httpd.conf,把 mod_fastcgi 的部分 unmark 掉,然後寫個 mod_fastcgi.conf 放在 /usr/local/etc/apache22/Includes/ 底下:
    <IfModule fastcgi_module>
    ScriptAlias /fastcgi/ "/usr/local/www/fastcgi/"
    <Directory /usr/local/www/fastcgi>
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
    AddHandler fastcgi-script .fcgi
    AddHandler php-fastcgi .php
    Action php-fastcgi /fastcgi/php.fcgi
    </IfModule>

原本 php 該要 AddType 的部分還是要加,改好以後 apache restart 就可以用了。目前碰到比較麻煩的問題是有些會在 .htaccess 裡面用 php_value 設定一些東西的會不能用,這是非 php module 的先天限制。

2008-03-28 補充:
eAccelerator 會因為 Apache 跑 php-cgi 的關係不能用 (Lighttpd 可以),可以改用 www/xcache 代替。APC 也是個不錯的選擇。

4 Comments »

  1. Hao said

    請問一下,
    如何讓php extension compile成thread safe?

  2. Maverick said

    用 portupgrade -f 把 php5 和 extension 重新編過就會是 Thread Safe 的了…

  3. Hao said

    請問一下,
    portupgrade怎麼會那麼神奇?重編就可以變成Thread Safe?
    是自動加了甚麼參數嗎?
    前輩是怎麼知道這密技的?

    PS.最近一直深受”如何編出thread safe php5 and php5 extension所苦”

    Thanks in advance!

    • Maverick said

      1.照我文章說的,用 WITH_MPM=worker 重編 Apache
      2.用 portupgrade -fr 重編 lang/php5lang/php5-extensions

      編完你應該會發現 extension 的目錄原本的數字後面多了 -zts,像目前的 php5-extension 會變成在 /usr/local/lib/php/20060613-zts/ 底下。

RSS feed for comments on this post · TrackBack URI

Leave a Comment