У меня есть два сайта, которые я запускаю с vhosts apache 2.2 с PHP-FPM 5.4 на Ubuntu 12.04. До сих пор я использовал общесерверную (стандартную) конфигурацию mod_fastcgi, но теперь я хочу разделить ее на два пула FPM, чтобы я мог использовать разные настройки PHP для каждого (например, один является сайтом разработчиков, поэтому отображение ошибок включено ).
Я настроил два пула FPM с разными именами и местоположениями сокетов, в соответствии с документами, отключил глобальную конфигурацию fastcgi, скопировал ее в свои vhosts и изменил ее, чтобы указывать на разные пулы для каждого vhost, например:
<IfModule mod_fastcgi.c>
<FilesMatch \.php$>
SetHandler php-script
</FilesMatch>
Action php-script /php5.fcgi virtual
Alias /php5.fcgi /var/fastcgi/php5.fcgi
FastCGIExternalServer /var/fastcgi/php5.fcgi -socket /var/run/php5-fpm-www.sock
<Directory "/var/fastcgi">
Order allow,deny
<Files "php5.fcgi">
Order deny,allow
Deny from all
Allow from env=REDIRECT_STATUS
</Files>
</Directory>
</IfModule>
На самом деле существует 4 виртуальных хоста, так как для каждого имени хоста существуют обычные и SSL-варианты, и каждая пара указывает на один пул FPM.
Проблема, с которой я столкнулся, заключается в том, что apache выдает сообщение об ошибке:
FastCgiExternalServer: redefinition of previously defined class "/var/fastcgi/php5.fcgi"
Как это сделать?
Хитрость в том, что вам также нужно переименовать действие и псевдоним, чтобы они не были «переопределениями», поэтому для моего пула «www» моя конфигурация vhost выглядит так:
<IfModule mod_fastcgi.c>
<FilesMatch \.php$>
SetHandler php-script
</FilesMatch>
Action php-script /php5-www.fcgi virtual
Alias /php5-www.fcgi /var/fastcgi/php5-www.fcgi
FastCGIExternalServer /var/fastcgi/php5-www.fcgi -socket /var/run/php5-fpm-www.sock
<Directory "/var/fastcgi">
Order allow,deny
<Files "php5-www.fcgi">
Order deny,allow
Deny from all
Allow from env=REDIRECT_STATUS
</Files>
</Directory>
</IfModule>
И для SSL в том же пуле:
<IfModule mod_fastcgi.c>
<FilesMatch \.php$>
SetHandler php-script
</FilesMatch>
Action php-script /php5-www-ssl.fcgi virtual
Alias /php5-www-ssl.fcgi /var/fastcgi/php5-www-ssl.fcgi
FastCGIExternalServer /var/fastcgi/php5-www-ssl.fcgi -socket /var/run/php5-fpm-www.sock
<Directory "/var/fastcgi">
Order allow,deny
<Files "php5-www-ssl.fcgi">
Order deny,allow
Deny from all
Allow from env=REDIRECT_STATUS
</Files>
</Directory>
</IfModule>
Итак, они используют разные имена, но указывают на один и тот же сокет.