En este artículo, les contaré cómo he migrado mis servidores que ejecutan Apache+PHP a Nginx+PHP-fpm sin detener el proceso.
Escenario
[Saltar introducción]
En 2020, durante los primeros días de la pandemia, tuvimos una reunión de preparación para la próxima cuarentena. El plan era continuar moviendo a todos nuestros estudiantes presenciales a la educación remota completa. Pregunté cuántos estudiantes extra debo esperar y dijeron sobre el doble. A continuación, mi sugerencia fue simplemente duplicar los recursos de hardware (núcleos de RAM y CPU) porque:
- Por suerte, tengo espacio suficiente, en términos de recursos de hardware, para ese tipo de crecimiento.
- la cuarentena terminará en solo dos semanas, un mes como máximo. Luego, nuestros estudiantes volverán a la modalidad presencial y recuperaré esos recursos adicionales.
Durante las dos primeras semanas de la cuarentena original tuve que aumentar cada vez más los recursos de hardware (pero sin duplicarlos) y esa solución resultó insuficiente. Después del primer mes, con los exámenes cada día más cerca, y la crisis del covid19 amenazando con extenderse hasta el verano, tenía que pensar en una real solución. Además, esta solución debe hacerse con el menor tiempo de inactividad posible ... ya tuvimos suficientes caídas de Moodle.
Nuevamente, por suerte todavía tengo un par de Gbs de RAM y núcleos de CPU disponibles. Configuré una pequeña VM nueva (1 núcleo y 1 gb de RAM) con una copia de uno de mis moodles de producción, para probar las cosas hasta que funcionara. Una vez que obtenga la configuración que lo hace, podría realizar el cambio sin tiempo de inactividad. El cambio final consiste en apagar apache e iniciar nginx
La instalación
Nginx
Si leyó algunas de mis publicaciones anteriores en FreeBSD, prefiero los puertos sobre los paquetes binarios, así que para instalar nginx ejecute:
# cd /usr/ports/www/nginx
# make install clean

Php-fpm
La forma predeterminada de ejecutar el código php dentro de Apache es habilitar el módulo mod_php. No hay (al menos que yo sepa) un módulo cargable nginx para PHP, por lo que debe habilitar el Administrador de procesos fastCGI. Si instaló PHP con las opciones predeterminadas, probablemente ya lo tenga, pero verifique dos veces:
[/usr/ports/www/nginx]# cd ../../lang/php74
[/usr/ports/lang/php74]# make config

Si FPM no está seleccionado, selecciónelo y luego ejecute:
[/usr/ports/lang/php74]# make install clean
La configuración
PHP-Fpm
Cree, si no existe, el archivo /usr/local/etc/php-fpm.d/www.conf my copying www.conf.default y luego edite:
[/usr/ports/lang/php74]# cd /usr/local/etc/php-fpm.d/
[/usr/local/etc/php-fpm.d/]# cp www.conf.default www.conf
[/usr/local/etc/php-fpm.d/]# ee www.conf
Desplácese hacia abajo hasta las opciones relevantes:
user/group
:debe ser el mismo usuario y grupo que apache, www para mí.listen
:como estoy sirviendo php solo localmente, estoy usando un socket de Unix:/var/run/php-fpm.sock
;pm
:dynamic
está bien, pero es posible que deba modificar y ajustar este parámetro. Eche un vistazo a los comentarios en el archivo.
Finalmente, habilitemos e iniciemos php-fpm:
[/usr/local/etc/php-fpm.d/] /usr/local/etc/rc.d/php-fpm enable
[/usr/local/etc/php-fpm.d/] /usr/local/etc/rc.d/php-fpm start
Nginx
El archivo nginx.conf podría ser tan grande (o estar dividido en tantas partes) como el httpd.conf de apache. En especial, si tiene varios VirtualHosts, las opciones relevantes son (al menos para mí dónde):
user
:el mismo usuario que el proceso de apache, por ejemplo, www.worker_process
:esto debería coincidir con el número de núcleos de CPUclient_max_body_size
:debe coincidir con los valores depost_max_size
yupload_max_size
en php.ini.root
:es igual aDocumentRoot
desde su VirtualHost en apache httpd.conf, es decir, /usr/local/www/- Agregue la siguiente sección para decirle a nginx cómo enviar su código php al servicio php-fpm:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php-fpm.sock;
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_read_timeout 120;
fastcgi_send_timeout 120;
}
Las otras opciones en el archivo de ejemplo nginx.conf se explican por sí mismas. Por supuesto, hay muchas otras cosas que puedes modificar, pero esta sería la magia.
Finalmente, podemos habilitar nginx, detener apache e iniciar nginx (en ese orden o nginx podría escuchar en los puertos http/https):
# /usr/local/etc/rc.d/nginx enable
# /usr/local/etc/rc.d/apache24 stop
# /usr/local/etc/rc.d/nginx start
Si algo sale mal
Tenga en cuenta que aún no deshabilitamos Apache. Si algo sale mal, simplemente detenga nginx e inicie apache24 para saber que ya estaba funcionando bien:
# /usr/local/etc/rc.d/apache24 stop ; /usr/local/etc/rc.d/nginx start
Cuando esté seguro de que todo funciona como se esperaba, puede desactivar apache.