¿Cuáles son las configuraciones óptimas para que Nginx maneje MUCHAS solicitudes al mismo tiempo?
Mi servidor está configurado con Nginx y PHP7.3 en Ubuntu 20.04 LTS. La aplicación que se está ejecutando está compilada con Laravel 7.
Esta es mi configuración actual:
location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.3-fpm.sock; fastcgi_index index.php; fastcgi_buffer_size 14096k; fastcgi_buffers 512 14096k; fastcgi_busy_buffers_size 14096k; fastcgi_connect_timeout 60; fastcgi_send_timeout 300; fastcgi_read_timeout 300; }Los parámetros fastcgi que coloqué los encontré a través de Google y ajusté el número a algunos valores altos.
La aplicación hace lo siguiente:
Los cuatro pasos se pueden realizar en un par de segundos.
El servidor no alcanza su punto máximo de CPU ni de memoria cuando se hace esto, lo único que sucede es que algunos usuarios obtienen un tiempo de espera 502.
Parece un problema de configuración del servidor en Nginx.
Estas son las estadísticas del servidor del momento en que sucedió:
La nota al margen es que deshabilité VerifyCsrfToken en Laravel para las rutas que se llaman para evitar una carga adicional en el servidor.
¿Qué me estoy perdiendo? ¿Tengo que cambiar también algunas configuraciones de PHP-FPM? Si es así, ¿a qué y dónde puedo hacer eso?
Esto es lo que me dicen los registros de errores de Nginx del dominio:
2020/04/25 13:58:14 [error] 7210#7210: *21537 connect() to unix:/var/run/php/php7.3-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 54.221.15.18, server: website.url, request: "GET /loader HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.3-fpm.sock:", host: "website.url"Configuración de www.conf:
pm.max_children = 100 pm.start_servers = 25 pm.min_spare_servers = 25 pm.max_spare_servers = 50 pm.max_requests = 9000 ;pm.process_idle_timeout = 10s; ;pm.status_path = /status
(11: Resource temporarily unavailable)
Eso es EAGAIN / EWOULDBLOCK , eso significa que nginx aceptó conexiones de clientes, pero no puede conectarse al socket UNIX de PHP-FPM sin bloquear (esperar), y probablemente, sin mirar el código fuente de nginx, nginx había intentado varias veces conectarse a dicho socket UNIX pero falló, por lo que nginx arroja una Connection refused .
Hay algunas maneras de resolver esto, ya sea:
listen.backlog en su configuración de grupo de PHP-FPM, con sus correspondientes net.ipv4.tcp_max_syn_backlog , net.ipv6.tcp_max_syn_backlog y net.core.netdev_max_backlog en sysctl .upstream para usar estos grupos.Edite /etc/security/limits.conf , ingrese:
# vi /etc/security/limits.confEstablezca un límite flexible y estricto para todos los usuarios o el usuario nginx de la siguiente manera:
nginx soft nofile 10000 nginx hard nofile 30000