You are on page 1of 11

Tema 2.2.

El servidor Web Nginx

Tema 2.2

El servidor Web Nginx

1 EL SERVIDOR NGINX. CARACTERÍSTICAS GENERALES........................................................2


2 INSTALACIÓN DE NGINX.............................................................................................................3
2.1 INSTALACIÓN DE NGINX EN UBUNTU..............................................................................................3
3 CONFIGURACIÓN DE NGINX......................................................................................................3
3.1 CONFIGURAR UN SITIO HTTPS..........................................................................................................6
3.2 CONFIGURAR NGINX PARA USAR EL PROCESADOR PHP.................................................................6
3.2.1 Configurar el Procesador PHP.............................................................................................6
3.2.2 Configurar Nginx para usar el Procesador PHP..................................................................7
3.2.3 Configurar Nginx para usar nuestro propio fichero de error................................................7
4 EJEMPLO DE CONVIVENCIA DE NGINX Y APACHE............................................................8
4.1 CONTENIDO DEL FICHERO DE CONFIGURACIÓN DE NGINX..............................................................8
4.2 INSTALACIÓN Y CONFIGURACIÓN DE APACHE..................................................................................9
4.3 Finalizando....................................................................................................................................10

1
Tema 2.2. El servidor Web Nginx

1 El servidor Nginx. Características generales.


Hasta hace bien poco, Apache era el rey indiscutible en el mundo de los servidores web,
pero año tras año, la popularidad del servidor web Nginx ha ido en aumento y empresas
punteras de Internet como Facebook o WordPress lo utilizan, aunque sea parcialmente,
en sus portales.

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.

Podemos encontrar información y ayuda sobre el servidor Nginx en la siguiente página:

https://nginx.org/en/docs/

2
Tema 2.2. El servidor Web Nginx

2 Instalación de Nginx.

2.1 Instalación de Nginx en Ubuntu.


Dependiendo de la distribución Linux con la que estemos trabajando, deberemos utilizar
el   gestor   de   paquetes   adecuado.   En   el   caso   de  Ubuntu,   podemos   instalar  Nginx
fácilmente con: 

sudo apt­get 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.

Dentro   del   fichero   de   configuración   podemos   distinguir   los   diferentes   tipos   de


elementos:

 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

Podemos   encontrar   ayuda   sobre   todas   las   directivas   de  Nginx  en   la   página


oficial: http://nginx.org/en/docs/dirindex.html

 Bloques.   Contienen   múltiples   instrucciones   de   configuración.   Un  bloque


engloba las instrucciones que lo componen dentro de llaves {}

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:

 El   contexto  main  contiene  directivas  esenciales   para   el   funcionamiento   del


servidor Las  directivas  que se colocan en el fichero de configuración fuera de
cualquier  contexto  se considera que están en el  contexto  main. Algunas de las
directivas que pueden especificarse aquí son:

o User.   Permite   especificar   qué   usuario   y   opcionalmente   qué   grupo   se


utilizará para iniciar los procesos worker. Su sintaxis es:

 user nombreusuario nombregrupo;  

 user nombreusuario;

o Worker_processes.   Define   la   cantidad   de   procesos  worker.   Se   puede

4
Tema 2.2. El servidor Web Nginx

especificar   un   número   entero   o   el   valor  auto.   Por   defecto   se   crearán


tantos como cores tenga la CPU.

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  events  reside en el contexto  main. Se utiliza  para establecer  las


opciones con las que Nginx maneja las conexiones a nivel general. Por ejemplo,
la  directiva  worker_connections  4096;  define  la  cantidad  de  conexiones  que
puede manejar un proceso worker de forma simultánea.

 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:

 Sites­available. Para almacenar los ficheros de configuración de todos
nuestros sitios.

 Sites­enable. 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/sites­available/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.

Cada   vez   que   realicemos   un   cambio   en   la   configuración   del   servidor,   será


necesario reiniciar el servicio asociado. En caso de Ubuntu pondremos:

service nginx restart

3.1 Configurar un sitio https


Para habilitar SSL hay que hacer lo siguiente:

 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

3.2 Configurar Nginx para Usar el Procesador PHP


Puesto que  Nginx  no contiene procesamiento  PHP  nativo como otros servidores web,
tendremos que instalar php­fpm, que significa "fastCGI process manager". Le diremos a
Nginx que pase las solicitudes de PHP a este software para su procesamiento.

Aunque no tengamos la base de datos  MySQL  instalada, podemos agregar un paquete


adicional en el caso de que estuviéramos interesados, en que PHP pueda comunicarse
con el servidor de bases de datos:

sudo apt­get install php­fpm php­mysql

3.2.1 Configurar el Procesador PHP


Ahora tenemos nuestros componentes de  PHP  instalados, pero necesitamos hacer un
ligero cambio de configuración para hacer nuestra configuración más segura. Para ello,
editamos el fichero de configuración de php­fpm:

nano /etc/php/7.0/fpm/php.ini

A   continuación,   buscaremos   el   parámetro cgi.fix_pathinfo  y   lo   descomentaremos,


asignándole un valor de 0.

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.0­fpm

3.2.2 Configurar Nginx para usar el Procesador PHP


Ahora, que tenemos todos los componentes necesarios instalados. Lo único que faltaría
sería cambiar la configuración de aquellos sitios web que hagan uso de PHP. Para ello,
debemos modificar lo siguiente:

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/fastcgi­php.conf;
        fastcgi_pass unix:/run/php/php7.0­fpm.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;
    }

3.2.3 Configurar Nginx para usar nuestro propio fichero de error.


Tenemos que dar los siguientes pasos:

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

4 Ejemplo de convivencia de Nginx y Apache


Tanto Nginx como Apache son dos servidores web potentes y eficaces. Las razones de
la popularidad de cada servidor son claras: el poder de  Apache  y velocidad de  Nginx.
Sin   embargo,   ambos   servidores   tienen   inconvenientes:  Apache  consume   demasiada

8
Tema 2.2. El servidor Web Nginx

memoria  del servidor, mientras  que  Nginx  necesita  la ayuda de  php­fpm  o módulos


similares para servir contenido dinámico. 

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 front­end y Apache para el procesamiento dinámico en back­end.

4.1 Contenido del fichero de configuración de Nginx


La siguiente configuración permitirá usar  Nginx  como servidor  front­end  para nuestro
sitio web. Esta configuración establece un sistema por el cual todas las peticiones con
un final  .php  se redireccionan  al  back­end Apache  que deberá estar corriendo en el
puerto 8080. El resto de las peticiones serán atendidas por el servidor Nginx.

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   X­Real­IP     $remote_addr;
        proxy_set_header   X­Forwarded­For    $remote_addr;
        proxy_set_header   Host    $host;
        proxy_pass   http://127.0.0.1:8080;
         }

         location ~ /\.ht {
                deny all;
        }
}

La  directiva  try_files $uri $uri/ /index.php  se utiliza para verificar la existencia del


archivo o del directorio al que referencia el usuario en la uri. Si no existiera redirigiría a
índex.php. Si se quitara seguiría funcionando igual, aunque nuestro sitio no tendría el
comportamiento descrito anteriormente.

9
Tema 2.2. El servidor Web Nginx

El bloque:

location ~ \.php$ {
                    proxy_set_header   X­Real­IP   $remote_addr;
                 proxy_set_header   X­Forwarded­For    $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:

 X­Forwarded­For: 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.

 X­Real­IP: 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.

4.2 Instalación y configuración de Apache.


Con el servidor Nginx parado, instalamos el servidor Apache como vimos en el tema
anterior. A continuación, le añadimos los paquetes necesarios para activar el módulo
PHP.

      apt­get install apache2

apt-get install php7.0 libapache2-mod-php7.0 php7.0-cli php-pear php7.0-mysql

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

A continuación, creamos un fichero de configuración para nuestro sitio web en Apache


que podría ser algo parecido al siguiente:

<VirtualHost *:8080>
ServerName www.ejemplo.com
DocumentRoot /var/www/html/sitioEjemplo
….
</VirtualHost>

Por último, lo habilitamos con a2ensite.

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:

service apache2 restart


service nginx restart

11

You might also like