2. Apache

2.1. Instalación

sudo apt install apache2

2.2. Configuración

  • Los archivos de la web van por defecto dentro de /var/www/html/
  • El usuario HTTP (en Apache es "www-data") debe tener permisos de acceso y lectura a las carpetas y archivos
    find . -type d -exec chmod 750 {};
    find . -type f -exec chmod 640 {};
    sudo chgrp -R www-data #OPCIÓN 1
    chown -R :www-data #OPCIÓN 2
    • Si la web permite la subida de archivos o algún otro tipo de edición, se tendrán que dar permisos de edición al usuario HTTP.
  • El propietario de esos archivos debería ser un usuario del sistema, NO el usuario HTTP.
  • La configuración se hace a través de los archivos que se encuentra dentro de la carpeta /etc/apache/sites-available/
  • Pueden crearse uno por cada web o incluir toda la configuración en uno solo.
  • Sin embargo, existe un archivo de configuración global en /etc/apache2/apache2.confque puede sobrescribir la configuración de los anteriores archivos, por lo que habrá que modificarlo si es necesario.
  • El archivo de configuración por defecto se llama 000-default.conf.
  • Se pueden añadir webs fuera del directorio por defecto, siempre que cumplan los requisitos anteriores.
  • Es importante que los archivos de la carpeta "sites-available" tengan un enlace simbólico con los de la carpeta "sites-enabled", para que las webs se activen.
    Esto se puede hacer de dos maneras:
    sudo a2ensite archivo.conf 
    #OPCIÓN 1 sudo ln -s /etc/apache2/sites-available/archivo.conf /etc/apache2/sites-enabled/archivo.conf
    #OPCIÓN 2
  • Para deshabilitar un sitio: a2dissite default.
  • Para verificar que la sintaxis de los archivos de configuración es la correcta antes de recargar apache: apache2ctl configtest
  • Para recargar apache cuando se hace alguna modificación:
    sudo systemctl reload apache2 #OPCIÓN 1 
    sudo service apache2 restart #OPCIÓN 2
    sudo service apache2 reload #OPCIÓN 3

2.2.1. Archivos VirtualHost

Creación de hosts virtuales y alias

  • VirtualHost: Permiten la creación de sitios web. Se crean dentro de los archivos .conf de "sites-available".
  • Es importante que:
    • Incluyas como mínimo lo que aparece a continuación:
      <VirtualHost *:80>
          ServerName www.ejemplo.com
          ServerAlias ejemplo.com
          DocumentRoot /home/user/ejemplo
      </VirtualHost>
    • Opciones:
      • <VirtualHost *:80>
        • Aplica el VirtualHost al puerto 80. Si se quiere usar otro puerto(p.ej. 8080), antes hay que añadir "Listen 8080" (sin comillas). El asterisco implica que se aplica a todas las IP (puede añadirse la IP del servidor si es estática).
      • ServerName
        • Indica el dominio de la web.
      • ServerAlias
        • Indica otro dominio que tiene que escuchar el servidor (normalmente la versión sin www)
      • DocumentRoot
        • Indica la carpeta raíz de la web. Dirección completa (no añadir barra diagonal al final)
    • Dentro del VirtualHost puede añadirse una etiqueta Directory o Location
    • Dentro de Location suelen ir la protección por contraseña del directorio. La ruta es relativa al DocumentRoot.
    • Opciones dentro de Directory:
      • <Directory /ruta>
        • La ruta es absoluta, desde la raíz.
      • Options Indexes FollowSymlinks
        • Indexes: permite que aparezca el índice de archivos si no hay un archivo "index". Si no se incluye, aparecerá un error 404 de acceso prohibido.
        • FollowSymLinks: Además mostrará los enlaces simbólicos de la carpeta si los hubiera.
      • Require all granted
        • Permite que cualquier IP pueda acceder a la carpeta. Necesario si se ha denegado el acceso en carpetas superiores.
      • AllowOverride None
        • Ignora archivos .htaccess
        • AllowOverride All no los ignora
    • Si se quieren usar dominios de prueba con VirtualHost, hay que editar /etc/hosts (Linux) o C:windowssystem32driversetchosts (Windows) en el ordenador cliente y reiniciar apache
  • Alias: Permiten hacer una referencia a un directorio distinto del DocumentRoot, ya sea dentro de un VirtualHost o en un archivo separado
    • Dentro de un VirtualHost:
      Alias /web2 /var/www/web2
    • En un archivo separado en sites-available:
      Alias /web1 "/var/www/web1/"
      <Directory /var/www/web1/>
          Options +FollowSymlinks
          AllowOverride All
      </Directory>

ProxyPass

  • Redirige de un puerto a otro (p.ej. del 80 al 8000).
  • Se necesita ejecutar el siguiente comando (una vez):
    sudo a2enmod proxy_http
  • En el VirtualHost:
    ProxyPass / http://127.0.0.1:8000/
    ProxyPassReverse / http://127.0.0.1:8000/
  • Si se usa SSL, también hay que incluirlo en el VirtualHost correspondiente.
  • Comprueba que no existen problemas cuando el navegador busca archivos css u otros en un proxy.

Módulo Rewrite / Alias

  • Redirige de una URL a otra
  • Se necesita ejecutar el siguiente comando (una vez):
    sudo a2enmod rewrite
  • Dentro del VirtualHost:
    RewriteEngine On
    RewriteCond %{HTTP_HOST} =ejemplo.es [OR]
    RewriteCond %{HTTP_HOST} =www.ejemplo.es
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,R=permanent]
    RewriteCond %{HTTP_HOST} =85.255.255.255
    RewriteRule ^(.*)$ https://ejemplo.es$1 [L,R=301]
    <Directory /var/www/arbol>
        RewriteEngine On
        RewriteBase /
        RewriteRule ^([a-z])=([a-z0-9]+)/?$ index.php?$1=$2 [NC]
    </Directory>
    • El anterior código indica tres redirecciones: la primera convierte http://ejemplo.es yhttp://www.ejemplo.es en https://ejemplo.es y https://www.ejemplo.es. El siguiente "rewrite" redirecciona al https desde la dirección IP. La última redirección convierte http://ejemplo.es/d=3 (y su equivalente con www) en http://ejemplo.es/index.php?d=3

Restricción de acceso

  • Para restringir el acceso a una carpeta.
  • Requiere crear un fichero con la contraseña:
    htpasswd -c /ruta/para/guardar/archivo usuario #pedirá la contraseña
  • En el VirtualHost (dentro de una etiqueta Location):
    AuthType Basic
    AuthName "Directorio protegido"
    AuthUserFile /ruta/para/guardar/archivo
    Require valid-user

2.2.2. El archivo .htaccess

  • Permite hacer unas modificaciones similares al del archivo de configuración de Apache
  • Suele ser un archivo terminado en .htaccess, pero en las webs prefabricadas pueden tener otro nombre.
  • Para poder utilizarlo, hay que asegurarse de que el servidor permite su uso (AllowOverride All) en el archivo de configuración
  • Se puede indicar el directorio al que hacen referencia las órdenes e incluirlas dentro:
    <Directory /var/www/html>
  • Para redirigir el tráfico de una web a otra, de HTTP a HTTPS, o para simplificar la URL cuando se usa PHP
    <IfModule mod_rewrite.c>
        # Activar RewriteEngine
        RewriteEngine on
        RewriteBase /
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://ejemplo.es/$1 [L,R=301,NC]
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule (.*)/$ https://ejemplo.es/$1 [R=301,L,QSA]
        RewriteCond %{SCRIPT_FILENAME} !-d
        RewriteCond %{SCRIPT_FILENAME} !-f
        RewriteRule ^([0-9]+)-([a-zA-Z0-9-]*)$ pages.php?id=$1
        RewriteRule ^c-([a-zA-Z-]*)$ categories.php?cat=$1
    </IfModule>
  • Para regular la caducidad de la caché según el tipo de recurso web
    <IfModule mod_expires.c>
        ExpiresActive on
        ExpiresDefault "access plus 1 month"
        ExpiresByType image/x-icon "access plus 1 year"
        ExpiresByType application/javascript "access plus 1 month"
        ExpiresByType image/jpg "access plus 1 month"
        ExpiresByType image/jpeg "access plus 1 month"
        ExpiresByType image/png "access plus 1 month"
        ExpiresByType text/css "access plus 1 month"
    </IfModule>
  • Para permitir las "peticiones de origen cruzado" ("CORS"), es decir, que se puedan ejecutar scripts sobre los recursos de la web desde otro dominio
    <IfModule mod_headers.c>
        Header set Access-Control-Allow-Origin "*"
    </IfModule>
    # '*' para todos los dominios, es recomendable limitar el acceso a un dominio
    # ya que es arriesgado permitir que se ejecuten scripts sobre la web desde otro dominio.