Servidor web Apache

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:

  • un servidor web que escuche en el puerto 80 TCP (por defecto) y que se ocupe de atender las peticiones de páginas web.
  • un cliente web (navegador o browser) que permita acceder al puerto 80 de la máquina en la que corre el servidor web y solicitarle páginas web mediante la URL (Uniform Resource Locator, Localizador Uniforme de Recursos).

Instalar Apache

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.

Pagina de prueba de Apache

Equivalencias en Windows: MS-IIS.

Recursos

Configuración general del servidor Apache

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:

  • Información que facilita Apache sobre sí mismo. Por defecto vale Full:
    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
  • Datos sobre Apache en el pie de los mensajes de error. Por defecto vale On:
    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
  • Comportamiento del servidor cuando se produce un error. Por ejemplo, podemos configurar Apache para que redireccione a un fichero en nuestro servidor al ocurrir un Error 404. La página no existe:
    ErrorDocument 404 /info.html
  • La directiva Alias permite redireccionar a un directorio que puede estar fuera del árbol de directorios especificado en DocumentRoot. Por ejemplo, con la directiva:
    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>
  • La directiva userDir permite redireccionar al directorio personal del usuario si se recibe una solicitud del tipo ~usuario:
    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/

  • La configuración general de Apache puede sobreescribirse para un directorio determinado si ubicamos en él un archivo .htaccess. La directiva AccessFileName define el nombre de ese archivo:
    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:

  • la directiva DirectoryIndex establece el archivo que busca Apache al entrar en un directorio de nuestra web. Por ejemplo, para decirle que si no encuentra index.html busque index.htm o index.cgi, en ese orden, pondremos:
    DirectoryIndex index.html index.htm index.cgi

Otro archivo más, /etc/apache2/conf.d/charset:

  • la directiva AddDefaultCharset se configura en el archivo /etc/apache2/conf.d/charset y establece qué sistemas de codificación son aceptados y cuál es el sistema por defecto. Admite tres valores:
    • para que Apache sirva la página en ISO-8859-1 sea cual sea la codificación de la página web usaremos on (es la opción por defecto):
      AddDefaultCharset on
    • usaremos <charset> para que Apache sirva la página en ese charset concreto, sea cual sea la codificación de la página web. Por ejemplo, para UTF-8:
      AddDefaultCharset utf-8
    • para que Apache sirva la página con el charset especificado en la etiqueta META de la página web usaremos off (es la opción más recomendable):
      AddDefaultCharset off

      Por ejemplo, para UTF-8, la etiqueta META será:

      <meta http-equiv="Content-Type" content="text/html;charset=utf-8">

Ejemplo para comprobar Apache

Veamos un ejemplo para comprobar Apache. 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:

Hola mundo HTML

Configurar los hosts en Apache

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 webmaster@domain.com
    <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 webmaster@otherdomain.com
    <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:

  • Nombre que el servidor utiliza para identificarse (debe figurar en el DNS). Si no tenemos un dominio registrado usaremos localhost:
    ServerName localhost

    Si tenemos un dominio registrado lo usaremos:

    ServerName www.domain.com
  • Directorio donde está la web, donde Apache busca la página por defecto (si pensamos servir varios dominios, tendremos un directorio para cada uno):
    DocumentRoot /var/www/domain
  • Email del administrador que saldrá cuando haya errores (por ejemplo, Error 404. La página no existe. Contacte con el administrador: webmaster@localhost). Si no tenemos un dominio registrado usaremos localhost:
    ServerAdmin webmaster@localhost

    Si tenemos un dominio registrado lo usaremos:

    ServerAdmin webmaster@domain.com
  • Archivo donde se guardan los logs de acceso y formato (si pensamos servir varios dominios, tendremos archivos de logs de acceso diferentes):
    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).

  • Ubicación de los logs de error (si pensamos servir varios dominios, usaremos archivos de logs de error diferentes):
    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
  • Con la directiva Directory definimos opciones que se aplican al directorio indicado y sus subdirectorios. Lo habitual es configurar unos permisos por defecto muy restrictivos:
    <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>
    • La opción SymLinksIfOwnerMatch sólo permite que puedan seguirse los enlaces simbólicos si el propietario del link y el del archivo apuntado es el mismo.
    • La opción FollowSymLinks permite que puedan seguirse los enlaces simbólicos. Por seguridad, esta opción la desactivamos.
    • Con la opción Indexes, si se solicita un directorio y no existe la página especificada con DirectoryIndex (index.html, index.htm, etc.), Apache mostrará el contenido del directorio.

      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
    • La directiva AllowOverride controla qué opciones pueden sobreescribirse con un archivo .htaccess. Puede impedirse la modificación con None o permitirse con All.
    • La opción Multiviews permite negociar los contenidos con el navegador para elegir la mejor representación de acuerdo con sus preferencias (idioma, conjunto de caracteres, codificación, etc.).
    • La directiva Includes permite el uso de SSI (Server Side Includes). Las instrucciones SSI se utilizan para generar páginas dinámicas y se incluyen normalmente en ficheros con extensión .shtml. Si no utilizamos SSI es preferible desactivar esta opción con -Includes.
    • Con las directivas Order y Allow se controla el acceso al servidor utilizando el nombre de dominio o la IP del cliente. La directiva Order allow, deny determina que primero se evalúa la lista Allow y luego la Deny. La directiva Allow from all permite acceder a todo el mundo. Las directivas Allow y Deny serán similares a:
      Allow from all
      Allow from none
      Allow from 192.168 80.58.61.254 fransberns.com

URLs amistosas en Apache con RewriteRule

Si tenemos páginas dinámicas a las que se accede pasando parámetros en la URL, pueden convertirse en URLs amistosas con la directiva RewriteRule. En primer lugar, activamos el módulo mod_rewrite sin generar logs para las redirecciones:

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

Evitar el hotlink en Apache

El módulo mod_rewrite nos permite una cosa muy interesante, protegernos contra el hotlink o "robo de ancho de banda", que consiste en enlazar directamente las imágenes de otros sitios en vez de almacenarlas en el propio servidor, de manera que se perjudica a la web enlazada al incrementar su tasa de transferencia. Evitar el hotlink no es capricho, si nuestro plan de hosting va "justito" superaremos los límites y seremos penalizados. Pondremos algo similar a:

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.jpg [R,NC]

Y la imagen que se verá en la web ladrona será nohotlink.jpg:

no hotlink

Recursos

Mecanismos de autentificación en Apache

El protocolo HTTP dispone de dos mecanismos de autentificación para restringir el acceso a un directorio mediante nombre de usuario y contraseña: Basic (el usuario y el password viajan por la red sin cifrar) y Digest (el usuario y el password viajan por la red cifrados con MD5). Para utilizar Digest debemos cargar el módulo:

LoadModule digest_auth_module  /usr/lib/apache2/modules/mod_auth_digest.so

Ambos mecanismos de autentificación funcionan de forma similar:

  1. crearemos el archivo que contiene los nombres de los usuarios autorizados (que no tienen que coincidir con usuarios del sistema) y sus contraseñas cifradas. Este archivo es /etc/apache2/passwd y se crea al añadir el primer usuario con el comando:

    - 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).

  2. una vez creado el archivo, para añadir usuarios o modificar contraseñas haremos:

    - Basic:

    # htpasswd /etc/apache2/passwd <nombre_usuario>

    - Digest:

    # htdigest /etc/apache2/passwd Private <nombre_usuario>
  3. indicaremos al servidor qué recursos están protegidos y cuáles son los usuarios que pueden acceder a ellos. Por ejemplo, para proteger el directorio /var/www/secret pondremos:

    - 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>
  4. a partir de este momento, para acceder a /var/www/secret nos tendremos que autentificar:

    - Basic:

    Directorios protegidos Basic

    - Digest:

    Directorios protegidos Digest

Artículos en la categoría "Servidores (software)"

  1. Monitorizar servidores con Nagios
  2. Monitorizar routers SNMP con MRTG
  3. Administración de máquinas Linux con Webmin
  4. Shell remoto con Telnet
  5. Servidor DNS Bind
  6. Servidor de IPs dinámicas DHCP
  7. Servidor de hora NTP
  8. Servidor proxy Squid
  9. Servidor de correo electrónico
  10. Servidor de terminales LTSP
  11. Servidor web Apache
  12. Soporte para PHP en Apache
  13. Soporte para CGI en Apache
  14. Analizador de logs de Apache
  15. Servidor de base de datos MySQL
  16. Servidor web Lighttpd
  17. Whois: Quién es el propietario de un dominio
  18. Servidor de archivos FTP
  19. Compartir archivos en Linux: NFS
  20. Compartir archivos en Windows: Samba
  21. Control de versiones: CVS y Subversion
  22. Servidor de streaming por Internet
  23. Servidor de streaming en red local

25 Comments:

  1. Eres un crack :)
    jejej estaba buscando algo del charset y el apache y tu lo tenias
    Thx

  2. Acabo de montar mi primer Linux para montar mi primer servidor web con mi primera página web… y estoy pez en todo… y necesitaba algo como lo que justamente nos regalas en este artículo. Diez minutos después de leerlo, ya tengo la web funcionando.
    ¡Mil gracias! Así da gusto pasarse a Linux.
    Un saludo.

  3. nada como una buena info para hacer recordar a los que habiamos olvidado tener un linux y sus bondades en nuestra pc :D

  4. oswaldo rodriguez

    gracias muy importante para mi que estoy comenzando en linux, pero si en vez de tener una sola direccion en la web puedo poner dos. una que diga buen dia y otra todo muy bien, como haria, gracias.

  5. Muy buena guia, gracias!

  6. Me ha ayudado mucho, gracias.

  7. Genial el manual. Sencillo y práctico. Ataca los aspectos fundamentales.

    Gracias

  8. buenisimo, habia buscado durante semanas tratando de configurar mi server y aqui me has dado la idea muchas gracias

  9. Excelente Tuto felicidades y gracias por este material, es un gusto que existan personas como tu en linux. (gracias tux)

    Soy libre, eres libre Vive DAKYNUX

  10. Deivis Rodriguez

    Buen material. Felicitaciones.
    Te quiero preguntar si la intruccion para proteger un directorio puede ser utilizada en un .htacces ó como seria para poder hacerlo?
    Por favor si puedes respondeme al correo
    gracias

  11. como hago para entrar via internet a la pagina o servidor q ya cree con apache???? solo entra desde la red local!!!

  12. Me parece un artículo muy bueno, especialmente en el detalle, otros tratan el tema muy por encima. Segui el tutorial y puede ver el ” It works!”, pero tengo un problema al ingresar uno de los dos dominios que montamos en el apache nos devuelve el siguiente mensaje ”

    Forbidden
    You don’t have permission to access / on this server.
    Apache/2.2.3 (Debian) PHP/5.2.0-8+etch11 Server at XXX.XXX.XXX.XXX Port 80

    Podrias ayudarme?
    Gracias.

  13. tengo un servidor web apache2 instalado en una máquina virtual de ubuntu veo la pagina web en ubuntu pero no la veo en windows
    por favor que se puede hacer?

  14. Hola te queria preguntar como puedo crear un instalador del servidor apache en entorno grafico, no tengo idea de como hacerlo

  15. Hola tengo un servidor y tiene 2 targetas de red, tengo otro servidor en el cual estara la page y este mismo tiene MYSQL instalado, pero el servidor que tiene el Apache no tiene nada mas que apache nesecito ayuda con esto nesecito entender para poder hacer las cosas bien.

  16. exelente post :)

  17. Maravilloso trabajo, ahora solo necesito tener un hosting.

  18. No logro hacer que desde fuera de la LAN ingresen a mi pagina, entran solo al index.html que viene por defecto en /var/www/index.html: IT’S WORK..pero si coloco un index.php no lo reconoce. Como deberia configurar apache para poder ingresar desde afuera, tengo ip dinamica.?
    Saludos y gracias.-

  19. Tienes muy buenos tutoriales, bastante explícitos diría yo, gracias por tu tiempo para hacerlos.

    Saludos!!

  20. Que tal, ya instale el apache2, pero me sale el siguiente error

    You don’t have permission to access /desayunos/ on this server.
    Apache/2.2.14 (Ubuntu) Server at 127.0.0.1 Port 80

    como lo corrijo, estoy usando ubuntu 10.4

    Gracias…..

  21. Al de arriba, el problema que te falla es por permisos, al configurar servidor web, tambien tienes que configurar los permisos para las caretas que tienes, y no es recomendable poner el 777 ya que esto genera permisos de escritura a cualquiera, esta configuracion la puedes encontrar en el siguiete tutorial:

    http://www2.linuxparatodos.net/web/comunidad/base-de-conocimiento/-/wiki/Base%20de%20Conocimiento/Servidor+Web

  22. Oie y dentro del directorio virtual, como le hago para mostrar la ruta completa de los archivos que se enlistan!? el directorio virtual en si solo muestra nombre, fecha y peso del archivo.. pero como muestro la ruta completa en nombre!? o el nombre completo!!??

  23. caguen ……

    una semana trabajando apache2 para entenderlo por las explicaciones que nos dieron , taco de hojas .

    nos tokaba buscar lo de tema de identificacion usuarios y me encuentro con esta maravilla .

    enorabuena por el aporte , muy bueno ¡¡¡¡¡

  24. sombra-fantasma

    Hola, muy buen post, esta my completo.
    yo tengo un problema no se si me puedas ayudar a solucionarlo, lo que sucede es que cuando quiero ver mis paginas hechas en PHP, me sale en blanco, solo me permite ver las que estan en HTML, ya lo eh intentado ver desde LOCALHOST, MI DIRECCION IP y 127.0.0.1, pero no me muestra nada.
    Sabes a que se debe ese problema?
    gracias y espero tu respuesta