如何在 Debian 上的 Apache 2.4 中为每个虚拟主机 select PHP 版本 5 和 7?
How to select PHP version 5 and 7 per virtualhost in Apache 2.4 on Debian?
是否可以在 Debian 9 上的 Apache 2.4 中同时 运行 PHP 7 和 PHP 5?我希望能够 select 我希望每个虚拟主机使用的 PHP 版本。考虑到我的某些网站仍在使用已弃用的 PHP 功能,我相信这会很有用。这允许我对每个站点执行升级。我如何实现这样的目标?
例如
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName mywebsite.com
DocumentRoot /var/www/mywebsite.com
# UsePHP 7
</virtualHost>
和
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName mywebsite2.com
DocumentRoot /var/www/mywebsite2.com
# UsePHP 5
</virtualHost>
让我们从头开始。
我假设您更愿意使用 php-fpm 而不是 Apache 模块。
首先安装apache:
sudo apt-get update
sudo apt-get install apache2
下一步安装多个PHP:
Debian 9:
安装 PHP 7:
sudo apt-get install php7.0-cli php7.0-fpm php-pear libapache2-mod-fastcgi
配置存储库:
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
安装PHP5:
sudo apt-get install php5.6-cli php5.6-fpm
Debian 8:
安装 PHP 5:
sudo apt-get install php5 php5-fpm php-pear libapache2-mod-fastcgi
配置存储库:
编辑 /etc/apt/sources.list
并将以下行添加到文件末尾:
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all
安装 GPG 密钥:
wget https://www.dotdeb.org/dotdeb.gpg
sudo apt-key add dotdeb.gpg
sudo apt-get update
安装PHP7:
sudo apt-get install php7.0 php7.0-fpm
接下来从 prefork 切换并启用必要的模块:
对于 Debian 8:
a2dismod php5 mpm_prefork
对于 Debian 9:
a2dismod php7 mpm_prefork
两者的下一步:
a2enmod actions fastcgi alias proxy_fcgi mpm_worker
systemctl restart apache2
将 /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>
现在为网站创建文档根文件夹:
mkdir -p /var/www/example.com/public_html
mkdir -p /var/www/test.com/public_html
为这些网站添加 sys 用户:
sudo useradd example --home-dir /var/www/example.com
sudo useradd test --home-dir /var/www/test.com
配置所有权:
sudo chown -R example.example /var/www/example.com
sudo chown -R test.test /var/www/test.com
例如,网站 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>
PHP7 上的网站:
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>
创建池配置(我使用了以下内容):
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 = /
PHP7 上的网站:
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 = /
重新启动 apache 和 php-fpm 服务:
sudo systemctl restart apache2 php5-fpm php7.0-fpm
尽情享受吧!
@elvis-plesky 的回答非常详细。但是Apachesuggests的用法mod_proxy_fcgi
:
With the release of apache httpd 2.4 upon an unsuspecting populace, we have gained some very neat functionality regarding apache and php: the ability to run PHP as a fastCGI process server, and address that fastCGI server directly from within apache, via a dedicated proxy module (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
安装需要 PHP 个版本:
sudo apt-get install php5.6-cli php5.6-fpm php7.3-cli php7.3-fpm
在/etc/apache2/conf-available/php5.6-fpm.conf
中配置php5.6-fpm:
<IfModule !mod_php5.c>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=
</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>
在/etc/apache2/conf-available/php7.3-fpm.conf
中配置php7.3-fpm:
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=
</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>
现在添加一个使用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>
和使用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>
激活正确的 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
FPM 池的默认配置应该已经正确了。
重要:
此更改将破坏旧的虚拟主机。您需要重新配置所有虚拟主机并添加项目所需的 FilesMatch
块。
例如,如果您的项目需要 php 7.4,那么您首先需要安装 fpm 包:
sudo apt-get install php7.4-fpm
sudo a2enconf php7.4-fpm
sudo systemctl restart apache2 php7.4-fpm
然后将此部分添加到您的虚拟主机配置中:
...
# use php 7.4
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://php74.localhost"
</FilesMatch>
然后重启apache service apache2 restart
.
是否可以在 Debian 9 上的 Apache 2.4 中同时 运行 PHP 7 和 PHP 5?我希望能够 select 我希望每个虚拟主机使用的 PHP 版本。考虑到我的某些网站仍在使用已弃用的 PHP 功能,我相信这会很有用。这允许我对每个站点执行升级。我如何实现这样的目标?
例如
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName mywebsite.com
DocumentRoot /var/www/mywebsite.com
# UsePHP 7
</virtualHost>
和
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName mywebsite2.com
DocumentRoot /var/www/mywebsite2.com
# UsePHP 5
</virtualHost>
让我们从头开始。 我假设您更愿意使用 php-fpm 而不是 Apache 模块。
首先安装apache:
sudo apt-get update
sudo apt-get install apache2
下一步安装多个PHP:
Debian 9:
安装 PHP 7:
sudo apt-get install php7.0-cli php7.0-fpm php-pear libapache2-mod-fastcgi
配置存储库:
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
安装PHP5:
sudo apt-get install php5.6-cli php5.6-fpm
Debian 8:
安装 PHP 5:
sudo apt-get install php5 php5-fpm php-pear libapache2-mod-fastcgi
配置存储库:
编辑 /etc/apt/sources.list
并将以下行添加到文件末尾:
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all
安装 GPG 密钥:
wget https://www.dotdeb.org/dotdeb.gpg
sudo apt-key add dotdeb.gpg
sudo apt-get update
安装PHP7:
sudo apt-get install php7.0 php7.0-fpm
接下来从 prefork 切换并启用必要的模块:
对于 Debian 8:
a2dismod php5 mpm_prefork
对于 Debian 9:
a2dismod php7 mpm_prefork
两者的下一步:
a2enmod actions fastcgi alias proxy_fcgi mpm_worker
systemctl restart apache2
将 /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>
现在为网站创建文档根文件夹:
mkdir -p /var/www/example.com/public_html
mkdir -p /var/www/test.com/public_html
为这些网站添加 sys 用户:
sudo useradd example --home-dir /var/www/example.com
sudo useradd test --home-dir /var/www/test.com
配置所有权:
sudo chown -R example.example /var/www/example.com
sudo chown -R test.test /var/www/test.com
例如,网站 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>
PHP7 上的网站:
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>
创建池配置(我使用了以下内容):
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 = /
PHP7 上的网站:
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 = /
重新启动 apache 和 php-fpm 服务:
sudo systemctl restart apache2 php5-fpm php7.0-fpm
尽情享受吧!
@elvis-plesky 的回答非常详细。但是Apachesuggests的用法mod_proxy_fcgi
:
With the release of apache httpd 2.4 upon an unsuspecting populace, we have gained some very neat functionality regarding apache and php: the ability to run PHP as a fastCGI process server, and address that fastCGI server directly from within apache, via a dedicated proxy module (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
安装需要 PHP 个版本:
sudo apt-get install php5.6-cli php5.6-fpm php7.3-cli php7.3-fpm
在/etc/apache2/conf-available/php5.6-fpm.conf
中配置php5.6-fpm:
<IfModule !mod_php5.c>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=
</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>
在/etc/apache2/conf-available/php7.3-fpm.conf
中配置php7.3-fpm:
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=
</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>
现在添加一个使用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>
和使用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>
激活正确的 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
FPM 池的默认配置应该已经正确了。
重要:
此更改将破坏旧的虚拟主机。您需要重新配置所有虚拟主机并添加项目所需的 FilesMatch
块。
例如,如果您的项目需要 php 7.4,那么您首先需要安装 fpm 包:
sudo apt-get install php7.4-fpm
sudo a2enconf php7.4-fpm
sudo systemctl restart apache2 php7.4-fpm
然后将此部分添加到您的虚拟主机配置中:
...
# use php 7.4
<FilesMatch ".+\.ph(ar|p|tml)$">
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://php74.localhost"
</FilesMatch>
然后重启apache service apache2 restart
.