PHP7.2, nginx, PHP-FPM en CentOS7

29 de diciembre de 2017

Pese a que soy usuario habitual del sistema del pingüino, suelo decantarme por la familia basada en Debian. Es cuando hago experimentos cuando, para complicarme más las cosas, decido hacerlo en sistemas en los que no me conozco sus entresijos. Este es el motivo por el que elegí hacer esta instalación en CentOS7.

Ya hace tiempo que había oído acerca de las virtudes de nginx como servidor web para contenido estático. Sin embargo parecía que para procesar php no iba muy fino y se acababa combinando con Apache http server que se encargaba de este tema.

Pero entonces, me di cuenta de la existencia de php-fpm y de la forma en la que puede trabajar con nginx.

En resumen, php-fpm trabaja de forma independiente a nginx. Nginx le pasa el trabajo, y recoje el resultado, tal y como haría al utilizar un servidor Apache pero, quitándose al intermediario.

Finalmente, tras asistir a una charla sobre hostings web, con un poco de tiempo libre y mucha curiosidad, me decidí a probar. Ya puestos, tiramos de las últimas versiones de nginx y de php.

Instalación de nginx en CentOS 7 mediante repositorio de nginx.org

Parto del manual de instalación disponible en la web oficial. Lo cierto es que viene todo bastante conciso y bien explicado.

Agrego el repositorio en /etc/yum.repo.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=0
enabled=1
yum install nginx
systemctl start nginx

Compilación e instalación de php7.2 con soporte para php-fpm y mysql

Descargo las fuentes desde php.net:

curl -o php-7.2.0.tar.xz "http://es1.php.net/distributions/php-7.2.0.tar.xz"
Lenguaje del código: JavaScript (javascript)

Descomprimo el fichero en el directorio actual.

tar -xvJf php-7.2.0.tar.xz
Lenguaje del código: CSS (css)

Tengo que instalar gcc y libxml2-devel.

yum install gcc.x86_64 libxml2-devel
Lenguaje del código: CSS (css)

Entro en el directorio descomprimido y ejecuto configure con soporte para fpm y mysql.

cd php-7.2.0 ./configure --enable-fpm --with-mysql
Lenguaje del código: JavaScript (javascript)

Si todo ha ido bien, compilo, ejecuto los test e instalo.

make && make test make install

Configurar y probar

La documentación de instalación de php-fpm también está bastante bien aunque,  algunas rutas están cambiadas con respecto a lo que se ha creado en mi sistema tanto para nginx como para php-fpm.

Creo una página de prueba:

echo "<?php phpinfo(); ?>" >> /usr/share/nginx/html/index.php
Lenguaje del código: HTML, XML (xml)
location / { root /usr/share/nginx/html; index index.php index.html index.htm; }

Debo descomentar las líneas relativas a php y cambiar la ruta de SCRIPT_FILENAME a la ruta donde tengo el index.php, por defecto /usr/share/nginx/html/:

location ~ \.php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/$fastcgi_script_name; include fastcgi_params; }
Lenguaje del código: PHP (php)

Definir pool www:

cp /usr/local/etc/php-fpm/www.conf.default /usr/local/etc/php-fpm/www.conf
Lenguaje del código: PHP (php)

Iniciar php-fpm

/usr/local/sbin/php-fpm

Reiniciar nginx

systemctl restart nginx

Permitir conexiones al puerto 80

firewall-cmd --zone=public --add-port=80/tcp --permanent
Lenguaje del código: PHP (php)
firewall-cmd --reload

Ya con esto, arranco el navegador y accediendo a http://localhost, veo que funciona.

Ahora, debería mejorarlo y poner cada cosa en su lugar recomendado.

Ya cuando estaba acabando el experimento, me encuentro con esto: https://dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache/… Bueno, ¡pues ya tengo otro experimento que hacer!