Programación Web: Apache

1. Instalación

sudo apt install apache2

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.conf que 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:
    #OPCIÓN 1 
    sudo a2ensite archivo.conf 
    #OPCIÓN 2 
    sudo ln -s /etc/apache2/sites-available/archivo.conf \
    /etc/apache2/sites-enabled/archivo.conf 
    
  • 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.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:\\Windows\System32\driverset\chosts (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:
    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 y http://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. 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.