apache2底下帶有支持PHP解析的內嵌模塊libapache2-mod-php5,通常都是使用這種方式支持PHP腳本的解析,如今想把二者分開,採用fastcgi的模式運行PHP腳本,這樣還能夠解析pl、python等腳本,而不用安裝apache2自帶的內嵌模塊。 php
apt-search以後發現有兩個fastcgi模塊:一個是mod_fcgid,一個是mod_fastcgi,用哪一個?先搞清楚這兩個再說。 html
google一番發現以下: python
1 mod_fastcgi是FastCGI.com的項目,使用的是FastCGI受權條款。mod_fcgid是Apache基金會負責的項目,使用的是Apache-2.0受權條款。所以,不只主要負責單位不一樣,其受權方式也不一樣。 web
2 mod_fastcgi的受權不是標準的自由/開放源碼受權條款,因此顯得與其餘受權條款格格不入,再加上Linux distribution套件管理政策的因素,使得mod_fastcgi難以全面進入全部Distribution官方庫。網上會發現說mod_fastcgi幾乎沒有再繼續開發了,所以也使得網路上許多人轉而推薦mod_fcgid。其實這是最大的誤解。官方說法是,FastCGI protocol 是一個輕量級且成熟的通信協定,因此不太須要再額外加上新功能,而目前的工做主要在於瑕疵修復,也就幾乎沒有任何開發進展。 shell
3 雖然mod_fastcgi與mod_fcgid都支援FastCGI protocol,但設計的概念不一樣。mod_fcgid的理念是快速的結束FastCGI server並再快速的產生一個。這個方法與FastCGI protocol初衷不一樣,FastCGI protocol是但願可以容許long-running request。以PHP 應用爲例,爲了加速PHP 效能,一般會使用bytecode/opcode cache,例如APC、eAccelerator 或Xcache 等。但爲了共享cache,意謂着process/request 必須在同一個shared cache中,而沒法跨不一樣的FastCGI or FCGI process。所以在設計上,只能容許一個PHP process啓動,而後由此spawn多個children process,使得children 可以享用parent的bytecode/opcode。 apache
mod_fcgid的官方描述是: 併發
mod_fcgid is a high performance alternative to mod_cgi or mod_cgid, which starts a sufficient number instances of the CGI program to handle concurrent requests, and these programs remain running to handle further incoming requests. It is favored by the PHP developers, for example, as a preferred alternative to running mod_php in-process, delivering very similar performance.
瞭解的差很少了 就開始直接動手實驗吧,在debian6下相關模塊都已經有了,能夠直接apt安裝。 app
apt-get install apache2 libapache2-mod-fcgid php5-cgi
網上的例子大可能是配合apache2-suexec模塊一塊兒使用的,官網是這樣描述該模塊的:Allows CGI scripts to run as a specified user and Group。設置CGI程序以特定的用戶及用戶組運行,能夠經過SuexecUserGroup指令設置,該指令隻影響CGI程序,對於非CGI程序,則不遵照這個規定,仍是會以User指令指定的用戶運行的。之前習慣apache以www-data用戶運行,配置的時候沒注意這一點,致使後面運行權限出錯,因此決定不安裝該模塊。若是要使用該模塊,則web的document目錄必定要和SuexecUserGroup設置的一致。 less
修改/etc/apache2/mods-enabled/fcgid.conf文件 ide
#AddHandler fcgid-script .fcgi AddHandler fcgid-script .phpWEB配置文件以下:/etc/apache2/sites-enabled/000-default
<VirtualHost *:80> DocumentRoot /var/www/html MaxRequestsPerProcess 10000 <Directory /var/www/html> Options Indexes FollowSymLinks MultiViews +ExecCGI FCGIWrapper /var/www/php-wrapper .php AllowOverride None Order allow,deny allow from all </Directory> </VirtualHost>
PHP applications are usually configured using the FcgidWrapper directive and a corresponding wrapper script。FcgidWrapper指令在老版本的名稱爲FCGIWrapper
建立web document環境mkdir -p /var/www/html echo '<?php phpinfo(); ?>' > /var/www/html/index.php touch /var/www/php-wrapper chmod 755 /var/www/php-wrapper chown www-data.www-data /var/www/ -R
php-wrapper內容以下:
#!/bin/sh PHP_FCGI_MAX_REQUESTS=10000 export PHP_FCGI_MAX_REQUESTS PHP_FCGI_CHILDREN=0 export PHP_FCGI_CHILDREN exec /usr/lib/cgi-bin/php該設置的官方解釋以下
By default, PHP FastCGI processes exit after handling 500 requests, and they may exit after this module has already connected to the application and sent the next request. When that occurs, an error will be logged and 500 Internal Server Error will be returned to the client. This PHP behavior can be disabled by setting PHP_FCGI_MAX_REQUESTS to 0, but that can be a problem if the PHP application leaks resources. Alternatively, PHP_FCGI_MAX_REQUESTS can be set to a much higher value than the default to reduce the frequency of this problem. FcgidMaxRequestsPerProcess can be set to a value less than or equal to PHP_FCGI_MAX_REQUESTS to resolve the problem. PHP child process management (PHP_FCGI_CHILDREN) should always be disabled with mod_fcgid, which will only route one request at a time to application processes it has spawned; thus, any child processes created by PHP will not be used effectively. (Additionally, the PHP child processes may not be terminated properly.) By default, and with the environment variable setting PHP_FCGI_CHILDREN=0, PHP child process management is disabled.
解釋的很清楚了,默認的PHP fastcgi進程在處理完500個請求後就會退出,這樣會對已經鏈接併發出請求的應用形成影響,該問題能夠經過設置PHP_FCGI_MAX_REQUESTS參數解決,FcgidMaxRequestsPerProcess指令是新版中的名稱,在老版本的fcgid中該指令名爲MaxRequestsPerProcess。還有一個PHP_FCGI_CHILDREN的問題,它使得PHP建立的子進程不能很快的生效,建議直接禁止該選項。
生效配置
/etc/init.d/apache2 restart查看效果
注意注意:
4 但不管如何,PHP的使用者如今已不須要在mod_fastcgi及mod_fcgid之間做選擇,由於PHP 5.3.3以後提供的PHP-FPM (PHP FastCGI Process Manager),可以更有效率的解決這個問題。何況PHP-FPM使用的是標準BSD-2-Clause License (BSD兩款受權),是個互惠要求性低且相容性高的受權條款。 http://www.apachelounge.com/viewtopic.php?t=4385
http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html
http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidwrapper
http://hi.baidu.com/jackbillow/item/07690b3c02ae6848033edcef