Introducción

Nginx es un servidor web muy rápido, robusto, liviano y potente que ejecuta al menos el 40% de los sitios web más ocupados del mundo. Debido a la versatilidad de Nginx, también se utiliza como equilibrador de carga, proxy inverso y servidor de caché HTTP.

Lo mejor de Nginx es su velocidad a la que puede manejar miles de conexiones simultáneas sin problemas.

Este artículo explica las mejores formas de optimizar y optimizar el servidor web Nginx.

requisitos

  • Configuración de Linux VPS (cualquier gusto de Linux)
  • Comprensión básica de la configuración de Nginx
  • Nginx instalado

Para optimizar y optimizar Nginx, los parámetros en el archivo de configuración estándar de Nginx deben ajustarse /etc/nginx/nginx.conf.

Aquí hay un ejemplo de un archivo de configuración estándar de Nginx /etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
 
events {
        worker_connections 768;
    	# multi_accept on;
}
 
http {
 
    	##
    	# Basic Settings
    	##
 
    	sendfile on;
    	tcp_nopush on;
    	tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
    	server_tokens off;
    	add_header X-XSS-Protection "1; mode=block";
    	add_header X-Frame-Options "SAMEORIGIN";
 
    	# server_names_hash_bucket_size 64;
    	# server_name_in_redirect off;
 
    	include /etc/nginx/mime.types;
    	default_type application/octet-stream;
 
    	##
    	# SSL Settings
    	##
 
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;
 
    	##
    	# Logging Settings
    	##
  access_log /var/log/nginx/access.log;
    	error_log /var/log/nginx/error.log;
 
    	##
    	# Gzip Settings
    	##
 
    	gzip on;
 
    	# gzip_vary on;
    	# gzip_proxied any;
    	# gzip_comp_level 6;
    	# gzip_buffers 16 8k;
    	# gzip_http_version 1.1;
    	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
 
    	##
    	# Virtual Host Configs
    	##
 
    	include /etc/nginx/conf.d/*.conf;
    	include /etc/nginx/sites-enabled/*;
}
 
 
#mail {
#   	# See sample authentication script at:
#   	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#   	# auth_http localhost/auth.php;
#   	# pop3_capabilities "TOP" "USER";
#   	# imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#   	server {
#               listen 	localhost:110;
#               protocol   pop3;
#               proxy  	on;
#   	}
#
#   	server {
#               listen 	localhost:143;
#               protocol   imap;
#               proxy  	on;
#   	}
#}

Haga una copia de seguridad de su archivo de configuración actual de Nginx antes de editarlo mientras hace ajustes y modificaciones de Nginx. Se recomienda que realice un cambio a la vez, guarde el archivo de configuración, reinicie el servidor Nginx y ejecute pruebas de rendimiento para ver mejoras de rendimiento. Si no ve ninguna mejora, es posible que desee volver al valor predeterminado / inicial.

1. Procesos de trabajo

Los procesos de trabajo se refieren a la cantidad de trabajadores que creará Nginx. Se recomienda ejecutar 1 proceso de trabajo por núcleo de CPU. Si ingresa un valor que es mayor que el número de núcleos de CPU en su computadora / VPS, causará procesos inactivos en el sistema.

De forma predeterminada, el valor de los procesos de trabajo se establece en automóvil.

Ejecute el siguiente comando para averiguar la cantidad de núcleos de CPU en su sistema:

$ grep processor /proc/cpuinfo | wc -l
1

En nuestro VPS tenemos 1 core por lo que se recomienda esto set the worker process value to 1

en el archivo de configuración como se muestra a continuación:

worker_processes 1;

Si hay más tráfico en su servidor web Nginx y es necesario ejecutar más procesos, se recomienda que actualice su computadora a más núcleos y adapte los procesos de trabajo a la nueva cantidad de núcleos de CPU en su sistema.

2. Asociaciones de trabajadores

Las conexiones de trabajo son la cantidad de clientes que pueden ser atendidos simultáneamente por un servidor web Nginx. En combinación con el proceso de trabajo, obtiene el número máximo de clientes que se pueden atender por segundo de la siguiente manera:

Max Number of Clients/Second = Worker processes * Worker connections

De forma predeterminada, el valor de las conexiones de los trabajadores se establece en 768.

Sin embargo, debe tenerse en cuenta que un navegador generalmente abre al menos 2 conexiones por servidor al mismo tiempo, por lo que el número se puede reducir a la mitad.

Para aprovechar todo el potencial de Nginx, las conexiones de los trabajadores deben establecerse en la cantidad máxima de procesos que el núcleo puede ejecutar al mismo tiempo. Este es el número de descriptores de archivos abiertos que se pueden obtener usando el siguiente comando:

$ ulimit -n
1024

En nuestro VPS, el núcleo se limita a 1024 processes Por lo tanto, se recomienda establecer el valor de las conexiones de los trabajadores en un momento específico (within events section) a 1024 de la siguiente manera:

events {
        worker_connections 1024;
    	
}

Según nuestro cálculo, el número máximo de clientes que pueden ser atendidos por segundo es

1024 worker connections * 1 worker process = 1024 clients per second

3. Aceptación múltiple

Multi Accept define cómo el proceso de trabajo acepta nuevas conexiones.

El flujo de trabajo está configurado de forma predeterminada off y accepts one new connection at a time.

Cuando está habilitado, el proceso de trabajo aceptará todas las conexiones nuevas a la vez. El valor multi_accept (within events section) debe apagarse como se muestra a continuación:

events {
        worker_connections 1024;
    	  multi_accept off;
}

4. Compresión Gzip

La compresión de las respuestas de los clientes reduce su tamaño, lo que utiliza menos ancho de banda de red y mejora el tiempo de carga de la página para enlaces lentos. Cabe señalar que el proceso de compresión en sí mismo consume recursos de la máquina. Por lo tanto, debe analizar y evaluar los beneficios de costos de la compresión. De lo contrario, la compresión puede ser perjudicial y degradar el rendimiento de Nginx. Se recomienda implementar la compresión de la siguiente manera:

  1. Habilite el contenido gzip solo para el contenido apropiado, por ejemplo, B. CSS, texto, archivos JavaScript, etc.
  2. Investigue los efectos de la compresión activando y desactivando la compresión para diferentes tipos y tamaños de contenido
  3. NO aumente el nivel de compresión ya que costará la sobrecarga de la CPU sin un aumento correspondiente en el rendimiento.

El ejemplo recomendado de configuración gzip es el siguiente: (dentro sección http)

gzip on;
    	gzip_vary on;
    	gzip_proxied any;
    	gzip_comp_level 1;
    	gzip_buffers 16 8k;
    	gzip_http_version 1.1;
    	gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

5. tampón

Los búferes juegan un papel muy importante en la optimización del rendimiento de Nginx. Las siguientes variables deben ajustarse para un rendimiento óptimo:

client_body_buffer_size – Maneja el tamaño del búfer del cliente, es decir, las acciones POST, p. Ej. B. Envíos de formularios enviados al servidor web de Nginx. Se recomienda establecer este valor en 10 KB.

client_header_buffer_size – Similar a client_body_buffer_size, pero maneja el tamaño del encabezado del cliente. Se recomienda configurarlo en 1 KB.

client_max_body_size – Tamaño máximo de solicitud de cliente permitido. Si se excede el valor, nginx generará un error 413 o una entidad de solicitud que es demasiado grande.

large_client_header_buffers – Número máximo y tamaño de búferes para encabezados de cliente grandes.

Los ajustes recomendados son los siguientes (dentro sección http)

client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 4 4k;

Con los valores por encima de Nginx, funciona de manera óptima, pero para una mayor optimización, puede modificar los valores y probar el rendimiento.

6. Tiempos de espera

Los tiempos de espera mejoran enormemente el rendimiento de Nginx. Las conexiones keepalive reducen la sobrecarga de la CPU y la red necesaria para abrir y cerrar conexiones. Las siguientes variables deben ajustarse para obtener el mejor rendimiento:
client_header_timeout Y client_body_timeout – Tiempo que el servidor Nginx espera a que se envíe un encabezado o cuerpo de cliente después de una solicitud.

keepalive_timeout – El tiempo durante el cual la conexión keepalive permanece abierta. Luego, nginx cierra la conexión del cliente.

send_timeout – Timeout al enviar una respuesta al cliente. Si el cliente no recibe la respuesta del servidor dentro de este período, nginx termina la conexión.

Se recomiendan los siguientes valores: (within http section)

client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;

7. Registro de acceso

El registro es muy importante para administrar, solucionar problemas y monitorear los sistemas. Sin embargo, registrar y almacenar grandes cantidades de datos consume tantos recursos del sistema que requiere más ciclos de CPU / E / S, lo que reduce el rendimiento del servidor. Para el registro de acceso, se registra cada solicitud de Nginx, lo que consume una gran cantidad de recursos de CPU, lo que reduce el rendimiento de Nginx.

Hay dos soluciones para esto.

  1. Desactivar completamente el registro de acceso
    access_log off;
  2. Si se requiere el registro de acceso, habilite el almacenamiento en búfer del registro de acceso. Esto permite a Nginx almacenar en búfer varias entradas de registro y escribir en el archivo de registro al mismo tiempo en lugar de realizar una escritura diferente para cada entrada de registro individual.
    access_log /var/log/nginx/access.log main buffer=16k

También puede utilizar soluciones de registro de código abierto como ELK Stack y otras que centralizan todos los registros de su sistema.

Conclusión

Una vez que tenga un servidor web Nginx optimizado, el siguiente paso es monitorear el servidor y cambiar la configuración con el tiempo a medida que aumenta el tráfico hacia el servidor o surgen otros factores. Por tanto, los valores recomendados no son los mejores en todas las circunstancias, sino solo durante el desarrollo y cuando hay poco o medio tráfico hacia el servidor web. Puede aumentar gradualmente los valores a medida que ejecuta las pruebas de rendimiento para buscar mejoras.

Si no ve ninguna mejora, deje el valor predeterminado. En general, los valores optimizados de los distintos parámetros mejoran enormemente el rendimiento de Nginx.

Otras consideraciones que quizás desee hacer para mejorar el rendimiento de su servidor web, especialmente cuando el tráfico se está acumulando, son el equilibrio de carga, el escalado automático, la alta disponibilidad, por nombrar algunas. Si todo lo demás falla, considere cambiarse a un nuevo proveedor de VPS con hardware y software mejores y más actualizados (¿necesita ayuda? Consulte la lista de Hosting mas Baratode los mejores servicios de hosting de VPS).