Seguimos con la instalación de nuestro servidor LEMP y si en el capítulo anterior instalamos PHP en nuestra Raspberry, ahora le toca el turno a Nginx, el servidor web.

Instalación de Nginx

Continuamos con la E de la pronunciación en inglés ényin-ex. Instalamos:

sudo pacman -S nginx

Configuración de nginx.conf

Empezaremos averiguando cuántos núcleos tiene nuestro procesador para aprovecharlos todos. Ejecutaremos el siguiente comando para determinar el número de ellos:

cat /proc/cpuinfo| grep processor | wc -l

El resultado será el valor a introducir en la directiva worker_processes del fichero nginx.conf.

Renombramos el fichero de configuración:

sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.jfe

Y lo creamos de nuevo:

sudo nano /etc/nginx/nginx.conf
user http http;
worker_processes 4;

events {
        worker_connections  1024;
        use epoll;
}

http {
      sendfile on;
      tcp_nopush on;
      tcp_nodelay on;
      keepalive_timeout 30;
      types_hash_max_size 4096;
      server_tokens off;

      include /etc/nginx/mime.types;
      default_type application/octet-stream;

      error_log /var/log/nginx/error.log;

      gzip on;
      gzip_disable "MSIE [1-6]\.(?!.*SV1)";
      gzip_http_version 1.1;
      gzip_vary on;
      gzip_proxied any;
      gzip_comp_level 6;
      gzip_buffers 16 8k;
      gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

      server_names_hash_bucket_size 128;

      connection_pool_size 256;
      client_header_buffer_size 1k;
      large_client_header_buffers 4 2k;
      request_pool_size 4k;

      client_max_body_size 20M;

      output_buffers 1 32k;
      postpone_output 1460;

      include /etc/nginx/sites-enabled/*;
}

Comprobamos la sintaxis con el comando:

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

Activamos y arrancamos el servicio:

sudo systemctl enable nginx
sudo systemctl start nginx

Server Blocks en Nginx

Podemos gestionar varios dominios utilizando los bloques de servidor, comparables a los virtualhosts en Apache.

Añadiremos el usuario al grupo http:

sudo gpasswd -a usuario http

Verificamos:

groups usuario
lp wheel http games video audio optical storage scanner power users

Cambiamos los permisos del acceso a la ruta del servidor:

sudo chown root:http /srv/http/
sudo chmod g+w /srv/http/

Creamos los directorios necesarios para los bloques:

sudo mkdir -p /etc/nginx/sites-{available,enabled}

Configuración PHP para server blocks

Para evitar tener que poner el mismo bloque de configuración en todos los hosts que permitamos la ejecución de PHP, vamos a crear un archivo php.conf con la configuración necesaria y lo incluiremos en los hosts:

sudo nano /etc/nginx/php.conf
location ~ \.php$ {
                   #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
                   fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
                   fastcgi_index index.php;
                   include fastcgi.conf;
}

Crear el primer server block

Ahora sí, creamos el primer bloque:

sudo nano /etc/nginx/sites-available/first_server
server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        root /srv/http/first_server/public_html;
        index index.html index.htm;

        server_name first_server.rpi4.*;

        access_log /var/log/nginx/first_server.access.log;
        error_log /var/log/nginx/first_server.error.log;

        location / {
                    index index.html index.htm index.php;
                    autoindex on;
                    autoindex_exact_size off;
                    autoindex_localtime on;
        }

        location = /50x.html {
                              root   /usr/share/nginx/html;
        }

        # Configuración PHP
        include php.conf;

        location ~ /\.ht {
            deny  all;
        }

        error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;

}

Creamos el enlace simbólico en sites-enabled:

sudo ln -s /etc/nginx/sites-available/first_server /etc/nginx/sites-enabled

Configuración de rutas

Vamos a crear en la ruta que deseemos, las carpetas necesarias:

sudo mkdir -p /srv/http/first_server/public_html

Damos propiedad a los directorios recién creados:

sudo chown -R http:http /srv/http/first_server/public_html

Y permisos:

sudo chmod g+w /srv/http/

Creamos un sencillo fichero HTML para probar que funciona nuestro primer host virtual:

sudo nano /srv/http/first_server/public_html/index.html
<!DOCTYPE html>
<html>
  <head>
    <title>First Server</title>
  </head>
  <body>
    <h1>Hurra! NGINX está funcionando correctamente con jaumeferre.net!</h1>
    <p>my first virtualhost</p>
  </body>
</html>

Múltiples server blocks

Repetiremos el proceso para cada uno de los servidores virtuales que queremos gestionar, teniendo en cuenta que sólo se puede declarar 1 único servidor por defecto y se le indica a nginx en las líneas:

# para IPv4
listen 80 default_server;

# para IPv6
listen [::]:80 default_server ipv6only=on;

Para conocer qué servidor por defecto tenemos, basta con ejecutar:

grep -R default_server /etc/nginx/sites-enabled/

Configuración del firewall

No nos olvidemos de abrir el puerto HTTP:

sudo ufw allow 80/tcp

Ni tampoco el correspondiente a HTTPS:

sudo ufw allow 443/tcp

Reiniciamos el servicio:

sudo systemctl restart nginx

Configuración del cliente

Si vamos a utilizar la Raspberry como servidor web debemos añadir en el fichero /etc/hosts del equipo cliente la línea correspondiente:

sudo nano /etc/hosts
#
# /etc/hosts: static lookup table for host names
#

#<ip-address>   <hostname.domain.org>   <hostname>
127.0.0.1       localhost.localdomain   localhost
::1             localhost.localdomain   localhost

192.168.1.60     first_server.test

# End of file

Probar la instalación

Ahora, desde nuestro navegador favorito escribimos la dirección:

http://first_server.rpi4.test/

Nos debería aparecer:

Hurra! NGINX está funcionando correctamente con first_server.rpi.test!
my first virtualhost

De la misma manera, si hemos creado más de un servidor virtual, cambiando la dirección en el navegador, deberíamos ir cambiando de sitio.


Serie Servidor LEMP:

  1. PHP
  2. Nginx ← Estás aquí
  3. MariaDB (próximamente)
  4. Configuración final (próximamente)

Ya solo nos quedaría configurar Fail2ban, que podemos seguir desde aquí.

Índice de la serie

Este artículo forma parte de la serie Servidor LEMP.