2015-06-10 48 views
5

好吧,試圖弄清楚這一點會有點瘋狂。 (我看過數百個問題/答案,谷歌的文章,但沒有回答吧)使用FastCGI/PHP-fpm配置指定每個虛擬主機的PHP ini文件

我剛剛從使用mod_php通過FastCGI的和FPM使用PHP,使用this question描述的方法變了,純粹是因爲我是根據印象,使用這個設置爲單個虛擬主機指定php.ini文件是「容易的」。

我把我的頭髮拉出來,是我如何指定每個虛擬主機使用的自定義PHP ini文件?

幸運的是,這只是我的試驗檯上那麼遠,但我希望做同樣的我的生產服務器上,如果我都不能算出這個

+0

據我的經驗:您可以爲每個虛擬主機配置虛擬主機配置(在我們的服務器上稱爲「vhost.conf」),儘管我們有1個php.ini用於整個服務器。 – tvgemert

回答

4

我想我可以爲孔後整個過程中,我採取了與池配置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

最後一部分是如何配置池,並獲得虛擬主機使用培訓相關池設置

這裏有雲:

(在http://www.vps.net/blog/2013/04/08/apache-mpms-prefork-worker-and-event/ prefork的/ wroker和事件的說明)安裝Apache MPM工人:

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 

在下面(我們將使用一個插座,而不是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> 

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

糊創建PHP5-FPM全局設置:確保所有的configs遵循相同的新要求'全部批准'/'要求所有被拒絕'語法...否則在重新啓動後你會感到痛苦...

啓用的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 vhost。這幾乎與上面所描述的,但要注意的「別名」,「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(); 
?> 
4

遺憾的是不能設置一個PHP。每個虛擬主機的ini文件。你可以做的是配置不同的php-fpm池,並給每個php配置值設置/覆蓋(共享)默認配置的東西。有關如何做到這一點,請參閱fpm configuration

Example config with different pools

+0

這似乎是實際的答案。不,你不能。您可以通過將它們放入fpm設置(如接受的答案描述)來解決此問題,但您根本無法指定php.ini。 – DM8