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.
}