- Estréllate y Arde - https://www.estrellateyarde.org -
Servidor web Apache en Linux
La web (www, World Wide Web, Telaraña de ámbito mundial) es un sistema que funciona sobre Internet mediante el protocolo HTTP (HyperText Transfer Protocol), que permite visualizar documentos escritos en HTML (HyperText Markup Language, Lenguaje de marcas de hipertexto). Este procolo se implementa con arquitectura cliente-servidor, por lo que necesita:
Hay muchos servidores web pero el más usado es Apache (apache.org, paquete virtual httpd, paquetes apache2 apache2-mpm-prefork), que forma parte de la tecnología LAMP (Linux, Apache, PHP, MySQL).
¿Qué MPM instalar en Apache 2?
Apache 2 tiene varios núcleos o MPM (Multi Processing Module). El que se instala por defecto es worker (paquete apache2-mpm-worker). Es multi-hilo y más rápido que Apache 1.3 pero no es adecuado para PHP. En PHP recomiendan el MPM prefork (paquete apache2-mpm-prefork), más estable y similar a Apache 1.3, que es el que instalaremos nosotros.
Comprobaremos si está bien instalado tecleando 127.0.0.1 o localhost en el navegador: si todo está correcto aparecerá la página de prueba de Apache.
Equivalencias en Windows: MS-IIS.
Recursos
A diferencia de Apache 1.3 que contaba con un único archivo de configuración (el mítico y añorado /etc/apache/httpd.conf), Apache 2 tiene numerosos archivos de configuración. Veamos algunas de las principales directivas de /etc/apache2/apache2.conf:
ServerTokens Full
Y Apache da toda la información:
Apache 2.0.4 (Debian - PHP/5.2.0-8+etch3)
Por seguridad, mejor ponerlo a Prod para que envíe el mínimo de información:
ServerTokens Prod
ServerSignature On
Y Apache da todos los datos:
Apache 2.0.4 Server at 192.168.1.3 Port 80
Por seguridad, mejor ponerlo a Off para dar el mínimo de datos:
ServerSignature Off
ErrorDocument 404 /info.html
Alias /icons/ /usr/share/apache2/icons/
si tecleamos en el browser:
http://www.domain.com/icons/
Apache servirá el contenido de:
http://www.domain.com/usr/share/apache2/icons/
Para los directorios definidos en las directivas Alias tendremos que crear una directiva Directory en la que se definan los permisos, por ejemplo:
<Directory /usr/share/apache2/icons/> ... </Directory>
userDir public_html
Si tecleamos en el navegador:
http://www.domain.com/~francis/
el servidor accederá a:
http://www.domain.com/home/francis/public_html/
AccessFileName .htacces
Para impedir que los .htaccess puedan ser vistos por los usuarios:
<Files ~"ˆ\.ht"> Order allow deny Deny from all </Files>
Otro archivo de configuración de Apache 2 es /etc/apache2/mods-enabled/dir.conf:
DirectoryIndex index.html index.htm index.cgi
Otro archivo más, /etc/apache2/conf.d/charset:
AddDefaultCharset on
AddDefaultCharset utf-8
AddDefaultCharset off
Por ejemplo, para UTF-8, la etiqueta META será:
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
Para configurar nuestro host editaremos el archivo /etc/apache2/sites-available/default. Si nuestro Apache tiene que servir varios dominios crearemos un bloque VirtualHost para cada uno de ellos, siendo el host por defecto el primer host virtual listado.
Supongamos que tenemos dos dominios (www.domain.com y www.otherdomain.com) apuntando a nuestra IP. Para cada uno de ellos existirá una sección VirtualHost, siendo www.domain.com el sitio por defecto:
NameVirtualHost * <VirtualHost *> ServerName www.domain.com ServerAlias domain.com *.domain.com DocumentRoot /var/www/domain ServerAdmin [email protected] <Directory /> Options SymLinksIfOwnerMatch AllowOverride None </Directory> <Directory /var/www/domain> Options -Indexes -Includes -FollowSymLinks Multiviews AllowOverride None Order allow, deny Allow from all </Directory> CustomLog /var/log/apache2/access.domain.log combined ErrorLog /var/log/apache2/error.domain.log </VirtualHost> <VirtualHost *> ServerName www.otherdomain.com ServerAlias otherdomain.com *.otherdomain.com DocumentRoot /var/www/otherdomain ServerAdmin [email protected] <Directory /> Options SymLinksIfOwnerMatch AllowOverride None </Directory> <Directory /var/www/otherdomain> Options -Indexes -Includes -FollowSymLinks Multiviews AllowOverride None Order allow, deny Allow from all </Directory> CustomLog /var/log/apache2/access.otherdomain.log combined ErrorLog /var/log/apache2/error.otherdomain.log </VirtualHost>
Examinemos algunas de las directivas que se incluyen en cada VirtualHost:
ServerName localhost
Si tenemos un dominio registrado lo usaremos:
ServerName www.domain.com
DocumentRoot /var/www/domain
ServerAdmin webmaster@localhost
Si tenemos un dominio registrado lo usaremos:
ServerAdmin [email protected]
CustomLog /var/log/apache2/access.domain.log combined
La directiva LogFormat define los posibles formatos para los logs generados: (full, debug, combined, forensic, common, referer y agent).
ErrorLog /var/log/apache2/error.domain.log
Tipo de mensajes que se guardarán en los logs de error (de menos a más gravedad: debug, info, notice, warn, error, crit, alert y emerg):
LogLevel warn
<Directory /> Options SymLinksIfOwnerMatch AllowOverride None </Directory>
y posteriormente habilitar el acceso y permisos más amplios en directorios específicos. Por ejemplo, para la raíz del árbol de documentos y sus subdirectorios:
<Directory /var/www/> Options -Indexes -Includes -FollowSymLinks Multiviews AllowOverride None Order allow, deny Allow from all </Directory>
Es preferible desactivar esta opción con -Indexes para no arriesgarnos a que el usuario pueda acceder a archivos sensibles, de manera que Apache mostrará el mensaje de error Forbidden - You don't have permission. Una solución sencilla muy utilizada para evitar riesgos es ubicar en los directorios que no se desea que sean mostrados un archivo index.html vacío: si alguien entra en estos directorios sólo verá una página en blanco.
En caso de activar Indexes controlaremos la apariencia del listado con la directiva IndexOptions. Por ejemplo, para mostrar iconos (FancyIndexing) y que se muestren primero los directorios (FoldersFirstcon) pondremos:
IndexOptions FancyIndexing FoldersFirstcon
Allow from all Allow from none Allow from 192.168 80.58.61.254 fransberns.com
RewriteEngine on RewriteLogLevel 0
A continuación, establecemos las reglas de reescritura. Por ejemplo, con la directiva:
RewriteRule /news/(.+) /index.php?id=$1
cuando se solicite la página:
http://www.domain.com/news/medicina.php
el servidor devolverá (de forma transparente para el usuario):
http://www.domain.com/index.php?id=medicina.php
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://(www\.)?mi_dominio.com(/)?.*$ [NC] RewriteRule .*\.(gif|jpg|png)$ - [F,NC]
Para reemplazar la imagen solicitada por otra sustituiremos la última línea por:
RewriteRule .*\.(gif|jpg|png)$ http://www.mi_dominio.com/nohotlink.jpe [R,NC]
Y la imagen que se verá en la web ladrona será nohotlink.jpe:
Recursos
LoadModule digest_auth_module /usr/lib/apache2/modules/mod_auth_digest.so
Ambos mecanismos de autentificación funcionan de forma similar:
- Basic:
# htpasswd -c /etc/apache2/passwd <nombre_usuario>
- Digest:
# htdigest -c /etc/apache2/passwd Private <nombre_usuario>
Nos pedirá la contraseña del usuario y su confirmación. La opción -c creará el archivo (si no existe) o lo sobrescribirá (si existe). Para Digest tenemos que especificar el nombre del dominio de autentificación (Private) que figura en la directiva AuthName (es el nombre que se muestra cuando se solicita la autentificación al usuario).
- Basic:
# htpasswd /etc/apache2/passwd <nombre_usuario>
- Digest:
# htdigest /etc/apache2/passwd Private <nombre_usuario>
- Basic:
<Directory /var/www/secret/> AuthType Basic AuthName "Only by invitation" AuthUserFile /etc/apache2/passwd Require valid-user </Directory>
- Digest:
<Directory /var/www/secret/> AuthType Digest AuthName Private AuthDigestFile /etc/apache2/passwd Require valid-user lt;/Directory>
- Basic:
- Digest:
Una vez configurado Apache, guardamos los cambios y reiniciamos el servidor:
# /etc/init.d/apache restart
Comprobaremos si funciona poniendo en el directorio donde está la web (/var/www) la página HTML más sencilla, Hola mundo. El archivo hello.html contiene lo siguiente:
<html> <head> <title>Hola mundo</title> </head> <body> <h1>Hola, mundo.</h1> </body> </html>
Si todo está correcto, al abrir http://127.0.0.1/hello.html en el navegador veremos lo siguiente:
Article printed from Estréllate y Arde: https://www.estrellateyarde.org
URL to article: https://www.estrellateyarde.org/discover/servidor-http-en-linux
Click here to print.
Copyright © 2010 Estrellate y Arde