3. Nginx

3.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):
    1. Instalar nginx
    2. Instalar php7.2-fpm
    3. Instalar mysql-server (o mariadb-server)
    4. Instalar php7.2-mysql
  • El usuario web por defecto es www-data (en ubuntu)

3.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.
  • 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 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.