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.

[root@lab01 ~]# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

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

[root@lab01 ~]# yum install nginx

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.

[root@lab01 ~]# yum install php-fpm php-common

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

[root@lab01 conf.d]# chkconfig php-fpm on
[root@lab01 conf.d]# service php-fpm start
Iniciando php-fpm:                                         [  OK  ]

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:

[root@lab01 conf.d]# egrep "(^user)|(^group)" /etc/php-fpm.d/www.conf
user = apache
group = apache

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):

[root@lab01 ~]# vi /etc/nginx/nginx.conf

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:

[root@lab01 nginx]# grep processor /proc/cpuinfo | wc -l
4

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:

[root@lab01 conf.d]# vi /etc/nginx/conf.d/test.conf 
server {
    listen       81;
    server_name test.com www.test.com;
    access_log /var/log/nginx/test-access.log;
    error_log /var/log/nginx/test-error.log;
    root /var/www/html/test;
 
    location / {
        index index.php index.html index.htm;
    }
 
    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html/test$fastcgi_script_name;
    }
}

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:

[root@lab01 conf.d]# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.Disabled

Ejecución de nginx

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

[root@lab01 conf.d]# service nginx start
[root@lab01 conf.d]# chkconfig nginx on

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.
[root@lab01 conf.d]# grep listen /etc/nginx/conf.d/test.conf 
    listen       80;
    • Parar Apache y reiniciar nginx para completar el proceso de migración de Apache a nginx.
[root@lab01 conf.d]# service httpd stop; service nginx restart
    • Asegurarnos de que Apache no se inicie durante el boot.
[root@lab01 conf.d]# chkconfig httpd off

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 *