使用FastCGI / PHP-fpm配置为每个vhost指定PHP ini文件

时间:2015-06-10 17:04:27

标签: php apache

好吧,试着想出这个问题会有点疯狂。 (我已经阅读了数百个问题/答案,谷歌文章,但没有人回答)

我刚刚使用mod_php改为使用PHP通过FastCGI和fpm,使用this question中描述的方法,纯粹是因为我觉得'很容易'指定php.ini使用此设置的各个虚拟主机的文件。

我的头发是什么,我如何指定每个vhost使用的自定义PHP ini文件?

幸运的是,到目前为止,它只在我的测试台上...但我希望在我的生产服务器上做同样的事情,如果我能弄清楚这一点

2 个答案:

答案 0 :(得分:5)

我认为我可能会像@ChristianM所提到的那样发布我用池配置fpm的整个过程,因为我还没有找到关于如何做到这一点的完整解释。

这部分的第一部分主要是AskUbuntu帖子的副本: https://askubuntu.com/questions/378734/how-to-configure-apache-to-run-php-as-fastcgi-on-ubuntu-12-04-via-terminal/527227#comment905702_527227

最后一部分是如何配置池,并让vhost使用相关池设置

这就是:

安装apache mpm worker(http://www.vps.net/blog/2013/04/08/apache-mpms-prefork-worker-and-event/处的prefork / wroker和事件说明):

sudo apt-get install apache2-mpm-worker

安装fastcgi和php5-fpm:

sudo apt-get install libapache2-mod-fastcgi php5-fpm

现在启用您需要的mod,并禁用不需要的mod:

sudo a2dismod php5 mpm_prefork
sudo a2enmod actions fastcgi alias mpm_worker

创建php5.fcgi文件并授予webserver使用权限。

sudo touch /usr/lib/cgi-bin/php5.fcgi
sudo chown -R www-data:www-data /usr/lib/cgi-bin

为php5-fpm创建全局配置

sudo nano /etc/apache2/conf-available/php5-fpm.conf

粘贴在下面(我们将使用套接字而不是IP地址)

<IfModule mod_fastcgi.c> 
  AddHandler php5.fcgi .php 
  Action php5.fcgi /php5.fcgi 
  Alias /php5.fcgi /usr/lib/cgi-bin/php5.fcgi 
  FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization -idle-timeout 3600 
  <Directory /usr/lib/cgi-bin>
    Require all granted
  </Directory> 
</IfModule>

注意:确保所有配置都遵循相同的新“要求全部授予”/“要求全部拒绝”语法...否则您将在重新启动后感到痛苦......

启用php5-fpm conf

sudo a2enconf php5-fpm

重启apache和fpm

sudo service apache2 restart && sudo service php5-fpm restart

这个设置本质上为php创建了一个全局fastcgi配置,它使用文件/etc/php5/fpm/php.ini文件。

如果您有多个vhost,那将需要不同的php配置,请继续下面的示例

首先,在/etc/php5/fpm/pool.d目录中,您将找到默认的www.conf文件。复制它,将其命名为相关内容:

sudo cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/domain2.conf

编辑此文件,更改池名称:

[...]

[domain2]

[...]

将listen套接字的名称更改为相关内容:

[...]

listen = /var/run/php5-fpm-domain2.sock

[...]

然后复制/usr/lib/cgi-bin/php5.fcgi文件,再次将其命名为相关内容:

cp /usr/lib/cgi-bin/php5.fcgi /usr/lib/cgi-bin/php5-domain2.fcgi

现在您已准备好将mod_fastcgi模块添加到domain2 vhost。它几乎与上面描述的相同,但注意'Alias','FastCgiServer'和'-socket'的变化

<VirtualHost *:80>
   ServerName domain2.com

   [...]

   <IfModule mod_fastcgi.c>
     AddHandler php5.fcgi .php
     Action php5.fcgi /php5.fcgi
     Alias /php5.fcgi /usr/lib/cgi-bin/php5-domain2.fcgi
     FastCgiExternalServer /usr/lib/cgi-bin/php5-domain2.fcgi -socket /var/run/php5-fpm-domain2.sock -pass-header Authorization -idle-timeout 3600
    <Directory /usr/lib/cgi-bin>
      Require all granted
    </Directory>
  </IfModule>

  [...]

</VirtualHost>

重启apache和fpm

sudo service apache2 restart && sudo service php5-fpm restart

现在测试更改。

在新的/etc/php5/fpm/pool.d/domain2.conf文件中,添加一个php值更改(我选择了session.name值):

[...]

php_admin_value[session.name] = 'DOMAIN2'

[...]

现在在重新启动fpm之前测试配置:

sudo php5-fpm -t

它会告诉您配置是否失败,但更重要的是会告诉您配置是否正常。然后你可以继续并重新启动fpm:

sudo service php5-fpm restart

最后,如果你想确定已经设置了php值,请在你的网站中创建info.php,然后添加:

<?php
  phpinfo();
?>

答案 1 :(得分:4)

不幸的是,每个vhost都无法设置php.ini文件。你可以做的是配置不同的php-fpm池,并给每个php配置值设置/覆盖(共享)默认配置中的东西。有关如何执行此操作,请参阅fpm configuration

Example config with different pools