- 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:

  • 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

Configurar Apache

Configuración general del servidor

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">

Configurar los hosts

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:

  • 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 [email protected]
  • 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
  • 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

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

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

    no hotlink

    Recursos

  • 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

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


Article printed from Estréllate y Arde: https://www.estrellateyarde.org

URL to article: https://www.estrellateyarde.org/discover/servidor-http-en-linux

Copyright © 2010 Estrellate y Arde