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 section, http 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 module, event 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 sectiony server sectionpara en esta área.
El location section, server 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_nodelayy tcp_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 4 y 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 gzip, gzip_comp_levely gzip_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 1y 9, puede establecer el nivel de compresión en 2o 3.
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 server, locationy 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_timeouty keepalive_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 errory accessregistraremos 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 syslogo stderr. 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_zoney limit_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_conny limit_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_timeouty client_header_timeoutpara controlar cuánto tiempo esperará Nginx para las escrituras de client bodyy client 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.