Linux
單個 php-fastcgi 程序會阻止所有其他 PHP 請求
我最近切換到 PHP 的 FastCGI 設置(Apache2-worker 和
mod_fcgid
)。但是,當單個 PHP 腳本非常繁忙時,它似乎會阻止所有其他 PHP 請求。我的配置有什麼問題?我使用的主要原因
mod_fcgid
是控制 PHP 記憶體使用。使用mod_php
,所有單獨的 Apache 分支在服務 PHP 後都會在記憶體中增長。我也切換到了 apache2-worker 模型,因為所有執行緒不安全的 PHP 程式碼都存在於 Apache 之外。
我的 FastCGI 腳本如下所示:
#!/bin/sh #export PHPRC=/etc/php/fastcgi/ export PHP_FCGI_CHILDREN=5 export PHP_FCGI_MAX_REQUESTS=5000 global_root=/srv/www/vhosts.d/ exec /usr/bin/php-cgi5 \ -d open_basedir=$global_root:/tmp:/usr/share/php5:/var/lib/php5 \ -d disable_functions="exec,shell_exec,system"
我的 Apache 配置如下所示:
<IfModule fcgid_module> FcgidIPCDir /var/lib/apache2/fcgid/ FcgidProcessTableFile /var/lib/apache2/fcgid/shm FcgidMaxProcessesPerClass 1 FcgidInitialEnv RAILS_ENV production FcgidIOTimeout 600 AddHandler fcgid-script .fcgi FcgidConnectTimeout 20 MaxRequestLen 16777216 <FilesMatch "\.php$"> AddHandler fcgid-script .php Options +ExecCGI FcgidWrapper /srv/www/cgi-bin/php5-wrapper.sh .php </FilesMatch> DirectoryIndex index.php </IfModule>
問題不是 PHP,而是 mod_fcgid。雖然 PHP 產生多個孩子,
mod_fcgid
但對它一無所知,並且將為每個孩子提供一個請求。因此,當FcgidMaxProcessesPerClass 1
使用時,所有 PHP 的執行都發生在彼此之後。*連結到:http ://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/ 的解決方案解釋瞭如何使用
mod_fastcgi
沒有此限制的解決方案。它將向同一個孩子發送多個請求。$$ * $$請注意,不要
FcgidMaxProcessesPerClass 1
在 PHP、ruby 等的許多單獨實例中使用結果。雖然它們都能夠在單個程序中在內部處理許多請求。因此,一個新的 Apache 配置將 PHP 與 fastcgi 一起使用:
<IfModule mod_fastcgi.c> # Needed for for suEXEC: FastCgiWrapper On FastCgiConfig -idle-timeout 20 -maxClassProcesses 1 -initial-env RAILS_ENV=production FastCgiIpcDir /var/lib/apache2/fastcgi AddHandler php5-fcgi .php Action php5-fcgi /.fcgi-bin/php5-wrapper.sh DirectoryIndex index.php ScriptAlias /.fcgi-bin/ /srv/www/cgi-bin/ <Location "/.fcgi-bin/php5-wrapper.sh"> Order Deny,Allow Deny from All #Allow from all Allow from env=REDIRECT_STATUS Options ExecCGI SetHandler fastcgi-script </Location> # Startup PHP directly FastCgiServer /srv/www/cgi-bin/php5-wrapper.sh # Support dynamic startup AddHandler fastcgi-script fcg fcgi fpl </IfModule>