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)
- <VirtualHost *:80>
- 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
- <Directory /ruta>
- 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.