2016-08-01 72 views
1

我已經安裝了兩個版本的PHP在我的服務器,5.6和7.0。我可以在版本之間切換,但我想通過vhost設置php版本。默認版本是PHP 5.6。下面是比如我的虛擬主機:由vhost,apache2的PHP版本

<VirtualHost *:80> 
    ServerName example.com 
    DocumentRoot "/var/www 
    PHPINIDir /etc/php/7.0/cli/ 
    <Directory "var/www"> 
     AllowOverride all 
     DirectoryIndex index.php 
    </Directory> 
</VirtualHost>. 

phpinfo()仍顯示5.6版本,但加載的配置文件是從PHP 7.0。我使用Debian 8.

+0

我懷疑這是可能的,你應該使用像碼頭工人的解決方案,看到這個鏈接,例如:http://stackoverflow.com/questions/32195108/docker-run-apache-on-主機和容器爲不同的網站 – AntoineB

+0

謝謝,但我的意思是設置在虛擬主機和同步工作php5&php7。可能嗎? –

+0

你想在一臺虛擬主機上切換php版本,或者有幾個不同的php版本的虛擬主機?你想用什麼PHP引擎 - mod_php,php-fpm或php-cgi/fastcgi? –

回答

0

首先,沒有辦法在apache中啓用兩個不同的mod_php,所以我描述了通過mod_fcgid和SUexec配置php-fastcgi的方法。另外我假設你從dotteb安裝php7.0。

首先,你需要需要安裝所需的軟件包:

# apt-get install libapache2-mod-fcgid php5-cgi php7.0-cgi apache2-suexec 

然後我們需要使所需的Apache模塊和禁用不必要的:

# a2enmod suexec 
# a2dismod php5 
# a2dismod php7.0 

之後,創建一個用戶和虛擬主機目錄:

# useradd site1 -s /sbin/nologin -d /var/www/html/site1 -m 
# useradd site2 -s /sbin/nologin -d /var/www/html/site2 -m 

將從這些用戶執行PHP腳本。因此,建議您使用此用戶和組擁有所有網站數據。

然後我們創建一個PHP亞軍 - 我們不能僅僅用/usr/bin/php5-cgi,suEXEC的將它禁止由於安全方面的原因:腳本運動員應該所在的SuExec文檔根目錄裏面,它可以通過線AP_DOC_ROOT運行suexec -V顯示

# /usr/lib/apache2/suexec -V 
-D AP_DOC_ROOT="/var/www" 
-D AP_GID_MIN=100 
-D AP_HTTPD_USER="www-data" 
-D AP_LOG_EXEC="/var/log/apache2/suexec.log" 
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" 
-D AP_UID_MIN=100 
-D AP_USERDIR_SUFFIX="public_html" 

此外的SuExec將檢查腳本運行的許可,所以我們把這個亞軍爲子目錄的cgi-bin(你可以將此名稱更改爲其他,它只是約定)網站的所有者主目錄:

# mkdir -p /var/www/html/site1/cgi-bin /var/www/html/site2/cgi-bin 

,然後創建轉輪第一個站點(在PHP5):

# cat <<-EOF >/var/www/html/site1/cgi-bin/php 
#!/bin/sh 
exec /usr/lib/cgi-bin/php5 
EOF 

你也可以指定其他環境參數(通過導出環境變量,如PHP_FCGI_MAX_REQUESTS)爲PHP或特定的PHP。INI

再來說第二個網站(含PHP7):

# cat <<-EOF >/var/www/html/site2/cgi-bin/php 
#!/bin/sh 
exec /usr/lib/cgi-bin/php7.0 
EOF 

集可執行旗腳本參賽者:

# chmod 755 /var/www/html/site2/cgi-bin/php /var/www/html/site1/cgi-bin/php 

文檔根目錄和測試腳本:

# mkdir -p /var/www/html/site1/data /var/www/html/site2/data 
# echo -e "<?php\nphpinfo();" > /var/www/html/site1/data/test.php 
# echo -e "<?php\nphpinfo();" > /var/www/html/site2/data/test.php 

套裝網站文件的所有權:

# chown -R site1:site1 /var/www/html/site1 
# chown -R site2:site2 /var/www/html/site2 

最後,我們創建虛擬主機爲這兩個網站,首先爲現場1:

# cat <<EOF > /etc/apache2/sites-available/site1.conf 
<VirtualHost *:80> 
    ServerName site1.example.com 
    DocumentRoot "/var/www/html/site1.data" 
    <IfModule mod_fcgid.c> 
     SuexecUserGroup site1 site1 
     <Directory /var/www/html/site1/data> 
       Options +ExecCGI 
       AllowOverride All 
       AddHandler fcgid-script .php 
       FCGIWrapper /var/www/html/site1/cgi-bin/php .php 
       Order allow,deny 
       Allow from all 
     </Directory> 
    </IfModule> 
</VirtualHost> 
EOF 

,然後站點2

# cat <<EOF > /etc/apache2/sites-available/site2.conf 
<VirtualHost *:80> 
    ServerName site2.example.com 
    DocumentRoot "/var/www/html/site2/data" 
    <IfModule mod_fcgid.c> 
     SuexecUserGroup site2 site2 
     <Directory /var/www/html/site2/data> 
       Options +ExecCGI 
       AllowOverride All 
       AddHandler fcgid-script .php 
       FCGIWrapper /var/www/html/site2/cgi-bin/php .php 
       Order allow,deny 
       Allow from all 
     </Directory> 
    </IfModule> 
</VirtualHost> 
EOF 

然後就能夠通過a2ensite site1a2ensite site2點,最後重新啓動Apache: systemctl restart apache2。如果一切正常 - 阿帕奇應成功啓動,您可以檢查這臺主機通過瀏覽器都有不同版本的PHP或者只是捲曲curl -s -H 'Host: site1.example.com' http://localhost/test.php

如果出亂子,你總是可以檢查systemctl status apache(輸出的情況下,如果Apache不啓動)或/var/log/apache2/suexec.log(如果您看到500內部服務器錯誤)或/var/log/apache2/error.log(如果出現通用錯誤)。

希望這將有助於

+0

謝謝你的豐富描述。我配置了所有的,但suexec.log說(8)執行格式錯誤:exec失敗(php)。我檢查文件,但似乎都是正確的 –