如何在Debian上的Apache 2.4中为每个虚拟主机选择PHP版本5和7?

Z0q*_*Z0q 21 php apache debian virtualhost php-7

是否可以在Debian 9上的Apache 2.4中同时运行PHP 7和PHP 5?我希望能够选择我希望每个虚拟主机使用的PHP版本.我相信考虑到我的一些网站仍然使用弃用的PHP功能,这将是有用的.这允许我对每个站点执行升级.我如何实现这样的目标?

例如

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   ServerName mywebsite.com
   DocumentRoot /var/www/mywebsite.com

   # UsePHP 7
</virtualHost>
Run Code Online (Sandbox Code Playgroud)

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   ServerName mywebsite2.com
   DocumentRoot /var/www/mywebsite2.com

   # UsePHP 5
</virtualHost>
Run Code Online (Sandbox Code Playgroud)

Elv*_*sky 37

让我们从头开始吧.我假设您更喜欢使用php-fpm而不是Apache模块.

首先安装apache:

sudo apt-get update
sudo apt-get install apache2
Run Code Online (Sandbox Code Playgroud)

接下来安装多个PHP:

Debian 9:
安装PHP 7:

sudo apt-get install php7.0-cli php7.0-fpm php-pear libapache2-mod-fastcgi
Run Code Online (Sandbox Code Playgroud)

配置存储库:

sudo apt-get install apt-transport-https
sudo curl https://packages.sury.org/php/apt.gpg | apt-key add -
sudo echo 'deb https://packages.sury.org/php/ stretch main' > /etc/apt/sources.list.d/deb.sury.org.list
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

安装PHP 5:

sudo apt-get install php5.6-cli php5.6-fpm
Run Code Online (Sandbox Code Playgroud)

Debian 8:
安装PHP 5:

sudo apt-get install php5 php5-fpm php-pear libapache2-mod-fastcgi
Run Code Online (Sandbox Code Playgroud)

配置存储库:
编辑/etc/apt/sources.list并将以下行添加到文件末尾:

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all
Run Code Online (Sandbox Code Playgroud)

安装GPG密钥:

wget https://www.dotdeb.org/dotdeb.gpg
sudo apt-key add dotdeb.gpg
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

安装PHP 7:

sudo apt-get install php7.0 php7.0-fpm
Run Code Online (Sandbox Code Playgroud)

接下来从prefork切换并启用必要的模块:
对于Debian 8:

a2dismod php5 mpm_prefork
Run Code Online (Sandbox Code Playgroud)

对于Debian 9:

a2dismod php7 mpm_prefork
Run Code Online (Sandbox Code Playgroud)

接下来是两个:

a2enmod actions fastcgi alias proxy_fcgi mpm_worker
systemctl restart apache2
Run Code Online (Sandbox Code Playgroud)

将内容更改/etc/apache2/mods-enabled/fastcgi.conf为以下内容:

<IfModule !mod_fastcgi.c>
    AddHandler fcgid-script fcg fcgi fpl
</IfModule>
<IfModule mod_fastcgi.c>
    <Directory /usr/lib/cgi-bin>
        Require all granted
    </Directory>
</IfModule>
Run Code Online (Sandbox Code Playgroud)

现在为网站创建文档根文件夹:

mkdir -p /var/www/example.com/public_html
mkdir -p /var/www/test.com/public_html
Run Code Online (Sandbox Code Playgroud)

为这些网站添加sys用户:

sudo useradd example --home-dir /var/www/example.com
sudo useradd test --home-dir /var/www/test.com
Run Code Online (Sandbox Code Playgroud)

配置所有权:

sudo chown -R example.example /var/www/example.com
sudo chown -R test.test /var/www/test.com
Run Code Online (Sandbox Code Playgroud)

例如,网站example.com将使用PHP 5,网站test.com将使用PHP 7.

为网站创建配置文件:
PHP 5上的网站:

touch /etc/apache2/sites-available/example.com.conf
ln -s /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-enabled/example.com.conf
cat /etc/apache2/sites-available/example.com.conf
<VirtualHost *:80>

        ServerAdmin webmaster@localhost
        ServerName example.com
        ServerAlias www.example.com
        DocumentRoot /var/www/example.com/public_html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <IfModule mod_fastcgi.c>
            AddType application/x-httpd-fastphp5 .php
            Action application/x-httpd-fastphp5 /php5-fcgi
            Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi-example.com
            FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi-example.com -socket /var/run/php5-fpm-example.com.sock -pass-header Authorization
        </IfModule>

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

PHP 7网站:

touch /etc/apache2/sites-available/test.com.conf
ln -s /etc/apache2/sites-available/test.com.conf /etc/apache2/sites-enabled/test.com.conf
cat /etc/apache2/sites-available/test.com.conf
<VirtualHost *:80>

        ServerAdmin webmaster@localhost
        ServerName test.com
        ServerAlias www.test.com
        DocumentRoot /var/www/test.com/public_html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <IfModule mod_fastcgi.c>
                AddHandler php7-fcgi .php
                Action php7-fcgi /php7-fcgi virtual
                Alias /php7-fcgi /usr/lib/cgi-bin/php7-fcgi-test.com
                FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-test.com -socket /var/run/php/php7.0-fpm-test.com.sock -pass-header Authorization
        </IfModule>

</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

创建池配置(我使用以下):
PHP 5上的网站:

cat /etc/php5/fpm/pool.d/example.com.conf
[example.com]
user = example
group = example
listen = /var/run/php5-fpm-example.com.sock
listen.owner = www-data
listen.group = www-data
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
Run Code Online (Sandbox Code Playgroud)

PHP 7网站:

cat /etc/php/7.0/fpm/pool.d/test.com.conf
[test.com]
user = test
group = test
listen = /var/run/php/php7.0-fpm-test.com.sock
listen.owner = www-data
listen.group = www-data
php_admin_value[disable_functions] = exec,passthru,shell_exec,system
php_admin_flag[allow_url_fopen] = off
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
Run Code Online (Sandbox Code Playgroud)

重启apache和php-fpm服务:

sudo systemctl restart apache2 php5-fpm php7.0-fpm
Run Code Online (Sandbox Code Playgroud)

请享用!


nai*_*rch 21

@elvis-plesky的回答非常详细。但 Apache建议使用mod_proxy_fcgi

随着 apache httpd 2.4 在毫无戒心的人群中发布,我们获得了一些关于 apache 和 php 的非常简洁的功能:能够将 PHP 作为 fastCGI 进程服务器运行,并通过专用代理模块直接从 apache 内部寻址该 fastCGI 服务器(mod_proxy_fcgi。)

以下是使用 Apache 的 mod_proxy_fcgi 和 php-fpm为Debian 10设置两个具有不同 PHP 版本的虚拟主机的步骤。

配置存储库:

sudo apt-get install apt-transport-https
sudo curl https://packages.sury.org/php/apt.gpg | apt-key add -
sudo echo 'deb https://packages.sury.org/php/ stretch main' > /etc/apt/sources.list.d/deb.sury.org.list
sudo apt-get update
Run Code Online (Sandbox Code Playgroud)

安装所需的 PHP 版本:

sudo apt-get install php5.6-cli php5.6-fpm php7.3-cli php7.3-fpm
Run Code Online (Sandbox Code Playgroud)

在 php5.6-fpm 中配置/etc/apache2/conf-available/php5.6-fpm.conf

<IfModule !mod_php5.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
        SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>

    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://php56.localhost"
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>
Run Code Online (Sandbox Code Playgroud)

在 php7.3-fpm 中配置/etc/apache2/conf-available/php7.3-fpm.conf

<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
        SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>

    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://php73.localhost"
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>
Run Code Online (Sandbox Code Playgroud)

现在添加一个使用 PHP 5.6 的虚拟主机:

<VirtualHost *:80>
    ServerName test-php56.localhost
    DocumentRoot "/var/www/test-php56/"
    # use php 5.6
    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://php56.localhost"
    </FilesMatch>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

还有一个使用 PHP 7.3 的虚拟主机:

<VirtualHost *:80>
    ServerName test-php73.localhost
    DocumentRoot "/var/www/test-php73/"
    # use php 7.3
    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.3-fpm.sock|fcgi://php73.localhost"
    </FilesMatch>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

激活正确的 Apache 模块和配置:

sudo a2enmod proxy_fcgi
sudo a2enconf php5.6-fpm
sudo a2enconf php7.3-fpm
sudo systemctl restart apache2 php5.6-fpm php7.3-fpm
Run Code Online (Sandbox Code Playgroud)

FPM 池的默认配置应该已经正确。

  • 多谢!这是最好的评论。这实际上对我有用,因为我有一个不运行 PHP 7.3 的拙劣网站。工作完美无缺! (3认同)