Instalación del Stack Nginx+MySQL+MutiPHP en CentOS

Que PHP es uno de los lenguajes más usados en la web no es ninguna novedad, ya cuenta con muchos años en el mercado y con varias versiones publicadas.

En la web conviven muchos proyectos desarrollados a través de los años y cada uno con requerimientos de versión de PHP diferentes.

Por eso contar con un entorno con varias versiones de PHP diferentes y que permita configurar cada sitio por separado con una versión específica es una necesidad ya se trate de un entorno de desarrollo o de un servidor de producción.

Por eso en este artículo se tratará la instalación de siete versiones de PHP en un mismo sistema, si bien la configuración se hará con el servidor Nginx perfectamente se puede adaptar para usar Apache.

Para saber porque Nginx es mejor opción que Apache una lectura recomendada es Apache vs Nginx vs LiteSpeed donde se puede ver una excelente comparativa de los tres navegadores más usados actualmente en la web.

Instalación Básica

Lo primero sera habilitar los repositorios necesarios, esto repo proporcionarán todos los paquetes necesarios para hacer la instalación del servidor.

yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install -y epel-release

Es necesario actualizar el sistema

yum update -y

Herramientas Opcionales

Las siguientes herramientas son opcionales, no son necesarias para el resto de la instalación ni para el funcionamiento de PHP pero que sin embargo son útiles en cualquier sistema:

yum install -y yum-utils wget nano lynx git iputils net-tools nmap mtr gcc gcc-c++ make autoconf glibc rcs pcre-devel openssl-devel expat-devel geoip-devel zlib-devel mlocate ncdu mytop composer npm bind-utils

Instalación de Servicios

Si se está configurando un servidor remoto ya debe estar el servidor ssh instalado sin embargo en el caso de estar instalando un contenedor Docker o un servidor in-situ se debe instalar openssh

yum install -y openssh-server

Ahora se instala Nginx, MariaDB

#Instalamos Nginx, MariaDB
yum install -y httpd mariadb-server nginx

Instalación de PHP y PHP-FPM

#Con esto instalaremos PHP 5.4, 5.5, 5.6, 7.0, 7.1, 7.2 y 7.3
#ademas de todas las librerías necesarias mas PHP-FPM para
#cada versión de PHP anterior
yum install -y php54 php55 php56 php70 php71 php72 php73 \
php54-php-fpm php55-php-fpm php56-php-fpm php70-php-fpm php71-php-fpm php72-php-fpm php73-php-fpm \
php54-php-mysql php54-php-mcrypt php54-php-mbstring php54-php-cli php54-php-fpm php54-php-gd php54-php-json php54-php-ioncube-loader php54-php-intl php54-php-pdo php54-php-pgsql php54-php-soap php54-php-xml php54-php-xmlrpc \
php55-php-mysql php55-php-mcrypt php55-php-mbstring php55-php-cli php55-php-fpm php55-php-gd php55-php-json php55-php-ioncube-loader php55-php-intl php55-php-pdo php55-php-pgsql php55-php-soap php55-php-xml php55-php-xmlrpc \
php56-php-mysql php56-php-mcrypt php56-php-mbstring php56-php-cli php56-php-fpm php56-php-gd php56-php-json php56-php-ioncube-loader php56-php-intl php56-php-pdo php56-php-pgsql php56-php-soap php56-php-xml php56-php-xmlrpc \
php70-php-mysql php70-php-mcrypt php70-php-mbstring php70-php-cli php70-php-fpm php70-php-gd php70-php-json php70-php-ioncube-loader php70-php-intl php70-php-pdo php70-php-pgsql php70-php-soap php70-php-xml php70-php-xmlrpc \
php71-php-mysql php71-php-mcrypt php71-php-mbstring php71-php-cli php71-php-fpm php71-php-gd php71-php-json php71-php-ioncube-loader php71-php-intl php71-php-pdo php71-php-pgsql php71-php-soap php71-php-xml php71-php-xmlrpc \
php72-php-mysql php72-php-mcrypt php72-php-mbstring php72-php-cli php72-php-fpm php72-php-gd php72-php-json php72-php-ioncube-loader php72-php-intl php72-php-pdo php72-php-pgsql php72-php-soap php72-php-xml php72-php-xmlrpc \
php73-php-mysql php73-php-mcrypt php73-php-mbstring php73-php-cli php73-php-fpm php73-php-gd php73-php-json php73-php-ioncube-loader php73-php-intl php73-php-pdo php73-php-pgsql php73-php-soap php73-php-xml php73-php-xmlrpc \

Configurando PHP

Se deben detener los servicios y a cada versión de PHP-FPM se le asigna un puerto diferente mediante los siguientes comandos:

systemctl stop php54-php-fpm
systemctl stop php55-php-fpm
systemctl stop php56-php-fpm
systemctl stop php70-php-fpm
systemctl stop php71-php-fpm
systemctl stop php72-php-fpm
systemctl stop php73-php-fpm

sed -i 's/:9000/:9054/' /opt/remi/php54/root/etc/php-fpm.d/www.conf
sed -i 's/:9000/:9055/' /opt/remi/php55/root/etc/php-fpm.d/www.conf
sed -i 's/:9000/:9056/' /etc/opt/remi/php56/php-fpm.d/www.conf
sed -i 's/:9000/:9070/' /etc/opt/remi/php70/php-fpm.d/www.conf
sed -i 's/:9000/:9071/' /etc/opt/remi/php71/php-fpm.d/www.conf
sed -i 's/:9000/:9072/' /etc/opt/remi/php72/php-fpm.d/www.conf
sed -i 's/:9000/:9073/' /etc/opt/remi/php73/php-fpm.d/www.conf

sed -i 's/user = apache/user = nginx/' /opt/remi/php54/root/etc/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/' /opt/remi/php54/root/etc/php-fpm.d/www.conf
sed -i 's/user = apache/user = nginx/' /opt/remi/php55/root/etc/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/' /opt/remi/php55/root/etc/php-fpm.d/www.conf
sed -i 's/user = apache/user = nginx/' /etc/opt/remi/php56/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/' /etc/opt/remi/php56/php-fpm.d/www.conf
sed -i 's/user = apache/user = nginx/' /etc/opt/remi/php70/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/' /etc/opt/remi/php70/php-fpm.d/www.conf
sed -i 's/user = apache/user = nginx/' /etc/opt/remi/php71/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/' /etc/opt/remi/php71/php-fpm.d/www.conf
sed -i 's/user = apache/user = nginx/' /etc/opt/remi/php72/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/' /etc/opt/remi/php72/php-fpm.d/www.conf
sed -i 's/user = apache/user = nginx/' /etc/opt/remi/php73/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/' /etc/opt/remi/php73/php-fpm.d/www.conf

chown nginx /opt/remi/php54/root/var/log/php-fpm
chown nginx /opt/remi/php55/root/var/log/php-fpm
chown nginx /opt/remi/php56/root/var/log/php-fpm
chown nginx /var/opt/remi/php70/log/php-fpm
chown nginx /var/opt/remi/php71/log/php-fpm
chown nginx /var/opt/remi/php72/log/php-fpm
chown nginx /var/opt/remi/php73/log/php-fpm

chgrp nginx -R /opt/remi/php54/root/var/lib/php/wsdlcache
chgrp nginx -R /opt/remi/php56/root/var/lib/php/wsdlcache
chgrp nginx -R /opt/remi/php55/root/var/lib/php/wsdlcache
chgrp nginx -R /var/opt/remi/php70/lib/php/wsdlcache
chgrp nginx -R /var/opt/remi/php70/lib/php/opcache
chgrp nginx -R /var/opt/remi/php72/lib/php/wsdlcache
chgrp nginx -R /var/opt/remi/php72/lib/php/opcache
chgrp nginx -R /var/opt/remi/php71/lib/php/wsdlcache
chgrp nginx -R /var/opt/remi/php71/lib/php/opcache
chgrp nginx -R /var/opt/remi/php73/lib/php/wsdlcache
chgrp nginx -R /var/opt/remi/php73/lib/php/opcache

chown nginx:nginx /opt/remi/php54/root/var/lib/php/session
chown nginx:nginx /opt/remi/php55/root/var/lib/php/session
chown nginx:nginx /var/opt/remi/php56/lib/php/session
chown nginx:nginx /var/opt/remi/php70/lib/php/session
chown nginx:nginx /var/opt/remi/php71/lib/php/session
chown nginx:nginx /var/opt/remi/php72/lib/php/session
chown nginx:nginx /var/opt/remi/php73/lib/php/session

systemctl start php56-php-fpm
systemctl start php55-php-fpm
systemctl start php56-php-fpm
systemctl start php70-php-fpm
systemctl start php71-php-fpm
systemctl start php72-php-fpm
systemctl start php73-php-fpm

Configurando arranque

Por último se debe configurar todos los servicios para que arranquen con el sistema:

systemctl start nginx
systemctl start mariadb

systemctl enable nginx
systemctl enable mariadb
systemctl enable php54-php-fpm
systemctl enable php55-php-fpm
systemctl enable php56-php-fpm
systemctl enable php70-php-fpm
systemctl enable php71-php-fpm
systemctl enable php72-php-fpm
systemctl enable php73-php-fpm

Configuracion basica de Nginx

Para configurar un sitio en Nginx se puede utilizar como ejemplo el contenido siguiente, simplemente se guarda en un archivo .conf en /etc/nginx/conf.d/ por ejemplo:

/etc/nginx/conf.d/example.lan.conf

server {

    listen 80;
    listen [::]:80;

    server_name example.lan;

    root /var/www/example.lan;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        try_files $uri =404;

        #PHP 5.4
        #fastcgi_pass 127.0.0.1:9054;

        #PHP 5.5
        #fastcgi_pass 127.0.0.1:9055;

        #PHP 5.6
        fastcgi_pass 127.0.0.1:9056;

        #PHP 7.0
        #fastcgi_pass 127.0.0.1:9070;

        #PHP 7.1
        #fastcgi_pass 127.0.0.1:9071;

        #PHP 7.2
        #fastcgi_pass 127.0.0.1:9072;

        #PHP 7.3
        #fastcgi_pass 127.0.0.1:9073;

        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 4k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;

    }
}

Si se está trabajando con un dominio real se puede apuntar directamente los registros DNS en cambio si se está trabajando en un entorno local de pruebas se puede utilizar el archivo host de la PC simplemente agregando

127.0.0.1 example.lan www.example.lan

Para ver donde encontrar y cómo modificar este archivo puedes seguir esta guia.

Cambiar de version PHP desde la consola

Existen casos donde desde la consola se ejecutan comandos como artisan de laravel que necesitan una versión en especial, por eso lo mejor es copiar el siguiente código y ejecutarlo en la consola.

cat > /usr/bin/setphp << EOF
#!/bin/bash

ln -sf /usr/bin/php\$1 /usr/bin/php

EOF

Con el código anterior se creará el comando al que debemos dar permisos de ejecución con

chmod +x /usr/bin/setphp

Por último para cambiar entre versión se puede ejecutar

setphp 54 #Para PHP 5.4
setphp 55 #Para PHP 5.5
setphp 56 #Para PHP 5.6
setphp 70 #Para PHP 7.0
setphp 71 #Para PHP 7.1
setphp 72 #Para PHP 7.2
setphp 73 #Para PHP 7.3

Conclusión

Si se está configurando un entorno de pruebas o de desarrollo en Docker más rápido y práctico es descargar la imagen de docker ya preconfigurada  Crear contenedor Docker con CentOS7/Nginx/MariaDB y MultiPHP o también es posible realizar la instalación de forma más automática mediante el siguiente script en GitHub.

Alvaro DeLeon

Acerca de Alvaro DeLeon

Administrador de Sistemas,Programador,Docente y Blogger. Más de 20 años de experiencia en computación. Escribo más que nada sobre Linux, sistemas operativos, virtualización, seguridad y tecnología en general además de algunos artículos con opiniones muy personales e irrelevantes.
Esta entrada fue publicada en Varios. Guarda el enlace permanente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *