Configuración y Uso de Nginx para Servidores Web

Instalación de Nginx

Para instalar Nginx, primero asegúrate de tener las dependencias necesarias, como la librería PCRE, que es fundamental para el manejo de expresiones regulares en las directivas de reescritura.


# Instalación de dependencias
yum install pcre pcre-devel

# Descarga de Nginx (ejemplo con versión 1.4.2)
wget http://nginx.org/download/nginx-1.4.2.tar.gz
tar zxvf nginx-1.4.2.tar.gz
cd nginx-1.4.2

# Configuración e instalación
./configure --prefix=/usr/local/nginx
make && make install
   

Estructura de Directorios de Nginx

Una vez instalado en /usr/local/nginx, la estructura principal de directorios es la siguiente:

  • conf/: Contiene los archivos de configuración.
  • html/: Almacena los archivos web (document root).
  • logs/: Guarda los archivos de log.
  • sbin/: Contiene el ejecutable principal de Nginx.

Soporte para PathInfo

A diferencia de Apache, Nginx no soporta nativamente el modo PATH_INFO. Para habilitarlo, se requiere una configuración específica que capture la parte de la URL después de .php y la asigne a la variable PATH_INFO.

Configuración estándar para PHP:


location ~ \.php$ {
   root           html;
   fastcgi_pass   127.0.0.1:9000;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  $DOCUMENT_ROOT$fastcgi_script_name;
   include        fastcgi_params;
}
   

Configuración modificada para soportar PATH_INFO:


# Captura la parte de la URL después de .php y la asigna a PATH_INFO
location ~ \.php(.*)$ {
   root html;
   fastcgi_pass   127.0.0.1:9000;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  $DOCUMENT_ROOT$fastcgi_script_name;
   # Asigna el grupo capturado por los paréntesis a PATH_INFO
   fastcgi_param PATH_INFO $1;
   include        fastcgi_params;
}
   

En el ejemplo anterior, si la URL es index.php/usuarios/listar, la cadena /usuarios/listar será asignada a la variable PATH_INFO.

Reescritura de URL (Rewrite)

Nginx permite reescribir URLs, por ejemplo, para ocultar el archivo index.php en las peticiones a aplicaciones PHP.


location / {
    root   /ruta/a/tu/sitio; # Directorio raíz de tu sitio web
    index  index.html index.htm index.php;

    # Si el archivo o directorio solicitado no existe, reescribe la URL
    # para que apunte a index.php, pasando la URI original como parámetro.
    if ( !-e $uri ) {
         rewrite (.*)$ /index.php/$1 last; # 'last' para procesar la nueva URI internamente
    }
}
   

Nota: Es crucial añadir un espacio después de la directiva if.

Expresiones Regulares Comunes

A continuación, se detallan algunos metacaracteres comunes utilizados en expresiones regulares dentro de Nginx:

Carácter Descripción
\\ Escapa el siguiente carácter, tratándolo como literal o como parte de una secuencia especial.
^ Ancla la coincidencia al inicio de la cadena.
$ Ancla la coincidencia al final de la cadena.
* Coincide con el elemento anterior cero o más veces.
+ Coincide con el elemento anterior una o más veces.
? Coincide con el elemento anterior cero o una vez. Equivale a {0,1}.
. Coincide con cualquier carácter excepto salto de línea.
(pattern) Captura el patrón coincidente para su posterior uso (e.g., $1, $2).

Directiva try_files

La directiva try_files es una alternativa más eficiente y legible a las construcciones if y rewrite para ciertas tareas, como la gestión de archivos estáticos y la omisión de index.php.


location / {
   root /ruta/a/tu/proyecto; # Directorio raíz de tu proyecto
   index index.php index.html;

   # Intenta servir el archivo solicitado ($uri). Si no existe,
   # entonces sirve /index.php?uri=$uri.
   try_files $uri /index.php?$uri;
}
   

Proxy Inverso (Reverce Proxy)

Nginx puede actuar como proxy inverso para dirigir el tráfico a diferentes servidores backend. Esto es útil para servir contenido específico o para consolidar múltiples aplicaciones bajo un mismo punto de acceso.

Ejemplo: Servir diferentes dominios a distintos servidores internos.

Configuración para que a.com apunte al puerto 3000 de 192.168.138.38 y b.com al puerto 80 de 192.168.138.40:


server {
   listen 80;
   server_name a.com;

   location / {
       proxy_redirect off;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass http://192.168.138.38:3000;
   }
   access_log logs/a_com_access.log;
}

server {
   listen 80;
   server_name b.com;

   location / {
       proxy_redirect off;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass http://192.168.138.40:80;
   }
   access_log logs/b_com_access.log;
}
   

Clustering y Balanceo de Carga

Nginx es excelente para distribuir la carga de trabajo entre múltiples servidores backend, mejorando la disponibilidad y el rendimiento.

1. Definición de servidores upstream:


upstream mis_servidores {
   server 192.168.138.2:8080 weight=1 max_fails=2 fail_timeout=30s;
   server 192.168.138.3:8080 weight=1 max_fails=2 fail_timeout=30s;
   # 'weight' define la proporción de tráfico.
   # 'max_fails' y 'fail_timeout' configuran la tolerancia a fallos.
}
   

2. Configuración de la ubicación para el proxy:


location ~ \.(jpeg|jpg|png|gif) {
   # Utiliza el nombre definido en 'upstream' para dirigir el tráfico.
   proxy_pass http://mis_servidores;
   proxy_set_header X-Forwarded-For $remote_addr; # Mantiene la IP original del cliente.
}
   

Etiquetas: Nginx servidor web Proxy Inverso balanceo de carga pathinfo

Publicado el 7-26 22:32