Cómo Instalar Nginx en Debian 9

Cómo Instalar Nginx en Debian 9

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, con este tutorial paso a paso.

Requisitos para instalar Nginx en Debian 9

Antes de empezar a instalar Nginx en Debian 9 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 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 systemctl:

~$ systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2019-03-19 17:45:50 CET; 1min 15s ago
     Docs: man:nginx(8)
  Process: 1755 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 1754 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
 Main PID: 1758 (nginx)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/nginx.service
           ├─1758 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
           └─1759 nginx: worker process

Pero seguro que prefieres comprobarlo a través de un navegador, accediendo al servidor Debian 9 mediante su dirección IP o cualquier dominio que apunte a esta:

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

 

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 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 /etc/nginx/nginx.conf y localizamos este fragmento dentro de la directiva 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:

[...]

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        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.

Al igual que Apache, Nginx también ofrece esta potente herramienta. El sistema de servidores virtuales de Nginx en Debian 9 es similar al de Apache. Dentro de /etc/nginx/ tenemos las carpetas 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 /home/chacho/public_html/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 y probar desde un navegador el dominio que acabamos de configurar (en nuestro ejemplo, http://blog.debian9.local):

como configurar servidores virtuales en nginx
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 /home/chacho/public_html/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 php en nginx para debian
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, ¡nada impide que me invites a un café!

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (3 votos, promedio: 5,00 de 5)
Cargando…

Deja un comentario

Cerrar menú

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información

ACEPTAR
Aviso de cookies