Los sitios web con alto tráfico requieren una configuración especial de los servicios. Dependiendo del servicio elegido, existen recomendaciones para lograr un alto rendimiento del servidor VPS.
Simplemente aumentar los recursos no es suficiente para alcanzar un alto rendimiento del servidor VPS; también es necesario configurar los servicios.
Por defecto, los servicios tienen configuraciones básicas adecuadas para proyectos típicos con tráfico bajo o medio.
Para mayor claridad, definiremos los criterios de tráfico:
- Tráfico bajo del sitio web: hasta 10,000 visitas por mes (~300 por día, 1 visita cada 5 minutos).
- Tráfico medio del sitio web: de 10,000 a 90,000 visitas—tomemos un promedio de 50,000 por mes (~1,600 por día, 1 visita cada minuto).
- Tráfico alto del sitio web: 100,000 visitas por mes y más, es decir, desde 2 visitas por minuto en adelante.
Analicemos una configuración donde nginx actúa como servidor web proxy y php-fpm (en este caso, php8.3-fpm) como el manejador principal.
Utilizamos un servidor VPS con Linux Debian 12, 6 núcleos de CPU, 8 GB de RAM y un SSD de 50 GB.
Optimizaremos el rendimiento específicamente para php8.3-fpm. Con la configuración predeterminada, ejecutamos un script de análisis de enlaces, y en pocos minutos, la tasa de solicitudes cayó de 9 por segundo a 5. Después de otros 5 minutos, el rendimiento se redujo a 1.5 solicitudes por segundo, y el servicio comenzó a colapsar, devolviendo pronto un error Bad Gateway.
Mientras tanto, la carga del servidor no aumentó significativamente, y aún había suficientes recursos para manejar las solicitudes.
1. Nuevo archivo de configuración de php-fpm
Crea un nuevo archivo de configuración en /etc/php/8.3/fpm/pool.d/domain.conf
Renombra el archivo antiguo a www.conf.bak —esto asegura que no se usará, pero puedes revertirlo quitando el sufijo .bak si es necesario.
2. Detalles de la configuración
[www]
user = www-data
group = www-data
listen = 127.0.0.1:9000
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
; Process manager
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
pm.max_spawn_rate = 32
pm.process_idle_timeout = 10s
; Connection settings
listen.backlog = 65535
listen.allowed_clients = 127.0.0.1
; Timeouts
request_terminate_timeout = 30s
request_slowlog_timeout = 5s
slowlog = /var/log/php8.3-fpm/slow.log
; Status monitoring
pm.status_path = /fpm-status
ping.path = /ping
ping.response = pong
; Logging
access.log = /var/log/php8.3-fpm/access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{milli}dms"
catch_workers_output = yes
decorate_workers_output = no
; Security
security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8
clear_env = no
; Performance tweaks
rlimit_files = 65535
rlimit_core = unlimited
; PHP settings
php_admin_value[error_log] = /var/log/php8.3-fpm/error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 128M
php_admin_value[post_max_size] = 32M
php_admin_value[upload_max_filesize] = 32M
php_admin_value[max_execution_time] = 30
php_admin_value[session.gc_maxlifetime] = 1440
3. Configuraciones adicionales
Si el directorio de registros no existe, créalo:
mkdir -p /var/log/php8.3-fpm
3.1 Comentarios sobre la configuración
- listen = 127.0.0.1:9000 - Debe coincidir con la configuración de nginx o viceversa.
- pm.max_children = 50 - Depende de la RAM disponible (50 MB por cada hijo → ~2 GB para PHP).
- pm.start_servers = 10 - ~20% de pm.max_children.
- pm.max_requests = 500 - Reinicia los workers después de 500 solicitudes para evitar fugas de memoria (imperceptible para los visitantes y no afecta el funcionamiento).
- request_terminate_timeout = 30s - Termina las solicitudes colgadas.
- request_slowlog_timeout = 5s - Registra las solicitudes lentas.
- slowlog = /var/log/php8.3-fpm/slow.log
El registro de solicitudes lentas puede no ser muy útil para sitios basados en CMS, ya que mostrará una pila de llamadas, pero puede proporcionar información útil sobre el intervalo de tiempo de inicio y finalización de las solicitudes.
Para monitorear /fpm-status, agrega lo siguiente al bloque del servidor de nginx:
location = /fpm-status {
allow 127.0.0.1; # Permitir solo acceso local
allow 192.168.10.100; # O tu red de confianza
deny all; # Denegar a todos los demás
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
La salida tendrá el siguiente contenido:
pool: www
process manager: dynamic
start time: 04/Jun/2025:18:16:50 +0000
start since: 814
accepted conn: 239
listen queue: 0
max listen queue: 0
listen queue len: 128
idle processes: 9
active processes: 1
total processes: 10
max active processes: 3
max children reached: 0
slow requests: 0
4. Aplicar la nueva configuración
Verifica el archivo de configuración por errores:
php-fpm8.3 -t
Si no hay errores, reinicia el servicio:
systemctl restart php8.3-fpm
5. Nueva prueba
Con la nueva configuración, la carga del CPU aumentó notablemente durante pruebas similares, pero el rendimiento solo disminuyó un 20% (de 9 solicitudes por segundo a 7) después de unos minutos y se estabilizó. Todas las solicitudes (~10,000 en 25 minutos, equivalente a 400 solicitudes por minuto o ~7 por segundo) se procesaron con éxito con un código de estado 200.
Visualmente, al navegar por el sitio durante pruebas simultáneas, se notó un rendimiento significativamente más rápido. Con esta configuración de servicios web, los recursos del servidor ahora se utilizan por completo en lugar de permanecer inactivos como antes.