Migrar de Apache/PHP a Nginx/PHP en CentOS

nginx2Si contamos con un servidor Apache, quizá nos interese pasarlo a nginx con el menor downtime posible. Yo he hecho alguna prueba partiendo del siguiente entorno:

  • CentOS release 6.6
  • Apache/2.2.15 sin módulos adicionales
  • VirtualHosts para un proyecto PHP 5.3.3

Lo que haremos con nginx es instalarlo y configurarlo de forma muy básica en un puerto diferente y posteriormente una vez esté todo bien, cambiar puertos de escucha.

ATENCIÓN: Si estás pensando en migrar de Apache a Nginx, en producción, ten en cuenta que dependiendo de tu entorno, deberás hacerlo de una u otra manera. No es lo mismo migrar un proyecto python que sirve Apache via mod_wsgi, que un proyecto PHP que ni si quiera usa mod_rewrite (como en este ejemplo). Este post, por tanto, te puede servir de punto de partida, pero no es la “guía definitiva”.

Instalación de nginx

En primer lugar, deberemos crear el fichero para acceder al repositorio de nginx, pues éste no viene en los repositorios de CentOS.

Tras configurar el repo, ya podremos instalar nginx via yum:

Instalación de PHP-FPM

Para que nginx pueda interpretar código PHP usaremos PHP-FPM (FastCGI Process Manager), una implementación de PHP FastCGI que abrirá sockets de escucha que nginx usará para servir páginas PHP. Por defecto, PHP-FPM escuchará en localhost puerto 9000.

Tras la instalación, deberemos configurar php-fpm para que se inicie durante el boot del server y posteriormente iniciaremos el servicio.

NOTA: Seguramente nos interese revisar la configuración de php-fpm, como recomiendan en PHP.net, para asegurarnos (por lo menos) que el usuario y grupo que correrá el servicio es el que esperamos:

Puedes encontrar aquí más información sobre la configuración de PHP-FPM.

Configuración básica de nginx en paralelo a Apache

Una vez instalado nginx y sus dependencias podremos revisar el fichero de configuración general de nginx (aquí y aquí dan algunos consejos):

Si estás pensando en dejar nginx en producción, te recomendaría empaparte de su configuración para poder adaptarla a tu entorno. En mi caso únicamente he modificado los siguientes parámetros:

worker_processes

Un buen valor para estos procesos, es el número de CPUs/cores del server. He leído en múltiples sitios que también se puede usar 2*<numero_de_cpus>. Cualquiera de los dos métodos para calcular este valor nos servirá, pues normalmente la CPU no será el cuello de botella en nginx. Puedes sacar el número de procesadores del servidor con el siguiente comando:

worker_connections

Con este parámetro estaremos determinando el número de conexiones que cada proceso worker podrá gestionar. Como en el ejemplo hemos configurado “worker_processes” a 4, ésto significaría que por defecto nuestro nginx estaría configurado para trabajar con hasta 4*1024 conexiones simultáneas. Partiendo de que normalmente un navegador abre 2 conexiones, estaremos definiendo la posibilidad de gestionar hasta 4*512 usuarios a la vez (2048 usuarios). Parece un buen número para empezar, así que lo he dejado por defecto en 1024.

Puedes encontrar más info sobre Nginx Tuning aquí y aquí.

Creación del VirtualHost PHP

Una vez tocada la configuración general de nginx, he creado un vhost de apuntando al mismo proyecto PHP que tenemos con Apache:

Del fichero de configuración anterior, destaco lo siguiente:

  • listen: cambiamos el puerto de escucha para que no coincida con el de Apache. En el ejemplo nginx escuchará por el 81, así podremos confirmar que nginx funciona bien sin necesidad de interrumpir el servicio.
  • index: en el location raíz, indicamos mediante la directiva “index” que el fichero index.php será la primera opción devolver cuando se realizan peticiones a directorios, de igual manera que la directiva DirectoryIndex de Apache.
  • location ~ \.php$: esta sección define, básicamente, que los ficheros .php han de processarse via el socket 127.0.0.1:9000 correspondiente a php-fpm, y por tanto es lo que hará que nginx procese los ficheros PHP.

En este post hay una tabla comparativa de directivas de Nginx y Apache, muy interesante.

En mi caso, la instalación de nginx viene con un virtualhost “default”, el cual he renombrado para desactivarlo:

Ejecución de nginx

Una vez configurado nginx, podremos lanzarlo y dejarlo configurado para que se inicie durante el boot del server:

Migración de Apache a nginx

Tras ésto, ya podremos acceder al puerto 81 del server (donde está escuchando nginx) y comparar el resultado con lo que devuelve el puerto 80 (apache). Si todo va bien, bastará con:

    • Cambiar el puerto de escucha de nginx por el 80.

    • Parar Apache y reiniciar nginx para completar el proceso de migración de Apache a nginx.

    • Asegurarnos de que Apache no se inicie durante el boot.

Tras este proceso, ya estaríamos trabajando con nginx en lugar de con Apache, con un downtime de apenas unos segundos.

Fuentes:

http://www.if-not-true-then-false.com/2011/install-nginx-php-fpm-on-fedora-centos-red-hat-rhel/

http://www.aljtmedia.com/blog/migrating-from-apache-web-server-to-nginx-on-a-centos-65-vps/

http://www.if-not-true-then-false.com/2011/nginx-and-php-fpm-configuration-and-optimizing-tips-and-tricks/

https://www.airpair.com/nginx/posts/ultimate-guide-migrating-apache-to-nginx-1

http://www.rackspace.com/knowledge_center/article/installing-nginx-and-php-fpm-setup-for-nginx

Deja un comentario

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