好吧,试图弄清楚这一点有点疯狂。(我已经阅读了数百个问题/答案和谷歌文章,但没有一个回答过)
我刚刚从使用mod_php
更改为通过 FastCGI 和 fpm 使用 PHP,使用这个问题中描述的方法,纯粹是因为我的印象是使用这种设置为单个虚拟主机指定 php.ini 文件是"容易的"。
我正在拔头发的是,如何指定每个虚拟主机使用的自定义 PHP ini 文件?
幸运的是,到目前为止,它只在我的测试台上......但是如果我能弄清楚这一点,我希望在我的生产服务器上做同样的事情
我也可以发布我用池配置 fpm 的整个过程,正如@ChristianM提到的,因为我还没有找到关于如何做到这一点的完整解释。
第一部分主要是AskUbuntu帖子的副本:https://askubuntu.com/questions/378734/how-to-configure-apache-to-run-php-as-fastcgi-on-ubuntu-12-04-via-terminal/527227#comment905702_527227
最后一部分是如何配置池,并让虚拟主机使用相关池设置
事情是这样的:
安装 apache mpm worker (预分叉/wroker 和 http://www.vps.net/blog/2013/04/08/apache-mpms-prefork-worker-and-event/事件的说明):
sudo apt-get install apache2-mpm-worker
安装 fastcgi 和 php5-fpm:
sudo apt-get install libapache2-mod-fastcgi php5-fpm
现在启用您需要的模组,并禁用您不需要的模组:
sudo a2dismod php5 mpm_prefork
sudo a2enmod actions fastcgi alias mpm_worker
创建 php5.fcgi 文件并授予 Web 服务器使用它的权限。
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 文件。
如果您有多个虚拟主机,需要不同的 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 = /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 虚拟主机。它与上面描述的几乎相同,但请注意"别名","FastCgiServer"和"套接字"的变化
<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();
?>
无法为每个虚拟主机设置 php.ini 文件。您可以做的是配置不同的 php-fpm 池,并为每个池提供一组 php 配置值,这些值设置/覆盖(共享)默认配置中的某些内容。有关如何执行此操作,请参阅 fpm 配置。
具有不同池的示例配置