Beruflich Dokumente
Kultur Dokumente
Tema 2.2
1
Tema 2.2. El servidor Web Nginx
Nginx es un servidor web muy ligero. Además de servir http, puede actuar como proxy y
como balanceador de carga. Es un software libre y de código abierto y es
multiplataforma, existiendo versiones para la mayoría de los sistemas operativos: Unix,
Linux, Windows, … Cuenta también con una versión comercial llamada Nginx plus.
La principal ventaja de Nginx como servidor web es que consume muchos menos
recursos al servir contenido estático, y esto lo convierte en una excelente opción para
funcionar como proxy inverso o como balanceador de carga para otros servidores como
Apache, optimizando la entrega de contenidos. Nginx usa mucha menos memoria que
Apache, y puede manejar aproximadamente cuatro veces más solicitudes por segundo.
Este aumento de rendimiento viene con un costo de disminuida flexibilidad.
Como hemos comentado, Nginx es mejor para servir contenido estático que dinámico.
Si queremos contenido dinámico lo tenemos que hacer con un CGI, por ejemplo, en el
caso de PHP debemos hacerlo con php_rpm. Un CGI es un mecanismo estandarizado
de comunicación entre el servidor web y una aplicación externa. En este caso se utiliza
para ampliar la funcionalidad del servidor a través de la comunicación con componentes
adicionales.
https://nginx.org/en/docs/
2
Tema 2.2. El servidor Web Nginx
2 Instalación de Nginx.
sudo aptget install nginx
En este punto, ya tendríamos el servidor instalado. Para comprobar que el servidor se
está ejecutando y está a la escucha en el puerto correspondiente (80 por defecto), bastará
con abrir el navegador y escribir localhost. Se debería ver la página por defecto de
Nginx.
3 Configuración de Nginx
El fichero de configuración determina como se va a comportar Nginx y sus módulos.
El fichero de configuración principal se llama nginx.conf y se encuentra en el directorio
/etc/nginx. Desde este fichero se pueden incluir todos los ficheros de configuración
auxiliares que deseemos utilizando la directiva include.
Directivas. Constan de un nombre, seguido por parámetros y terminan con un
punto y coma. (OJO el punto y coma es necesario)
3
Tema 2.2. El servidor Web Nginx
Listen 80;
Server_name localhost
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
Contextos. Un contexto es un bloque que puede contener dentro otros bloques,
como por ejemplo: events, http, server, location…
server {
location / {
root /data/www;
}
location /images/ {
root /data;
}
}
La organización del fichero se hace de acuerdo con la siguiente estructura:
user nombreusuario nombregrupo;
user nombreusuario;
4
Tema 2.2. El servidor Web Nginx
o Error_log. Indica la ubicación de los archivos de registro de errores. Su
sintaxis es:
error_log ruta level;
donde level podría tomar los valores: debug, info, notice, warn, error y
crit.
Si se quiere desactivar el registro de errores, debemos enviar los errores a
la ruta /dev/null.
Puede usarse en los contextos main, server, http y location.
Es una buena práctica tener un error log separado para cada server, ya
que ayuda a reducir el tamaño de los ficheros logs y hace más fácil su
gestión
El contexto http reside en el contexto main. Se utiliza para definir las directivas
y bloques relacionados con la función de Nginx como servidor web
El contexto server reside dentro de http. Define la configuración para un virtual
host (Son equivalente al VirtualHost de Apache). Entre las directivas más
importantes que incluye se encuentran la directiva listen, la directiva
server_name y la directiva root. Se pueden especificar todos los bloques server
que queramos. Nginx elegirá que server procesar en función del puerto de
escucha y del server_name.
o La directiva listen establece el puerto del sitio web.
o La directiva server_name establece un nombre para un virtual host.
o La directiva root establece el directorio raíz para una petición.
Por ejemplo, con la siguiente configuración, una petición en el navegador
a localhost:8080, retornaría el index.html del directorio
/home/nginx/public_html.
5
Tema 2.2. El servidor Web Nginx
server {
listen 8080;
root /home/nginx/public_html;
}
Al igual que hacíamos en Apache, es una buena práctica crear para cada server,
un fichero de configuración individual. Nos vamos a encontrar con la misma
estructura de carpetas y filosofía que en Apache:
Sitesavailable. Para almacenar los ficheros de configuración de todos
nuestros sitios.
Sitesenable. Para almacenar los enlaces de aquellos sitios web que se
encuentren activos en un momento dado. Para crear un enlace al fichero
que queramos, utilizaremos el comando:
ln s /etc/nginx/sitesavailable/fichero /etc/nginx/sites/enable/fichero
El contexto location puede ir dentro de server o de otro location. Permite definir
un grupo de ajustes que son aplicados a ciertas secciones de un sitio web.
Especificar el parámetro SSL en la directiva Listen, o añadir la directiva ssl con
el valor on.
Especificar la ruta de los ficheros con la clave privada y el certificado en las
directivas ssl_certificate y ssl_certificate_key.
server {
listen 443;
server_name training.secure.com;
error_log logs/secure.error.log;
ssl on;
ssl_certificate /etc/nginx/certs/nginxtraining.crt;
ssl_certificate_key /etc/nginx/certs/nginxtraining.key;
}
6
Tema 2.2. El servidor Web Nginx
sudo aptget install phpfpm phpmysql
nano /etc/php/7.0/fpm/php.ini
cgi.fix_pathinfo=0
De no hacerlo así, estaremos permitiendo que en el caso de no encontrar el fichero PHP
solicitado, se ejecute el archivo más cercano que se pudiera encontrar.
Una vez modificado el fichero de configuración, reiniciaremos el componente con el
comando:
systemctl restart php7.0fpm
7
Tema 2.2. El servidor Web Nginx
En primer lugar, necesitamos agregar index.php como el primer valor de nuestra
directiva index.
index index.php index.html index.htm;
Para el procesamiento real de PHP, solo necesitamos añadir o descomentar un
segmento del archivo que maneja las solicitudes de PHP.
location ~ \.php$ {
include snippets/fastcgiphp.conf;
fastcgi_pass unix:/run/php/php7.0fpm.sock;
}
También hay que añadir o quitar los comentarios del bloque que trata con
archivos .htaccess. Nginx no procesa estos archivos. Si alguno de estos archivos
encuentra la forma de llegar a un documento del root, no deben ser servidos a
los visitantes.
location ~ /\.ht {
deny all;
}
1. Creamos el fichero de error dentro de nuestro sitio web y lo referenciamos en la
directiva error_page para que cuando ocurra un error 404, sea la página servida:
error_page 404 /404.html;
2. Aunque no sea estrictamente necesario, es una buena práctica impedir que los
usuarios referencien directamente el fichero de error en su navegador. Para ello,
creamos una sección para el fichero e indicamos que solamente puede ser
invocado internamente.
location /404.html {
internal;
}
8
Tema 2.2. El servidor Web Nginx
Sin embargo, se pueden realizar configuraciones en las que se combinan los dos
servidores para conseguir un mejor rendimiento. Una de ellas, utiliza Nginx como
servidor estático en el frontend y Apache para el procesamiento dinámico en backend.
server {
listen 80;
root /var/www/html/sitioEjemplo;
index index.php index.html index.htm;
server_name www.ejemplo.com;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_set_header XRealIP $remote_addr;
proxy_set_header XForwardedFor $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
location ~ /\.ht {
deny all;
}
}
9
Tema 2.2. El servidor Web Nginx
El bloque:
location ~ \.php$ {
proxy_set_header XRealIP $remote_addr;
proxy_set_header XForwardedFor $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
Redirige todas las peticiones que le lleguen al servidor Nginx que terminen en .php al
servidor que le indicamos en proxy_pass. Proxy_pass establece el protocolo y la
dirección del servidor al que le reenviamos la petición.
Proxy_set_header permite redefinir o añadir campos a la cabecera de la petición HTTP
que se le hace al servidor al que redirijamos:
XForwardedFor: es un método común para identificar la dirección IP origen
del cliente que se conecta a un servidor web a través de un proxy HTTP.
XRealIP: contiene la IP del cliente que inicia la petición, y se ha establecido el
valor de la variable $remote_addr con la idea de que al servidor destino le llegue
la IP del cliente y no la del proxy HTTP. Si no se hubiese modificado este dato
en la cabecera, la IP que recibiría el servidor web objetivo siempre sería la del
proxy HTTP.
Host: Al igual que la anterior cabecera, establecemos el valor con el contenido
de la variable $host, es decir, el nombre de host que especificó el cliente.
aptget install apache2
Como nos interesa que Apache sólo responda en el puerto 8080 desde las peticiones
hechas desde nuestra máquina, cambiamos la configuración del fichero ports.conf y
dejamos como única línea activa la siguiente:
Listen 127.0.0.1:8080
10
Tema 2.2. El servidor Web Nginx
<VirtualHost *:8080>
ServerName www.ejemplo.com
DocumentRoot /var/www/html/sitioEjemplo
….
</VirtualHost>
4.3 Finalizando
Una vez que tengamos habilitados nuestros ficheros de configuración, tanto de Nginx
como de Apache, sólo nos restará reiniciar los servidores y realizar las pruebas
oportunas:
11