0

Configuración de Nginx para el Performance y seguridad

Un servidor web en un entorno de producción es diferente de un servidor web en un entorno de prueba en términos de rendimiento, seguridad, etc.

De forma predeterminada, siempre hay un ajuste de configuración listo para usar para un servidor web Nginx una vez que lo ha instalado correctamente. Sin embargo, la configuración predeterminada no es lo suficientemente buena para un entorno de producción. Por lo tanto, nos centraremos en cómo configurar Nginx para que funcione mejor durante picos de tráfico normales y pesados, y cómo protegerlo de los usuarios que pretenden abusar de él.

Si no ha instalado Nginx en su máquina, puede comprobar cómo hacerlo aquí. Le muestra cómo instalar Nginx en una plataforma Unix. Elija instalar Nginx a través de los archivos fuente porque los Nginx prediseñados no vienen con algunos de los módulos utilizados en este tutorial.

Requisitos

Debe tener lo siguiente instalado en su máquina y asegúrese de ejecutar este tutorial en cualquier plataforma basada en Debian, como Ubuntu.

  • Ubuntu o cualquier otra plataforma basada en Debian
  • wget
  • Vim (editor de texto)

Además, debe ejecutar o ejecutar algunos comandos en este tutorial como usuario root a través del sudocomando.

Comprensión de la estructura de configuración de Nginx

En esta sección veremos lo siguiente:

  • Estructura de Nginx
  • Secciones como un evento, HTTP y correo
  • Sintaxis válida de Nginx

Al final de esta sección, comprenderá la estructura de la configuración de Nginx, el propósito o los roles de las secciones, así como también cómo definir directivas válidas dentro de las secciones.

El archivo de configuración completo Nginx tiene una estructura lógica que se compone de directivas agrupados en un número de secciones, tales como el event sectionhttp section,  mail sectiony así sucesivamente.

El archivo de configuración principal se encuentra en  /etc/nginx/nginx.conf  mientras que otros archivos de configuración se encuentran en  /etc/nginx.

Contexto principal

Esta sección o contexto contiene directivas fuera de secciones específicas como mail section.

Cualquier otro directivas tales como user  nginx;,  worker_processes  1;,   error_log  /var/log/nginx/error.log warn;  y  pid  /var/run/nginx.pidse pueden colocar dentro de la sección principal o contexto.

Pero algunas de estas directivas, como la worker_processestambién pueden existir en event section.

Secciones

Las secciones en Nginx definen la configuración de los módulos de Nginx.

Por ejemplo, http section  define la configuración para ngx_http_core moduleevent sectiondefine la configuración para  ngx_event_modulemientras que la sección de correo define la configuración para ngx_mail_module.

Puede consultar aquí para obtener una lista completa de las secciones en Nginx.

Directivas

Las directivas en Nginx se componen de un nombre de variable y una serie de argumentos como los siguientes:

El worker_processeses un nombre de variable mientras que autosirve como argumento.

worker_processes  auto;

Copiar

Las directivas terminan con un punto y coma como se muestra arriba.

Finalmente, el archivo de configuración de Nginx debe adherirse a un conjunto particular de reglas. Las siguientes son la sintaxis válida de la configuración de Nginx:

  • Las directivas válidas comienzan con un nombre de variable y luego siguen uno o más argumentos
  • Todas las directivas válidas terminan con un punto y coma  ;
  • Las secciones se definen con llaves  {}
  • Una sección se puede incrustar en otra sección
  • La configuración fuera de cualquier sección es parte de la configuración global de Nginx.
  • Las líneas que comienzan con el signo de almohadilla #son comentarios.

Ajuste de Nginx para el rendimiento

En esta sección, configuraremos Nginx para que funcione mejor durante el tráfico intenso y los picos de tráfico.

Veremos cómo configurar:

  • Trabajadores
  • Actividad de E / S de disco
  • Actividad de la red
  • Amortiguadores
  • Compresión
  • Almacenamiento en caché
  • Se acabó el tiempo

Aún así, dentro del entorno virtual activado, escriba los siguientes comandos para cambiar al directorio Nginx y enumerar su contenido.

cd nginx && ls

Copiar

Busque la carpeta conf. Dentro de esta carpeta está el nginx.confarchivo.

Usaremos este archivo para configurar Nginx

Ahora ejecute los siguientes comandos para navegar a la confcarpeta y abra el archivo nginx.confcon elvim editor

cd conf
sudo vim nginx.conf

Copiar

A continuación se muestra una captura de pantalla de cómo se nginx.confve el archivo por defecto.

Trabajadores

Para permitir que Nginx funcione mejor, debemos configurarlo workersen la sección de eventos. La configuración de los trabajadores de Nginx le permite procesar las conexiones de los clientes de manera eficaz.

Suponiendo que no ha cerrado el editor de vim, presione el ibotón en el teclado para editar el nginx.confarchivo.

Copie y pegue lo siguiente dentro de events sectioncomo se muestra a continuación:

events { 
    worker_processes    auto;
    worker_connections  1024;
    worker_rlimit_nofile 20960;
    multi_accept        on;  
    mutex_accept        on; 
    mutex_accept_delay  500ms; 
    use                 epoll; 
    epoll_events        512;  
}

Copiar

worker_processes: Esta directiva controla la cantidad de trabajadores en Nginx. El valor de esta directiva está configurado para autopermitir que Nginx determine la cantidad de núcleos disponibles, discos, carga del servidor y subsistema de red. Sin embargo, puede descubrir la cantidad de núcleos ejecutando el comando lscpuen la terminal.

worker_connections: Esta directiva establece el valor del número de conexiones simultáneas que puede abrir un trabajador. El valor predeterminado es 512pero lo configuramos 1,024para permitir que un trabajador acepte una conexión mucho más simultánea de un cliente.

worker_rlimit_nofile:Esta directiva está relacionada de alguna manera con worker_connections. Para manejar una gran conexión simultánea, lo configuramos en un valor alto.

multi_accept:  Esta directiva permite que un trabajador acepte muchas conexiones en la cola a la vez. Una cola en este contexto simplemente significa una secuencia de objetos de datos esperando ser procesados.

mutex_accept:Esta directiva está desactivada de forma predeterminada. Pero debido a que hemos configurado muchos trabajadores en Nginx, debemos activarlo como se muestra en el código anterior para permitir que los trabajadores acepten nuevas conexiones una por una.

mutex_accept_delay:  Esta directiva determina cuánto tiempo debe esperar un trabajador antes de aceptar una nueva conexión. Una vez que accept_mutexestá activado, se asigna un bloqueo de exclusión mutua a un trabajador durante un período de tiempo especificado por accept_mutex_delay. Cuando se acaba el plazo, el siguiente trabajador de la fila está listo para aceptar nuevas conexiones.

use:Esta directiva especifica el método para procesar una conexión desde el cliente. En este tutorial, decidimos establecer el valor en epollporque estamos trabajando en una Ubuntuplataforma. El epollmétodo es el método de procesamiento más efectivo para plataformas Linux.

epoll_events:  El valor de esta directiva especifica el número de eventos que Nginx transferirá al kernel.

E / S de disco

En esta sección, configuraremos la actividad de E / S asincrónica en Nginx para permitirle realizar una transferencia de datos efectiva y mejorar la efectividad del caché.

E / S de disco simplemente se refiere a operaciones de escritura y lectura entre el disco duro y la RAM. Haremos uso de la sendfile()función dentro del kernel para enviar archivos pequeños.

Puede hacer uso de las directivas http section,  location sectionserver sectionpara en esta área.

El location sectionserver sectionse puede incrustar o colocar dentro del http sectionpara que la configuración sea legible.

Copie y pegue el siguiente código dentro de la sección de ubicación incrustada dentro de la sección HTTP.

location /pdf/  {
   sendfile on; 
   aio      on; 
  }  

location /audio/ {  
    directio    4m
    directio_alignment 512  
}

Copiar

sendfile:  Para utilizar los recursos del sistema operativo, establezca el valor de esta directiva en on. sendfile transfiere datos entre descriptores de archivos dentro del espacio del kernel del sistema operativo sin enviarlos a los búferes de la aplicación. Esta directiva se utilizará para servir archivos pequeños.

directio:  Esta directiva mejora la eficacia de la caché al permitir que la lectura y la escritura se envíen directamente a la aplicación.  directioes una característica del sistema de archivos de todos los sistemas operativos modernos. Esta directiva se utilizará para servir archivos más grandes como videos.

aio:  Esta directiva habilita subprocesos múltiples cuando se configura onpara operaciones de escritura y lectura. El subproceso múltiple es un modelo de ejecución que permite que varios subprocesos se ejecuten por separado entre sí mientras comparten los recursos del proceso de alojamiento.

directio_alignment:  Esta directiva asigna un valor de tamaño de bloque a la transferencia de datos. Estaba relacionado con la directio  directiva.

Capa de red

En esta sección, haremos uso de directivas como tcp_nodelaytcp_nopushpara evitar que los paquetes pequeños esperen un período de tiempo específico de aproximadamente 200 milisegundos antes de enviarse a la vez.

Por lo general, cuando los paquetes se transfieren en ‘partes’, tienden a saturar la red con mucha carga. Entonces, John Nagle creó un algoritmo de almacenamiento en búfer para resolver este problema. El propósito del algoritmo de almacenamiento en búfer de Nagle es evitar que los paquetes pequeños saturen la red altamente cargada.

Copie y pegue el siguiente código dentro de la sección HTTP.

http {   

  tcp_nopush  on; 
  tcp_nodelay on;

  }

Copiar

tcp_nodelay:Esta directiva, por defecto, está deshabilitada para permitir que los paquetes pequeños esperen un período específico antes de enviarse de una vez. Para permitir que todos los datos se envíen a la vez, esta directiva está habilitada.

tcp_nopush:   Debido a que hemos habilitado la tcp_nodelaydirectiva, los paquetes pequeños se envían a la vez. Sin embargo, si aún desea hacer uso del algoritmo de almacenamiento en búfer de John Nagle, también podemos habilitar el tcp_nopushpara agregar paquetes entre sí y enviarlos todos a la vez.

Amortiguadores

Echemos un vistazo a cómo configurar búferes de solicitud en Nginx para manejar las solicitudes de manera efectiva. Un búfer es un almacenamiento temporal donde los datos se guardan durante un tiempo y se procesan.

Puede copiar lo siguiente en la sección del servidor.

server { 

   client_body_buffer_size 8k;
   client_max_body_size 2m; 
   client_body_in_single_buffer on;  
   client_body_temp_pathtemp_files 1 2;
   client_header_buffer_size  1m; 
   large_client_header_buffers 4 8k;

 }

Copiar

Es importante comprender qué hacen esas líneas de amortiguación.

client_body_buffer_size:  Esta directiva establece el tamaño del búfer para el cuerpo de la solicitud. Si planea ejecutar el servidor web en sistemas de 64 bits, debe establecer el valor en 16k. Si desea ejecutar el servidor web en el sistema de 32 bits, establezca el valor en 8k.

client_max_body_size:Si tiene la intención de manejar cargas de archivos grandes, debe establecer esta directiva en al menos 2mo más. De forma predeterminada, está configurado en 1m.

client_body_in_file_only:Si ha desactivado la directiva client_body_buffer_sizecon el símbolo de hashtag  #y esta directiva client_body_in_file_onlyestá configurada, Nginx guardará los búferes de solicitud en un archivo temporal. No se recomienda para un entorno de producción.

client_body_in_single_buffer:  A veces, no todo el cuerpo de la solicitud se almacena en un búfer. El resto se guarda o se escribe en un archivo temporal. Sin embargo, si tiene la intención de guardar o almacenar el búfer de solicitud completo en un solo búfer, debe habilitar esta directiva.

client_header_buffer_size:  Puede utilizar esta directiva para establecer o asignar un búfer para los encabezados de solicitud. Puede establecer este valor en 1m.

large_client_header_buffers:Esta directiva se utiliza para establecer el número y el tamaño máximos para leer encabezados de solicitud grandes. Puede establecer el número máximo y tamaño de buffer para 8kcon precisión.

Compresión

Comprimir la cantidad de datos transferidos a través de la red es otra forma de garantizar que su servidor web funcione mejor. En esta sección, vamos a hacer uso de directivas como gzipgzip_comp_levelgzip_min_lengthen los datos de la compresa.

Pegue el siguiente código dentro del http sectioncomo se muestra a continuación:

http {  

  gzip on;
  gzip_comp_level  2;
  gzip_min_length  1000; 
  gzip_types  text/xml text/css; 
  gzip_http_version 1.1; 
  gzip_vary  on;  
  gzip_disable "MSIE [4-6] \."; 

}

Copiar

gzip:  Si desea habilitar la compresión, establezca el valor de esta directiva en on. Por defecto, está deshabilitado.

gzip_comp_level:  Puede hacer uso de esta directiva para establecer el nivel de compresión. Para no desperdiciar recursos de la CPU, no es necesario establecer el nivel de compresión demasiado alto. Entre 19, puede establecer el nivel de compresión en 23.

gzip_min_length:  Establezca la longitud de respuesta mínima para la compresión a través de content-length response header field. Puede configurarlo en más de 20 bytes.

gzip_types:Esta directiva le permite elegir el tipo de respuesta que desea comprimir. De forma predeterminada, el tipo de respuesta text/htmlsiempre está comprimido. Puede agregar otro tipo de respuesta text/csscomo se muestra en el código anterior.

gzip_http_version:  Esta directiva le permite elegir la versión HTTP mínima de una solicitud para una respuesta comprimida. Puede hacer uso del valor predeterminado que es 1.1.

gzip_vary:  Cuando la gzipdirectiva está habilitada, esta directiva agrega el campo de encabezado Vary:Accept Encoding  a la respuesta.

gzip_disabled:  Algunos navegadores como, por ejemplo Internet Explorer 6, no tienen soporte para gzip compression. Esta directiva hace uso del User-Agentcampo de encabezado de solicitud para deshabilitar la compresión para ciertos navegadores.

Almacenamiento en caché

Aproveche las funciones de almacenamiento en caché para reducir la cantidad de veces que se cargan los mismos datos varias veces. Nginx proporciona funciones para almacenar en caché metadatos de contenido estático a través de una open_file_cachedirectiva.

Puede colocar esta directiva dentro del serverlocationy la http sección.

http {  

open_file_cache max=1,000 inactive=30s; 
open_file_cache_valid 30s; 
open_file_cache_min_uses 4; 
open_file_cache_errors on; 

 }

Copiar

open_file_cache:  Esta directiva está deshabilitada de forma predeterminada. Habilítelo si desea implementar el almacenamiento en caché en Nginx. Esta directiva almacena metadatos de archivos y directorios comúnmente solicitados por los usuarios.

open_file_cache_valid:Esta directiva contiene información de respaldo dentro de la open_file_cachedirectiva. Puede usar esta directiva para establecer un período válido, generalmente en segundos, después del cual la información relacionada con archivos y directorios se vuelve a validar nuevamente.

open_file_cache_min_uses:  Nginx generalmente borra la información dentro de la open_file_cachedirectiva después de un período de inactividad basado en open_file_cache_min_uses. Puede utilizar esta directiva para establecer un número mínimo de acceso para identificar a qué archivos y directorios se accede de forma activa.

open_file_cache_errors:  Puede hacer uso de esta directiva para permitir que Nginx almacene en caché errores como “permiso denegado” o “no se puede acceder a este archivo” cuando se accede a los archivos. Por lo tanto, cada vez que un usuario accede a un recurso que no tiene el derecho a hacerlo, Nginx muestra el mismo informe de error “permiso denegado”.

Se acabó el tiempo

Configure el tiempo de espera mediante directivas como keepalive_timeoutkeepalive_requestspara evitar que las conexiones de larga espera desperdicien recursos.

En la sección HTTP, copie y pegue el siguiente código:

http {  

 keepalive_timeout  30s; 
 keepalive_requests 30;
 send_timeout      30s;

}

Copiar

keepalive_timeout: Mantenga las conexiones activas durante unos 30 segundos. El valor predeterminado es 75 segundos.

keepalive_requests: Configure una serie de solicitudes para mantenerlas activas durante un período de tiempo específico. Puede establecer el número de solicitudes en 20 o 30.

keepalive_disable: si desea deshabilitar la conexión keepalive para un grupo específico de navegadores, use esta directiva.

send_timeout: Establece un tiempo de espera para transmitir datos al cliente.

Configuración de seguridad para Nginx

Lo siguiente se centra únicamente en cómo configurar de forma segura un Nginx en lugar de una aplicación web. Por lo tanto, no veremos los ataques basados ​​en la web como la inyección SQL , etc.

En esta sección veremos cómo configurar lo siguiente:

  • Restringir el acceso a archivos y directorios
  • Configurar registros para monitorear actividades maliciosas
  • Prevenir ataques DDoS
  • Deshabilitar la lista de directorios

Restringir el acceso a archivos y directorios

Veamos cómo restringir el acceso a archivos y directorios confidenciales mediante los siguientes métodos.

Haciendo uso de la autenticación HTTP

Podemos restringir el acceso a archivos o áreas confidenciales que no están destinados a la visualización pública solicitando la autenticación de los usuarios o incluso de los administradores. Ejecute el siguiente comando para instalar una utilidad de creación de archivos de contraseña si no la ha instalado.

apt-get install -y apache-utils

Copiar

A continuación, cree un archivo de contraseña y un usuario utilizando la htpasswdherramienta como se muestra a continuación. La htpasswdherramienta la proporciona la apache2-utilsutilidad.

sudo  htpasswd  -c  /etc/apache2/ .htpasswd mike

Copiar

Puede confirmar si ha creado correctamente un usuario y una contraseña aleatoria a través del siguiente comando

cat  etc/apache2/ .htpasswd

Copiar

Dentro de la sección de ubicación, puede pegar el siguiente código para solicitar a los usuarios la autenticación mediante la auth_basic  directiva.

location /admin {  

 basic_auth "Admin Area"; 
 auth_basic_user_file /etc/apache2/ .htpasswd; 

}

Copiar

Haciendo uso de la directiva Allow

Además de la basic_authdirectiva, podemos hacer uso de la allowdirectiva para restringir el acceso.

Dentro de la sección de ubicación, puede usar el siguiente código para permitir que las direcciones IP especificadas accedan al área confidencial.

location /admin {  
 allow 192.168.34.12; 
 allow 192.168.12.34; 
}

Copiar

Configurar registros para monitorear actividades maliciosas

En esta sección, configuraremos erroraccessregistraremos para monitorear específicamente solicitudes válidas e inválidas. Puede examinar estos registros para averiguar quién inició sesión en un momento determinado, o qué usuario accedió a un archivo en particular, etc.

error_log:Le permite configurar el registro en un archivo en particular, como syslogstderr. También puede especificar el nivel de mensajes de error que desea registrar.

access_log:  Permite escribir la solicitud de los usuarios en el archivo. access.log

Dentro de la sección HTTP, puede usar lo siguiente.

http {  

  access_log  logs/access.log   combined; 
  error_log   logs/warn.log     warn;

}

Copiar

Prevenir DDOS

Puede proteger el Nginx de un ataque DDOS mediante los siguientes métodos:

Limitar las solicitudes de los usuarios 

Puede hacer uso de las directivas limit_req_zonelimit_reqpara limitar la velocidad de una solicitud enviada por los usuarios en minutos.

Agregue el siguiente código en la locationsección incrustada en la sección del servidor.

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;  

server {
 location /admin.html { 
   limit_req zone=one;
       }

}

Copiar

Limita el número de conexiones 

Puede hacer uso de las directivas limit_connlimit_conn_zonepara limitar la conexión a determinadas ubicaciones o áreas. Por ejemplo, el siguiente código recibe 15 conexiones de clientes durante un período específico.

El siguiente código irá a la location sección.

limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
   
    location /products/ {
        limit_conn addr 10;
       
    }
}

Copiar

Terminar conexiones lentas   

Puede hacer uso de directivas de tiempo de espera como client_body_timeoutclient_header_timeoutpara controlar cuánto tiempo esperará Nginx para las escrituras de client bodyclient header.

Agregue lo siguiente dentro de la server sección.

server {
    client_body_timeout 5s;
    client_header_timeout 5s;
}

Copiar

También sería una buena idea detener los ataques DDoS en el borde aprovechando las soluciones basadas en la nube como se menciona aquí .

Deshabilitar la lista de directorios

Puede hacer uso de la auto_indexdirectiva para evitar la lista de directorios como se muestra en el código siguiente. Debe establecerlo en el valor offpara deshabilitar la lista de directorios.

location / {  
 auto_index  off;
}

Copiar

Conclusión

Hemos configurado el servidor web Nginx para que funcione de forma eficaz y lo proteja del abuso excesivo en un entorno de producción. Si está utilizando Nginx para aplicaciones web orientadas a Internet, también debería considerar el uso de una CDN y una seguridad basada en la nube para un mejor rendimiento y seguridad.

calivent

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *