Programación Web: Nginx

1. Instalación de Nginx y componentes de PHP y MySQL

  • Como alternativa a Apache, se puede instalar Nginx. Para hacerlo (desde una instalación limpia de Ubuntu Server):
    sudo apt install nginx php7.2-fpm \
    mysql-server php7.2-mysql
    #También se puede instalar mariadb-server en vez de mysql-server
    
  • El usuario web por defecto es www-data (en ubuntu)

2. Configuración

  • El archivo de configuración por defecto se encuentra en /etc/nginx/sites-available/default
  • Para que una web se active, hay que crear un enlace simbólico ln -s del archivo con la carpeta sites-enabled (recuerda usar rutas absolutas)
  • Ejecuta nginx -s reload al terminar de configurar para reiniciar nginx.
  • Estructura básica:
    server {     
        listen 80;     
        server_name ejemplo.rs1.es www.ejemplo.rs1.es;     
        root /var/www/main;     
        index index.php index.html;     
        location / {         
            try_files $uri $uri/ =404;     
        }     
        location ~ .php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        } 
    } 
    
  • Pueden añadirse varios listen.
  • Se suelen añadir las versiones con y sin www en server_name, pero el navegador entenderá que son dos páginas distintas si no se le indica cuál es la canónica (ver la redirección de más abajo).
  • Cada vez que se accede a una página/archivo, Nginx busca el location más concreto que incluya a esa página/archivo y obvia el resto.
  • Para habilitar SSL, consulta la sección correspondiente.

Redirecciones

server {
    listen 80;
    server_name www.ejemplo.es;
    rewrite ^/(.*)$ http://ejemplo.es/$1 permanent;
    }
    ...
    location / {
        rewrite ^/(.*)=(.*)$ /index.php?$1=$2;
    }
}
  • NOTA: cuando se hacen redirecciones del primer tipo de HTTPS a HTTPS, recuerda añadir la información de los certificados.

Proxy

location / {
     proxy_pass http://127.0.0.1:8000;
 }

Restricción de acceso

  • Usa htpasswd (instala apache2-utils) o OpenSSL
    echo -n 'usuario:' >> .pass
    openssl passwd -apr1 contraseña >> .pass
    
  • En la configuración de la web:
    location / {
         auth_basic  "Ejemplo";
         auth_basic_user_file /etc/nginx/.pass;
     }
    
  • Usar la protección por contraseña y que después redirija a otro dominio no es posible por el orden en que se ejecutan las directivas (ver explicación en inglés)
  • Recuerda que si hay varios location, hay que incluir la restriccción en todos aquellos en que sea necesario ya que Nginx usará solo el location más específico para la página/archivo correspondiente.
  • También se puede restringir por la dirección IP:
    location / {
        allow 1.2.3.4;
        deny all;
    }
    

Páginas de error personalizadas

error_page 404 /404error.html;
error_page 401 /401error.html;
error_page 500 /500error.html;
location = /401error.html {
   root /var/www/arbol; #Opcional, por si fuera necesario aclarar donde se encuentra el archivo
   internal; #Para evitar que se pueda acceder directamente a los archivos de error
   auth_basic off; #Ayuda a que aparezca la página personalizada en los errores 401
} 

Página por defecto

  • Se puede crear una página que sea el destino cada vez que se quiere acceder a un subdominio que no existe, por ejemplo.
    server{
       listen 80;
       server_name *.ejemplo.es;
       root /var/www/default;
     } 
    
    server{
       listen 80;
       server_name *.ejemplo.es;
       return 404;
     }
    
  • Hay que crear una entrada DNS con el nombre *.ejemplo.es dirigida a la IP del servidor.
  • Recuerda que quizás haya que configurar también el puerto 443.

Configuración de la caché

location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
}

Compresión

gzip on;
gzip_comp_level 5; #Nivel de compresión (1-9)
gzip_min_length 256; #Tamaño mínimo para comprimir, en bytes
gzip_proxied any;
gzip_vary on;
gzip_types 
#Tipos de archivos a los que se aplica la compresión, siempre se aplica a text/html
    application/atom+xml
    application/javascript
    application/json
    application/ld+json
    application/manifest+json
    application/rss+xml
    application/geo+json
    application/vnd.ms-fontobject
    application/x-web-app-manifest+json
    application/xhtml+xml
    application/xml
    application/rdf+xml
    font/otf
    application/wasm
    image/bmp
    image/svg+xml
    text/cache-manifest
    text/css
    text/javascript
    text/plain
    text/markdown
    text/vcard
    text/calendar
    text/vnd.rim.location.xloc
    text/vtt
    text/x-component
    text/x-cross-domain-policy;

Otras opciones

  • access_log off;: evita que se cree un registro de acceso en el que aparecen datos como la IP y el modelo de dispositivo del visitante.
  • autoindex on;: permite que cuando se accede a un directorio en vez de una página o archivo, aparezca una lista de los archivos de ese directorio.
  • add_header Access-Control-Allow-Origin '*';: Permite la ejecución de scripts sobre los recursos de la web desde otros dominios ("CORS", por ejemplo para trabajar con archivos JSON). '*' indica cualquier origen. Como es arriesgado permitir que se ejecute código desde otra web, se recomienda limitar el acceso a un dominio.