Cómo instalar Nginx en Debian 9 Stretch

En esta entrada vamos a ver cómo instalar Nginx en Debian 9, uno de los servidores web más populares como alternativa a Apache. De hecho es, actualmente, el segundo servidor web más usado en Internet. Entre sus virtudes, su velocidad y ligereza. Ya no tienes excusa para probarlo en tu sistema o VPS Debian, con este tutorial paso a paso.

Requisitos para instalar Nginx en Debian 9 Stretch

Antes de empezar con esta guía de instalación de Nginx en Debian 9 Stretch vamos a ver qué necesitamos:

  • Una instalación de Debian 9 actualizada.
  • Acceso por consola mediante root o un usuario con privilegios de sudo.
  • Conexión a Internet.

Muy pocos requisitos. Así que vamos ya con Nginx en Debian.

Cómo instalar Nginx en Debian 9

Vamos a instalar Nginx en Debian 9 Stretch sencillamente, ya que podemos usar el comando apt con los repositorios oficiales de Debian. En una consola lanzamos apt para actualizar el sistema (como buena práctica):

~$ sudo apt update && sudo apt -y upgrade

Con el sistema recién actualizado es el momento de instalar el paquete nginx:

~$ sudo apt -y install nginx

El paquete principal de Nginx y todas sus dependencias se descargarán e instalarán automáticamente, tras lo cual el servidor web queda en funcionamiento.

La forma más rápida de comprobarlo es directamente en la consola, comprobando el estado del servicio nginx mediante el comando systemctl status nginx:

como instalar y configurar nginx en debian 9 stretch

Además, también de forma automática, la instalación de Nginx lo deja listo para arrancar con cada inicio del sistema, por lo que tampoco tenemos que ocuparnos de esa configuración.

Cómo configurar el firewall UFW para Nginx en Debian 9

Si tienes activado el firewall UFW en la máquina Debian 9 en la que estás instalando y configurando Nginx, necesitarás añadir una regla específica si quieres que se pueda acceder al servicio web desde la red. Para acceder al servicio estándar HTTP, en el puerto TCP 80, añadimos esta regla:

~$ sudo ufw allow http

Si además vas a servir contenido seguro con Nginx, usando el protocolo seguro HTTPS, en el puerto TCP 443, añadimos una regla más:

~$ sudo ufw allow https

Cómo probar Nginx en Debian 9 Stretch

Seguro que quieres comprobar el funcionamiento de Nginx a través de un navegador, así que accederemos al servidor Debian 9 con un navegador a través de su dirección IP, nombre de máquina o dominio:

como instalar nginx en debian 9 stretch
Página por defecto del servidor web Nginx en Debian 9 Stretch

Cómo configurar Nginx en Debian 9

Para configurar Nginx en Debian editaremos sus archivos de configuración, que se encuentran organizados en archivos y directorios bajo el directorio /etc/nginx/, siendo el archivo principal de configuración de Nginx /etc/nginx/nginx.conf.

Los archivos de registro de eventos o logs de Nginx se encuentran en /var/log/nginx/ y por defecto son access.log y error.log.

Por otro lado, los archivos web del servidor por defecto de Nginx sobre Debian 9 se encuentran en la carpeta /var/www/html/.

Cómo mejorar la seguridad de Nginx en Debian 9

Tras una instalación estándar siempre es interesante revisar los ajustes por defecto para configurar Nginx mejorando la seguridad.

Uno de estos ajustes sería desactivar el envío de las cabeceras que identifican la versión del servidor web a todos los clientes. Esto es importante para evitar que usuarios malintencionados averigüen qué versión del servidor estamos ejecutando para realizar ataques basados en vulnerabilidades conocidas propias de cada versión.

Para ello, editamos nginx.conf:

~$ sudo nano /etc/nginx/nginx.conf

Y localizamos la directiva server_tokens dentro del bloque http:

...
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;
...

Vemos que la directiva server_tokens está desactivada mediante un comentario (#), por lo que por defecto sí se envían esas cabeceras. Debemos editar la directiva eliminando el carácter # para que no se envíen:

...
        server_tokens off;
...

Una vez guardados los cambios, para que tengan efecto debemos recargar la configuración de Nginx mediante systemctl:

~$ sudo systemctl reload nginx

Ahora nuestro servidor web es un poco más seguro.

Cómo configurar un servidor virtual en Nginx sobre Debian 9

Una de las características más importantes de un servidor web es la posibilidad de configurar servidores virtuales que respondan a distintos dominios, para aprovechar toda la potencia y recursos del servidor.

El sistema de servidores virtuales de Nginx en Debian 9 se basa en un sistema de carpetas y archivos de configuración, basado en que dentro de /etc/nginx/ tenemos los subdirectorios sites-available/ y sites-enabled/. En /etc/nginx/sites-available/ tendremos los archivos de configuración del servidor por defecto y, opcionalmente, de cada servidor virtual que hayamos configurado.

En /etc/nginx/sites-enabled/ tendremos enlaces simbólicos a los archivos de sites-available/ que queramos tener activados. Por tanto, Nginx sólo tendrá en cuenta los servidores virtuales para los que existen archivos (enlaces simbólicos, normalmente) presentes en sites-enabled/.

Esta es una forma interesante y cómoda para activar y desactivar servidores sin destruir los archivos de configuración, sólo se crean y eliminan enlaces simbólicos a estos archivos.

Servidor por defecto en Nginx

El único servidor que viene configurado tras instalar Nginx es el que funciona por defecto y atiende a todas las peticiones HTTP de cualquier adaptador de red del servidor o de cualquier dominio o nombre de máquina que se resuelva a una de las direcciones de red del servidor.

El archivo que mantiene la configuración del servidor web por defecto es /etc/nginx/sites-available/default. Por tanto, cualquier modificación que queramos hacer sobre el servidor por defecto la haremos editando ese fichero.

Servidores virtuales adicionales

Vamos a crear un nuevo servidor virtual que responda a un dominio que tengamos configurado (real o local). En el ejemplo el dominio será blog.debian9.local, por lo que con nuestro editor de texto favorito y privilegios de sudo crearemos el archivo /etc/nginx/sites-available/blog.debian9.local:

~$ sudo nano /etc/nginx/sites-available/blog.debian9.local

El contenido de este archivo será algo así como lo siguiente:

server {
        listen 80;
        listen [::]:80;

        server_name blog.debian9.local;

        root /var/www/blog/;
        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }
}

Como vemos, se trata de una sintaxis de bloques anidados, siendo el bloque raíz la directiva server. Observa que las directivas, a diferencia de Apache, terminan con el carácter punto y coma.

Las dos directivas listen configuran el puerto de escucha HTTP (80 es el puerto estándar) para direcciones IPv4 e IPv6.

En server_name definimos el dominio al que va a responder el servidor virtual. Aquí puedes poner el dominio del servidor virtual que estés configurando.

En root especificamos el directorio donde se encuentra el contenido web del sitio. Puedes poner la ruta que prefieras para los archivos web de este servidor virtual.

La directiva index indica el fichero índice por defecto, que normalmente es index.html.

La directiva location (similar a la directory de Apache) es un bloque donde se pueden añadir opciones para una ruta concreta. En el ejemplo anterior, la URL en primer lugar se trata de resolver como si fuera un fichero, si no se encuentra el recurso se intentará como directorio (añadiendo / al final de la URI), y si tampoco encuentra el recurso finalmente se devolverá un error 404.

Para activar el nuevo servidor virtual, tenemos que crear el enlace simbólico desde /etc/nginx/sites-enabled/:

~$ sudo ln -s /etc/nginx/sites-available/blog.debian9.local /etc/nginx/sites-enabled/blog.debian9.local

Antes de recargar de Nginx, podemos testear la nueva configuración para ver si es correcta:

~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Si obtenemos algún mensaje de error, tendremos que revisar los cambios que realizamos. En caso de ser correcta la configuración, podemos cargarla en Nginx:

~$ sudo systemctl reload nginx

Para probar el nuevo servidor virtual basta con asegurarnos de que haya algo de contenido en su directorio de archivos web que hemos especificado para el servidor virtual, así que crearemos la carpeta que indicamos en la directiva root:

~$ sudo mkdir /var/www/blog

Creamos un archivo index.html:

~$ sudo nano /var/www/blog/index.html

Y como contenido cualquier mensaje identificativo puede servir:

<h1>Bienvenido a blog.debian9.local</h1>

Guardados los cambios y cerrado el archivo, podemos probar desde un navegador el dominio que acabamos de configurar (en nuestro ejemplo, http://blog.debian9.local sería la URL correspondiente al dominio que hemos configurado):

como configurar servidores virtuales de nginx en debian 9 stretch
Servidor virtual de Nginx en Debian 9, configurado y funcionando

Configurar certificados SSL en Nginx para HTTPS

Si tenemos instalado un certificado SSL en nuestro sistema Debian para el dominio que estamos configurando en el servidor virtual, añadiremos un segundo bloque server en el archivo de configuración:

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        server_name blog.debian9.local;

        ssl_certificate /etc/letsencrypt/live/blog.debian9.local/cert.pem;
        ssl_certificate_key /etc/letsencrypt/live/blog.debian9.local/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5;

        root /var/www/blog;
        index index.html;

        location / {
                try_files $uri $uri/ =404;
        }
}

En las cláusulas ssl_certificate y ssl_certificate_key debes especificar las rutas a tus certificados.

Si no tienes certificados SSL para el dominio pero quieres usar HTTPS, puedes usar los certificados autofirmados que se generan al instalar el paquete ssl-cert. Basta sustituir las rutas de los certificados SSL en el bloque anterior, quedando de esta forma:

        ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
        ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;

Como siempre que se modifican configuraciones, es necesario recargar la configuración de Nginx.

Cómo instalar PHP en Nginx sobre Debian 9

Para instalar PHP para Nginx lo haremos a través de los repositorios de Debian. Pero no instalaremos el paquete genérico php, ya que este instala y configura también el servidor web Apache configurando PHP como módulo. En el caso de PHP para Nginx se trata de un módulo FastCGI. Tenemos dos posibilidades, el módulo php-fpm que funciona a través de sockets de Unix, o el módulo php-cgi, que funciona a través de sockets TCP.

En este ejemplo instalaremos la versión php-fpm sobre sockets Unix:

~$ sudo apt -y install php-fpm

Pero no basta con instalar php-fpm y todas sus dependencias, ya que tendremos que configurar Nginx manualmente. Editaremos el servidor por defecto /etc/nginx/sites-available/default y buscaremos este bloque location:

...
        # pass PHP scripts to FastCGI server
        #
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
        #       fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        #}
...

Vemos que la configuración para usar PHP está desactivada mediante caracteres #.

Hay que tener cuidado porque las directivas de configuración están intercaladas con comentarios. Además, hay dos directivas fast_cgi, una para sockets Unix y otra para sockets TCP/IP. Como hemos instalado el módulo Unix será esa directiva la que activemos.

Eliminados los caracteres # necesarios, quedaría así:

...
        # pass PHP scripts to FastCGI server
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        }
...

Con esto ya estaría disponible el uso de PHP en Nginx, pero nos queda un detalle imprescindible, y es que debemos editar la directiva index para añadir index.php como fichero índice o por defecto de cualquier carpeta web con proyectos en PHP. En el mismo archivo /etc/nginx/sites-available/default localizamos la directiva index:

...
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;

...

Vemos que un comentario nos advierte de que deberíamos añadir index.php a la lista si usamos PHP. Editaremos la lista añadiendo index.php:

...
        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;
...

Importante: Este proceso debemos hacerlo para cada servidor virtual en el que queramos tener activado PHP. Es decir, en cada archivo de configuración de servidor virtual tendremos que añadir index.php en la directiva index y añadir el bloque location para trabajar con PHP.

Como con cualquier otro cambio de configuración, tendremos que recargar la configuración de Nginx para que los cambios hagan efecto de inmediato. Lo hacemos con systemctl:

~$ sudo systemctl reload nginx

Cómo configurar PHP en Nginx

Siempre que configuramos PHP en cualquier sistema sabemos que existe un archivo php.ini que es el que debemos editar para realizar ajustes en la configuración de PHP. En el caso de PHP para Nginx en Debian 9 (versión 9.6 a la hora de escribir este tutorial), como lo hemos instalado con el paquete php-fpm, el archivo que editaremos cuando lo necesitemos es /etc/php/7.0/fpm/php.ini.

Comprobación del funcionamiento de PHP en Nginx

Para probar PHP en Nginx crearemos un pequeño archivo .php en alguna ruta del servidor por defecto o de los servidores virtuales (si hemos configurado alguno). En este caso probaremos el servidor por defecto creando el archivo /var/www/html/info.php con nuestro editor de texto favorito, y con permisos de root, que es el dueño de /var/www/html:

~$ sudo nano /var/www/html/info.php

El contenido de este archivo será:

<?php phpinfo();

Además de comprobar que PHP funciona, la función de PHP phpinfo() nos proporcionará amplia información sobre la versión de PHP, su configuración y módulos instalados en el sistema. Usaremos un navegador introduciendo la dirección de la página que acabamos de crear:

como configurar nginx en debian 9 stretch
PHP instalado y configurado para Nginx en Debian 9

Conclusión

En esta entrada hemos visto cómo instalar Nginx en Debian 9 en cuestión de minutos, con servidores virtuales y soporte de PHP. Una alternativa muy extendida con respecto al uso de Apache. Es cuestión de hacer pruebas en tu propio entorno para ver si te interesa por velocidad o consumo de recursos uno u otro servidor web.

Para cualquier error, duda, pregunta o sugerencia, puedes dejarme un comentario.

Y si este artículo te ha salvado el día y quieres agradecérnoslo, puedes dejar una propina de tan sólo 1 $ desde PayPal:

O, si te sientes especialmente agradecido, puedes invitarnos a un café:

¡Gracias!

5/5 - (1 voto)

1 comentario en «Cómo instalar Nginx en Debian 9 Stretch»

  1. Hola. Tengo Moodle instalado en un servidor intranet Debian (Bitnami) -con salida a internet- en máquina virtual, con LinuxMint como anfitrión. ¿Has pensado en hacer un tutorial con el proceso para hacer lo mismo, pero usando NGINX? Gracias.

    Responder

Deja un comentario

Este sitio esta protegido por reCAPTCHA y laPolítica de privacidady losTérminos del servicio de Googlese aplican.

El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.