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í.