vhost 的 Php 版本,apache2

标签 php linux apache

我已经在我的服务器上安装了 5.6 和 7.0 这两个版本的 php。我可以在版本之间切换,但我想通过 vhost 设置 php 版本。默认版本是 php 5.6。下面是我的虚拟主机示例:

<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。

最佳答案

首先,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 runners - 我们不能只使用 /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 或特定的 php.ini 指定额外的环境参数(通过导出环境变量,例如 PHP_FCGI_MAX_REQUESTS)

然后是第二个站点(使用 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

最后我们为两个站点创建虚拟主机,首先是 site1:

# 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

然后是 site2

# 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。如果一切正常 - apache 应该成功重启,你可以通过浏览器检查这个主机是否有不同版本的 php 或者只是 curl curl -s -H 'Host: site1.example.com' http://localhost/测试.php

如果出现问题,您始终可以检查 systemctl status apache 的输出(以防 apache 未启动),或 /var/log/apache2/suexec.log (以防您看到 500 Internal server error),或/var/log/apache2/error.log(以防一般错误)。

希望对你有帮助

关于vhost 的 Php 版本,apache2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38699846/

相关文章:

PHP -> 函数调用中断页面

php - 从同一个表中选择不同的结果

php - Laravel:Laravel Blade 中单行的多个 if 条件

javascript - 如何在 Google Chart 中显示 PHP 数组

在 Apache 生产环境中忽略 PHP session 设置?

php - 如何正确比较 NodeJS 和 PHP 与 MySQL 的查询性能

php - 如何区分文本框

c - __func 函数的约定是什么?

linux - 带回调的 Posix 串行连接

linux - 无法将 rnx2rtkp 从 rtklib2.4.3b29 交叉编译到树莓派 pi3