Red de conocimiento informático - Consumibles informáticos - Nginx de alta concurrencia, ¿a qué configuraciones se debe prestar atención?

Nginx de alta concurrencia, ¿a qué configuraciones se debe prestar atención?

Consulte la siguiente

configuración de nginx para alta concurrencia

1 En términos generales, los siguientes elementos en el archivo de configuración de nginx son más efectivos para la optimización:

p>

1.worker_processes 8;

Se recomienda especificar el número de procesos nginx de acuerdo con el número de CPU, que suele ser un múltiplo del mismo (por ejemplo, 2 quads). -Cpu de núcleo se cuentan como 8).

2.worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

Asigne CPU a cada proceso. tu puedes escriba más uno o asigne un proceso a varias CPU.

3.worker_rlimit_nofile 65535;

Esta instrucción se refiere al número máximo de descriptores de archivos abiertos por un proceso nginx. El valor teórico debe ser el número máximo de archivos abiertos.

(ulimit -n) se divide por el número de procesos nginx, pero nginx asigna solicitudes de manera no tan uniforme, por lo que es mejor mantener el valor consistente con ulimit -n.

Ahora el número de archivos abiertos bajo el kernel Linux 2.6 es 65535, y trabajador_rlimit_nofile debe completarse con 65535 en consecuencia.

Esto se debe a que la asignación de solicitudes a procesos durante la programación de nginx no está tan equilibrada, por lo que si completa 10240 y la concurrencia total alcanza entre 30 000 y 40 000, algunos procesos pueden exceder 10240 y se devolverán 502. . error.

Cómo ver el descriptor de archivos del sistema Linux:

[root@web001 ~]# sysctl -a | grep fs.file

fs.file-max = 789972

fs.file-nr = 510 0 789972

4. use epoll;

use el modelo de E/S de epoll

(

Explicación adicional:

Similar a Apache, nginx tiene diferentes modelos de eventos para diferentes sistemas operativos

A) Modelo de eventos estándar

p>

Seleccionar y sondear pertenecen al modelo de eventos estándar. Si no hay un método más efectivo en el sistema actual, nginx elegirá seleccionar o sondear

B) Modelo de eventos eficiente

Kqueue. : Se utiliza en FreeBSD 4.1, OpenBSD 2.9, NetBSD 2.0 y MacOS X. El uso de kqueue en un sistema MacOS X de doble procesador puede provocar un pánico en el kernel.

Epoll: utilizado en sistemas kernel Linux versión 2.6 y posteriores.

/dev/poll: utilizado en Solaris 7 11/99, HP/UX 11.22 (eventport), IRIX 6.5.15 y Tru64 UNIX 5.1A.

Eventport: utilizado en Solaris 10. Para evitar fallos del kernel, es necesario instalar parches de seguridad.

)

5. Workers_connections 65535;

El número máximo de conexiones permitidas por cada proceso. En teoría, el número máximo de conexiones por servidor nginx es Workers_processes*. conexiones_trabajadores.

6. keepalive_timeout 60;

tiempo de espera de keepalive.

7. client_header_buffer_size 4k;

El tamaño del búfer del encabezado de solicitud del cliente. Esto se puede configurar de acuerdo con el tamaño de paginación del sistema. Generalmente, el tamaño de un encabezado de solicitud no excederá. 1k, pero dado que la paginación general del sistema es mayor que 1k, el tamaño de paginación se establece aquí.

El tamaño de paginación se puede obtener con el comando getconf PAGESIZE.

[root@web001 ~]# getconf PAGESIZE

4096

Pero también hay casos en los que client_header_buffer_size supera los 4k, pero el valor de client_header_buffer_size debe establecerse en "tamaño de paginación del sistema" "Un múltiplo integral de ".

8. open_file_cache max=65535 inactive=60s;

Esto especificará el caché para los archivos abiertos. No está habilitado de forma predeterminada. Se recomienda el número máximo de cachés. para ser coherente con la cantidad de archivos abiertos, inactivo se refiere a cuánto tiempo no se solicita el archivo antes de que se elimine el caché.

9. open_file_cache_valid 80s;

Esto se refiere a la frecuencia con la que se verifica la información válida almacenada en caché.

10. open_file_cache_min_uses 1;

El número mínimo de usos del archivo dentro del tiempo del parámetro inactivo de la instrucción open_file_cache. Si se excede este número, el descriptor del archivo siempre se abre en. el caché, como arriba. Por ejemplo, si un archivo no se usa una vez dentro del tiempo inactivo, se eliminará.

2. Respecto a la optimización de los parámetros del kernel:

net.ipv4.tcp_max_tw_buckets = 6000

El número de tiempo de espera, el valor predeterminado es 180000.

net.ipv4.ip_local_port_range = 1024 65000

El rango de puertos que el sistema permite abrir.

net.ipv4.tcp_tw_recycle = 1

Habilita el reciclaje rápido en tiempo de espera.

net.ipv4.tcp_tw_reuse = 1

Habilitar reutilización. Permite reutilizar los sockets TIME-WAIT para nuevas conexiones TCP.

net.ipv4.tcp_syncookies = 1

Habilite las cookies SYN Cuando la cola de espera SYN se desborde, habilite las cookies para manejarla.

net.core.somaxconn = 262144

El trabajo pendiente de la función de escucha en la aplicación web limitará el net.core.somaxconn del parámetro del kernel a 128 de forma predeterminada, mientras que el NGX_LISTEN_BACKLOG definido por nginx tiene como valor predeterminado 128. 511, por lo que es necesario ajustar este valor.

net.core.netdev_max_backlog = 262144

El número máximo de paquetes que se permite poner en cola cuando cada interfaz de red recibe paquetes más rápido de lo que el kernel puede procesarlos.

net.ipv4.tcp_max_orphans = 262144

El número máximo de sockets TCP en el sistema que no están asociados con ningún identificador de archivo de usuario. Si se excede este número, la conexión huérfana se restablecerá inmediatamente y se imprimirá un mensaje de advertencia. Este límite es sólo para evitar ataques DoS simples. No puede confiar demasiado en él ni reducir artificialmente este valor. Debe aumentar este valor (si agrega memoria).

net.ipv4.tcp_max_syn_backlog = 262144

El número máximo de solicitudes de conexión registradas que aún no han recibido confirmación del cliente. Para sistemas con 128 M de memoria, el valor predeterminado es 1024 y para sistemas con poca memoria, es 128.

net.ipv4.tcp_timestamps = 0

Las marcas de tiempo pueden evitar el ajuste del número de secuencia. Un enlace de 1 Gbps definitivamente encontrará números de secuencia que se han utilizado antes. La marca de tiempo permite que el núcleo acepte dichos paquetes "anormales". Es necesario apagarlo aquí.

net.ipv4.tcp_synack_retries = 1

Para abrir una conexión con el par, el kernel necesita enviar un SYN con un ACK en respuesta al SYN anterior. Este es el segundo apretón de manos del llamado apretón de manos de tres vías. Esta configuración determina la cantidad de paquetes SYN ACK enviados antes de que el kernel abandone la conexión.

net.ipv4.tcp_syn_retries = 1

El número de paquetes SYN enviados antes de que el núcleo deje de establecer la conexión.

net.ipv4.tcp_fin_timeout = 1

Si el extremo local solicita cerrar el socket, este parámetro determina cuánto tiempo permanece en el estado FIN-WAIT-2. El interlocutor puede cometer errores y no cerrar nunca la conexión, o incluso bloquearse inesperadamente. El valor predeterminado es 60 segundos. 2.2 El valor habitual para el kernel es 180 segundos. Puede presionar esta configuración, pero recuerde que incluso si la máquina es un servidor WEB con poca carga, existe el riesgo de desbordamiento de memoria debido a una gran cantidad de sockets FIN. -WAIT -2 es menos peligroso que FIN-WAIT-1 porque solo puede consumir hasta 1,5 K de memoria, pero su vida útil es más larga.

net.ipv4.tcp_keepalive_time = 30

Cuando keepalive está habilitado, la frecuencia con la que TCP envía mensajes de keepalive. El valor predeterminado es 2 horas.

3. A continuación se publica una configuración completa de optimización del kernel:

vi /etc/sysctl.conf En CentOS5.5, todo el contenido se puede borrar y reemplazar directamente con el siguiente contenido:

net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 68719476736

kernel.shmall = 4294967296

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.tcp_sack = 1

net.ipv4.tcp_window_scaling = 1

net.ipv4.tcp_rmem = 4096 87380 4194304

net.ipv4.tcp_wmem = 4096 16384 4194304

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.core.netdev_max_backlog = 262144

net.core.somaxconn = 262144

net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_max_syn_backlog = 262144

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net .ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_fin_timeout = 1

net.ipv4.tcp_keepalive_time = 30

net.ipv4.ip_local_port_range = 1024 65000

p>

Para que la configuración surta efecto inmediatamente, use el siguiente comando:

/sbin/sysctl -p

IV. optimización del número de conexiones del sistema

El valor predeterminado de archivos abiertos y procesos máximos de usuario en Linux es 1024

#u

limit -n

1024

#ulimit –u

1024

Descripción del problema: el servidor solo permite abrir 1024 archivos en Al mismo tiempo, procesa 1024 procesos de usuario.

Utilice ulimit -a para ver todos los valores límite del sistema actual y utilice ulimit -n para ver el número máximo actual de archivos abiertos.

El Linux recién instalado solo tiene 1024 de forma predeterminada. Cuando se utiliza como servidor con una carga pesada, es fácil encontrar un error: demasiados archivos abiertos. Por lo tanto, es necesario hacerlo más grande.

Solución:

Utilice ulimit –n 65535 para modificarlo inmediatamente, pero no será válido después de reiniciar. (Tenga en cuenta que ulimit -SHn 65535 es equivalente a ulimit -n 65535, -S se refiere a suave y -H se refiere a duro)

Hay tres métodos de modificación:

1. En /etc/ Agregue una línea ulimit -SHn 65535 a rc.local

2. Agregue una línea ulimit -SHn 65535 a /etc/profile

3. etc/security/limits.conf Añadido:

* soft nofile 65535

* hard nofile 65535

* soft nproc 65535

* hard nproc 65535

¿Cuál usar específicamente? El primer método no tiene efecto en CentOS, el tercer método tiene efecto y el segundo método tiene efecto en Debian

# ulimit -n

65535

# ulimit -u

65535

Nota: El comando ulimit en sí tiene configuraciones suaves y duras Agregar -. H para establecerlo de forma estricta. Agregar -S significa que el límite suave se muestra de forma predeterminada.

El límite suave se refiere al valor de configuración vigente para el sistema actual. Los usuarios normales pueden reducir el valor del límite estricto. Pero no se puede aumentar. El límite suave no se puede establecer por encima del límite estricto. Solo el usuario root puede aumentar el valor del límite estricto.

5. El siguiente es un archivo de configuración de nginx simple:

usuario www www

worker_processes 8

worker_cpu_affinity 00000001 00000010 00000100. 00001000 00010000 00100000

01000000;

error_log /www/log/nginx_error.log crit;

pid /usr/local/nginx/nginx.pid;

worker_rlimit_nofile 204800;

eventos

{

usar epoll;

worker_connections 204800;

}

p_level 2;

texto gzip_types/aplicación simple/texto x-javascript/aplicación css/xml;

gzip_vary activado;

servidor

{

escucha 8080;

nombre_servidor backup.aiju.com;

índice index.php index.htm ;

raíz /www/html/;

ubicación /status

{

stub_status activado;

}

ubicación ~ .*\.(php|php5)?$

{

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

incluye fcgi.conf;

}

ubicación ~ .*\.(gif|jpg|jpeg|png|bmp|swf |js|css)$

{

expira 30 días;

}

log_format acceso '$remote_addr -- $remote_user [$ time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" $http_x_forwarded_for';

access_log /www /log/access.log acceso;

}

}