Skip to content

208 servicios web nginx

Nginx fue creado para ser simple y eficaz, el principal objetivo es tener un buen rendimiento ante una alta tasa de peticiones.

Nginx es un servidor de tipo asíncrono, En modo asíncrono, un mismo proceso gestiona simultáneamente varios clientes, lo que limita el consumo de memoria y mejora el tiempo de respuesta

208.4 Implementando Nginx como servidor web y como proxy inverso

Configuración

El archivo de configuración nginx.conf se encuentra generalmente en /etc/nginx

Algunas directivas están integradas en contenedores para que su ámbito de aplicación sea limitado.

directiva1 valor1 ; 
directiva2 valor2 ; 
# Comentario 
Bloque1 {   
  directiva3 valor3 ;  
  directiva4 valor4 ;  
  ...   
}  

Las siguientes directivas definen algunos parámetros generales y deberían estar en cualquier configuración Nginx.

user Nombre Grupo Designa la cuenta de servicio propietario y el grupo asociado a los procesos Nginx.
worker_processes Número Número de procesos de trabajo. El valor recomendado es de uno por procesador. Auto detecta el numero de procesadores.
include RutaArchivo Indica un archivo de configuración anexo que se integra en el archivo de configuración.

Un archivo de configuración mínimo de nginx en modo servidor http

user  nginx nginx; 
worker_processes  2;
events { 
   worker_connections  1024; 
} 
http { 
    include /etc/nginx/mime.types; 
    index index.html index.htm; 
    server { 
        listen 80; 
        server_name localhost; 
        root  /usr/share/nginx/html; 
    } 
}

Reglas de sintaxis

  • Distinción entre mayúsculas y minúsculas: la mayor parte de estas directivas se deben indicar en minúsculas.
  • Separador de palabras para una directiva: espacio(s) o tabulación(es). Si una cadena de caracteres contiene caracteres especiales (espacio, llave o punto y coma), hay que ponerla entre comillas simples o dobles.
  • Una directiva siempre termina con un punto y coma.
  • Un comentario se escribe comenzando con una almohadilla.
  • Un bloque se delimita con una llave de apertura y una llave de cierre. Las sangrías, mediante espacios o tabulaciones, son opcionales (pero se aconseja para una mejor legibilidad).

Es preciso validar la sintaxis del archivo de configuración para evitar errores. ( si hay un error de sintaxis el servicio no se iniciara ni se detendrá )

nginx -t

Diferencias en Debian

Las distribuciones Debian o Ubuntu configuran Nginx por defecto utilizando diferentes subdirectorios para los servidores virtuales. En el directorio /etc/nginx, se crean dos directorios: sites-available y sites-enabled.

include /etc/nginx/sites-enabled/*;

Para organizar los diferentes servidores virtuales, basta con crear un archivo de configuración por servidor virtual en el directorio sites-available. Para activar un servidor virtual, habrá que crear en el directorio sites-enabled un enlace a ese archivo de configuración. Para desactivarlo, habrá que eliminar el enlace.


En producción el servicio se arranca con el script de servicios, pero en modo pruebas es recomendable utiklizar el programa de Nginx.

nginx -s quit   # parar servicio
nginx -s stop   # parar servicio
nginx -s reload # reiniciar configuracion

Módulos

El servidor web Nginx tiene una estructura modular, los módulos de Nginx son estáticos y se deben especificar en la compilación del ejecutable. Esta elección está motivada por el rendimiento y la simplicidad del código. Si instala Nginx utilizando paquetes binarios, debe comprobar que contienen todos los módulos que necesite.

nginx -V    # ver lista de modulos integrados y opcione de compilación

Gestión de recursos

El servidor Nginx generalmente tiene un mejor rendimiento que Apache y consume menos recursos de memoria. Su arquitectura se concibió para ello. sobre todo gracias a su gestión de las entradas/salidas y al hecho de que un proceso pueda gestionar simultáneamente n conexiones.

Se recomienda tener tantos procesos de trabajo como procesadores. El número se configura mediante la directiva general worker_processes.

worker_processes  2; 
worker_processes  auto; # tantos procesos como procesadores 


root     10271     1  0 17:37 ?        00:00:00 nginx: master 
process /usr/sbin/nginx -c /etc/nginx/nginx.conf 
nginx    10272 10271  0 17:37 ?        00:00:00 nginx: worker process 
nginx    10274 10271  0 17:37 ?        00:00:00 nginx: worker process

El número máximo de conexiones simultáneas por proceso de trabajo se define mediante la directiva worker_connections del bloque events:

events { 
    worker_connections  1024; # conexiones simultáneas por proceso de trabajo.
}

Hosts Virtuales

Cada host virtual tendrá sus elementos de configuración específicos en un bloque server. Si un servidor Nginx gestiona varios hosts virtuales, se podrá configurar uno de ellos como servidor por defecto.

Ejemplo configuración básica en IP/puerto

server { 
  listen 80 default; 
  server_name localhost; 
  root  /usr/share/nginx/html/public; 
  } 

server { 
  listen 8080; 
  server_name localhost; 
  root  /usr/share/nginx/html/admin; 
  }

Ejemplo configuración básica en nombre de host

server {  
    listen 80;  
    server_name www.conta.masoc.com;  
    oot  /usr/share/nginx/html/public/conta;  
}  
server {  
    listen 80;  
    server_name www.marketing.masoc.com;  
    root  /usr/share/nginx/html/public/mkg;  
}  

Filtros de URI

Este mecanismo permite gestionar tanto directorios como tipos de archivos. Por ejemplo, se puede asociar restricciones de acceso a ciertas carpetas de un sitio virtual, redirigir las peticiones de los archivos PHP a un servidor remoto o comprimir sobre la marcha archivos de tipo imagen de un servidor virtual concreto.

server {  
        listen       80 ;  
        server_name localhost;  
        root   /usr/share/nginx/html;  
        location = / {  
            index index_root.html;  
        }  
        location /string {  
            index index_string.html;  
        }  
        location ~ reg/$ {  
            index index_reg.html;  
        }  
}

Sintaxis

location Expresión_Selection { 
Directivas 
}

location = Cadena   #  corresponde exactamente a la cadena de caracteres
location Cadena     # comienza por la cadena de caracteres especificada.
location ~ Expresión regular    #  expresión regular (con distinción de mayúsculas).
location ~* Expresión regular   #  expresión regular (sin distinción de mayúsculas).

Prioridades

  • Ubicación con el operador =
  • Ubicación con cadenas de caracteres
  • Ubicación con expresión regular

Restricción de acceso a usuarios

Control por IP

utiliza el módulo ngx_http_access que viene de forma predeterminada en el núcleo. Se utilizan dos directivas, allow y deny, que respectivamente permiten o prohíben el acceso a los elementos del bloque en el que están definidos.

Puede haber varias en un mismo bloque. En este caso se leen en el orden del archivo de configuración, y es la primera la que se aplica en el cliente.

Como en todas las directivas, las que están en un bloque ocultan las de bloques de nivel más alto.

http {  
        include       /etc/nginx/mime.types;  
        index index.html index.htm;  
        allow 127.0.0.1;  
        allow 192.168.56.1;  
        deny 10.0.2.3;  
        allow 10.0.2.0/24;  
        deny all;  
        server {  
          listen 80;  
          server_name www.conta.masoc.com;  
          root  /usr/share/nginx/html/public/conta;  
          allow 10.0.1.0/24;  
          deny all;  
          }  
}

Una directiva allow sola en un bloque no tiene sentido. De hecho, autoriza la dirección indicada, pero, sin directiva deny, el resto de las direcciones no están prohibidas.

Control por autentificación local

Utiliza el módulo ngx_http_auth_basic que viene de forma predeterminada en el núcleo.

htpasswd -c archivo nombre_usuario  # creación primer usuario ( -c crea el archivo )
htpasswd archivo nombre_usuario     # añadir cuenta
htpasswd -D archivo nombre_usuario  # eliminar usuario

Ejemplo de configuración

http { 
        include /etc/nginx/mime.types; 
        index index.html index.htm; 

        server { 
          listen 80; 
          server_name www.conta.masoc.com; 
          root  /usr/share/nginx/html/public/conta; 
          auth_basic "Sitio confidencial"; 
          auth_basic_user_file /usr/share/nginx/mdp/htpasswd; 
        }  
      }

Configuración SSL

Utiliza el módulo opcional SSL, que se debe incluir en la compilación con la opción --with-http_ssl_module. Este módulo depende de la biblioteca OpenSSL, que debe instalarse previamente en el sistema.

server { 
  listen 443 ssl ; 
  server_name www.conta.masoc.com; 
  ssl_certificate /usr/share/nginx/ssl/cert.pem; 
  ssl_certificate_key /usr/share/nginx/ssl/cert.key; 
  root  /usr/share/nginx/html/public/conta; 
  }

Para optimizar el rendimiento del servidor en modo SSL, se pueden añadir directivas específicas en el bloque server:

keepalive_timeout  70; # Activa el modo de mantenimiento de conexión y fija el time-ou
ssl_session_cache   shared:SSL:10m; # Caché de gestión de sesiones activado
ssl_session_timeout 10m;    # Time-out de sesión de 10 minutos.

Reverse proxy

Un reverse proxy HTTP es un servidor HTTP que recibe las peticiones de los clientes y las envía a uno o varios servidores HTTP.

  • Hacer que servidores HTTP situados en la red interna de la empresa sean accesibles desde el exterior
  • Servidor de caché
  • Reparto de carga (load balancing): el reverse proxy puede gestionar un pool de servidores HTTP de aplicaciones y repartir las consultas de los clientes

La directiva proxy_pass permite indicar a Nginx hacia que servidor debe redirigir una petición. La sintaxis completa es:

# proxy_pass Protocolo://Host[:Puerto][/URI] 
proxy_pass http://10.0.0.2;
proxy_pass https://www.masoc.local;
proxy_pass http://127.0.0.1:8080;

# Redirección al servidor remoto, sustituyendo /info/ en la URI por /externo/.
location /info/ { 
proxy_pass http://www.masoc.local/externo/; 
}

Para redirigir solo las peticiones de los scripts PHP (archivo con sufijo .php, .php3, .php4, .php5, etc.) a un servidor remoto:

http { 
    include /etc/nginx/mime.types; 
        index index.html index.htm; 
        server { 
          listen 80 default; 
          server_name beta; 
          root  /usr/share/nginx/html/public; 
          location ~* \.php.*$ { 
             proxy_pass http://www.local; 
          } 
        } 
}

try_files primero se puede intentar servir localmente las peticiones y a continuación, en caso de fallo, redirigir la petición a un servidor destino.

Cualquier petición se buscará a partir de la raíz del servidor. Si no se encuentra el elemento correspondiente, se pone el sufijo / a la URI. Si tampoco se encuentra, se redirige la petición al bloque de ubicación llamado destino,

http {  
    include /etc/nginx/mime.types;  
    index index.html index.htm;  
    server {  
        listen 80 default;  
        server_name beta;  
        root  /usr/share/nginx/html/public;  
        location @destino {  
            proxy_pass http://www.local;  
        }  
        location / {  
            try_files $uri $uri/ @destino;  
        }  
    }  
}

La directiva fastcgi_pass, permite asociar un bloque de ubicación a una redirección hacia un servidor de scripts remoto. De nuevo, esto permite tratar los elementos estáticos en local por Nginx y redirigir las peticiones dinámicas a un servidor de destino.

http { 
    include /etc/nginx/mime.types; 
    index index.html index.htm; 
    server { 
        listen 80 default; 
        server_name beta; 
        root  /usr/share/nginx/html/public; 
        location @dyn { 
            fastcgi_pass www.local; 
        } 
        location / { 
            try_files $uri $uri/ @dyn; 
        } 
    } 
}