Instalar múltiples versiones de PHP en Apache

En ocasiones hemos de tener varias versiones de PHP, bien para realizar pruebas o porque los paquetes prefabricados (oscommerce, wordpress, joomla, etc…) requieren de una cierta versión.

Versiones de PHP:

  • 5.6.31
  • 7.0.21
  • 7.1.7

Desactivamos el PHP-MOD (Si ya estaba activado)

a2dismod php5

Repositorio para UBUNTU

### Agregamos el repositorio ###
add-apt-repository ppa:ondrej/php

Repositorio para DEBIAN

#### Modificar repositorios ####
cp /etc/apt/sources.list /etc/apt/sources.list_user
var1="main"
var2="main contrib non-free"
sed "s|$var1|$var2|" /etc/apt/sources.list_user > /etc/apt/sources.list
rm /etc/apt/sources.list_user
### Agregamos el repositorio ###
apt-get install apt-transport-https lsb-release ca-certificates
wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list

Instalación de paquetes

### Actualizamos ###
apt-get update
### Instalamos Comunes ###
apt-get install libapache2-mod-fastcgi 
### Instalamos PHP 5.6.31###
apt-get install  php5.6-fpm php5.6-curl php5.6 php5.6-dev php5.6-mcrypt php5.6-mbstring php5.6-mysql php5.6-zip php5.6-gd php5.6-xml 
### Instalamos PHP 7.0.21###
apt-get install  php7.0-fpm php7.0-fpm php7.0 php7.0-dev php7.0-mbstring php7.0-mysql php7.0-zip php7.0-gd php7.0-xml php7.0-curl php7.0-intl php7.0-json php7.0-mcrypt
### Instalamos PHP 7.1.7###
apt-get install  php7.1-fpm php7.1-fpm php7.1 php7.1-dev php7.1-mbstring php7.1-mysql php7.1-zip php7.1-gd php7.1-xml php7.1-curl php7.1-intl php7.1-json php7.1-mcrypt
 
### Habilitamos los modulos en apache ###
a2enmod actions 
a2enmod fastcgi

Agregamos en /etc/apache2/sites-available/000-default.conf

<IfModule mod_fastcgi.c>
 AddHandler php56-fcgi-www .php
 Action php56-fcgi-www /php56-fcgi-www
 Alias /php56-fcgi-www /usr/lib/cgi-bin/php56-fcgi-www
 FastCgiExternalServer /usr/lib/cgi-bin/php56-fcgi-www -socket /run/php/php5.6-fpm.sock -pass-header Authorization
 <Directory "/usr/lib/cgi-bin">
  Require all granted
 </Directory>
</IfModule>

<IfModule mod_fastcgi.c>
 AddHandler php70-fcgi-www .php
 Action php70-fcgi-www /php70-fcgi-www
 Alias /php70-fcgi-www /usr/lib/cgi-bin/php70-fcgi-www
 FastCgiExternalServer /usr/lib/cgi-bin/php70-fcgi-www -socket /run/php/php7.0-fpm.sock -pass-header Authorization
 <Directory "/usr/lib/cgi-bin">
  Require all granted
 </Directory>
</IfModule>

<IfModule mod_fastcgi.c>
 AddHandler php71-fcgi-www .php
 Action php71-fcgi-www /php71-fcgi-www
 Alias /php71-fcgi-www /usr/lib/cgi-bin/php71-fcgi-www
 FastCgiExternalServer /usr/lib/cgi-bin/php71-fcgi-www -socket /run/php/php7.1-fpm.sock -pass-header Authorization
 <Directory "/usr/lib/cgi-bin">
  Require all granted
 </Directory>
</IfModule>

Configuración de VirtualHost

Dentro de los diferentes VirtualHost que tengamos deberemos de agregar lo siguiente entre <VirtualHost *:80></VirtualHost>, modificando “php70” por la versión que queramos usar, definidas previamente en el archivo 000-default.conf.

<IfModule mod_fastcgi.c>
	<FilesMatch ".+\.ph(p[345]?|t|tml)$">
		SetHandler php70-fcgi-www
	</FilesMatch>
</IfModule>

Modificación de usuario

En el caso de que se tenga un usuario/grupo configurado diferente a www-data (por defecto), habría que:
Modificar el propietario de la carpeta “/var/lib/apache2/fastcgi” con el usuario mismo usuario que use apache2, dentro de su configuración.
Modificar dentro de los archivos “/etc/php/X.X/fpm/pool.d/www.conf” las siguientes lineas:

  • user = www-data
  • group = www-data

Donde cambiaremos www-data por el usuario definido anterior mente.
Y las X.X de la ruta por la versión de php.

Reiniciaremos el apache para que se apliquen todos los cambios

sudo service apache2 restart

Y si todo a ido bien creando un info.php en los diferentes dominios que tengamos podremos ver la versión asignada.

info.php
<?php phpinfo(); ?>

Anotación

Al estar PHP en modo MPF/CGI, no se permiten las etiquetas php_flag ni php_value en el arhchivo .htaccess, en caso de encontrarse alguna de estas, el servidor devolverá error 500. Para estos casos se ha de utilizar el archivo “.user.ini”.

Por ejemplo:
En .htaccess:

### Usamos IfModule para controlar si PHP esta en MOD ###
<IfModule mod_php5.c>
    php_value max_input_vars 6000
</IfModule>

En .user.ini:

max_input_vars=6000

Agradecimientos a las fuentes originales: medium.com y a colinodell.com

Nota: Mirado como hacer que funcione en Debian 9 (stretch).

Última actualización: 21/07/2017


Navegación

Software de programación

Ayuda al servidor