Servidor HTTP Apache

El Servidor HTTP Apache es un servicio de red y requiere de ciertos permisos para su ejecución, solo el usuario root puede configurarlo (usarás el editor de texto nano) y operar su inicio (/etc/rc.d/rc.httpd start) y detención (/etc/rc.d/rc.httpd stop).

Configuración del Servidor HTTP Apache

Información sobre Apache en el S.O.

Puesto que el Servidor HTTP Apache es un servicio de sistema trabajaremos con la cuenta de usuario root.

  • El archivo ejecutable del Servidor HTTP Apache se llama httpd, en otros sistemas operativos o distribuciones de linux se llama apache o apache2.

     root@servidor:~# which httpd
     /usr/sbin/httpd
    
  • Para obtener la versión del Servidor HTTP Apache con la cual estamos trabajando:

     root@servidor:~# httpd -v
     Server version: Apache/2.4.25 (Unix)
     Server built:   Dec 23 2016 13:48:14
    

    La documentación oficial del Servidor HTTP Apache para la versión 2.4 se encuentra en http://httpd.apache.org/docs/2.4/.

  • Para obtener las opciones con las que fue compilado:

     root@servidor:~# httpd -V
        AH00558: httpd: Could not reliably determine the server's fully qualified domain name,
        using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
     Server version: Apache/2.4.25 (Unix)
     Server built:   Dec 23 2016 13:48:14
     Server's Module Magic Number: 20120211:67
     Server loaded:  APR 1.5.2, APR-UTIL 1.5.4
     Compiled using: APR 1.5.2, APR-UTIL 1.5.4
     Architecture:   64-bit
     Server MPM:     event
       threaded:     yes (fixed thread count)
         forked:     yes (variable process count)
     Server compiled with....
      -D APR_HAS_SENDFILE
      -D APR_HAS_MMAP
      -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
      -D APR_USE_SYSVSEM_SERIALIZE
      -D APR_USE_PTHREAD_SERIALIZE
      -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
      -D APR_HAS_OTHER_CHILD
      -D AP_HAVE_RELIABLE_PIPED_LOGS
      -D DYNAMIC_MODULE_LIMIT=256
      -D HTTPD_ROOT="/usr"
      -D SUEXEC_BIN="/usr/bin/suexec"
      -D DEFAULT_PIDLOG="/var/run/httpd.pid"
      -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
      -D DEFAULT_ERRORLOG="logs/error_log"
      -D AP_TYPES_CONFIG_FILE="/etc/httpd/mime.types"
      -D SERVER_CONFIG_FILE="/etc/httpd/httpd.conf"
    

    Durante su ejecución el Servidor HTTP Apache escribe logs (registros) de las operaciones que realiza, dichos logs los encontrarás en el directorio /var/log/httpd.

  • Para determinar su archivo de configuración:

     root@servidor:~# httpd -V | grep SERVER_CONFIG_FILE
        AH00558: httpd: Could not reliably determine the server's fully qualified domain name,
        using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
     -D SERVER_CONFIG_FILE="/etc/httpd/httpd.conf"
    

    En la mayoría de documentación que encuentres en la web sobre el Servidor HTTP Apache su archivo de configuración se llama httpd.conf que dependiendo del sistema operativo o de la distribución de GNU/Linux que uses se ubicará en algún directorio dentro de /etc. En Slackware Linux el archivo de configuración del Servidor HTTP Apache se ubica en el directorio /etc/httpd. Ya que el archivo de configuración del Servidor HTTP Apache es muy grande se subdivide en otros archivos de configuración dentro del directorio /etc/httpd/extra.

  • Para determinar el directorio raíz (DocumentRoot) de los archivos expuestos por Servidor HTTP Apache al exterior:

     root@servidor:~# egrep '^DocumentRoot' /etc/httpd/httpd.conf
     DocumentRoot "/srv/httpd/htdocs"
    

    Nota: /srv/httpd es un vínculo a /var/www, por lo que el directorio /srv/httpd/htdocs es en realidad el directorio /var/www/htdocs.

  • Para obtener una lista de los modulos disponibles en el Servidor HTTP Apache:

     root@servidor:~# httpd -M
        AH00558: httpd: Could not reliably determine the server's fully qualified domain name,
        using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
      Loaded Modules:
       core_module (static)
       so_module (static)
       http_module (static)
       ...
       autoindex_module (shared)
       dir_module (shared)
       alias_module (shared)
    

    El Servidor HTTP Apache tiene módulos externos a él, los cuales agregan características y opciones que nos pueden ser útiles en ciertas situaciones.

  • Para determinar si está en ejecución el Servidor HTTP Apache:

     root@servidor:~# netstat -plutn
     Active Internet connections (only servers)
     Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
     tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      601/httpd
    

    En este caso está en ejecución, atendiendo (LISTEN) conexiones en todas las interfaces de red en el puerto TCP 80 (0.0.0.0:80).

Administración del proceso del Servidor HTTP Apache:

De forma manual, por el usuario root:

  • Para iniciar al proceso del Servidor HTTP Apache: apachectl start
  • Para detener al proceso del Servidor HTTP Apache: apachectl stop
  • Para reiniciar el proceso del Servidor HTTP Apache: apachectl restart

Sin embargo, en Slackware Linux existe un script de init que se encarga de esto: /etc/rc.d/rc.httpd. Esta es la manera recomendada de administrar el proceso del Servidor HTTP Apache en Slackware Linux. Para ésto debes de asignar permisos de ejecución al archivo /etc/rc.d/rc.httpd:

root@servidor:~# chmod +x /etc/rc.d/rc.httpd
  • Para iniciar al proceso del Servidor HTTP Apache: /etc/rc.d/rc.httpd start
  • Para detener al proceso del Servidor HTTP Apache: /etc/rc.d/rc.httpd stop
  • Para reiniciar al proceso del Servidor HTTP Apache: /etc/rc.d/rc.httpd restart

Los anteriores comandos tienen el mismo efecto que el comando apachectl, únicamente que al momento de iniciar a Slackware Linux, él se encargará de iniciar automáticamente al Servidor HTTP Apache y de igual forma al momento de apagar a Slackware Linux, él se encargará de detenerlo.

Configuración básica de Apache

La mayoría de las opciones a configurar del Servidor HTTP Apache se encuentran en su archivo de configuración: /etc/httpd/httpd.conf. Cabe hacer notar que el Servidor HTTP Apache con su configuración por default ya funciona, lo único que configuraremos hasta este momento será su ServerName con lo que evitaremos ver un mensaje de advertencia al momento de ejecutarlo:

httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1.
Set the 'ServerName' directive globally to suppress this message`.

Nota que las líneas que inician con el carácter # son comentarios.

  1. Localiza la línea:

     #ServerName www.example.com:80
    

    y deja la como:

     ServerName localhost:80
    
  2. Guarda tus modificaciones a /etc/httpd/httpd.conf.

    Recomendación: al momento de hacer una modificación a /etc/httpd/httpd.conf revisa que su sintaxis es la correcta. Para esto ejecuta: httpd -t.

     root@servidor:~# httpd -t
     Syntax OK
    
  3. Reinicia al Servidor HTTP Apache: /etc/rc.d/rc.httpd restart

Acceso al Servidor HTTP Apache

Para acceder haremos uso de un navegador web, simplemente visita la dirección http://127.0.0.1 o bien http://localhost y obtendrás el mensaje It works! en el navegador web por parte del Servidor HTTP Apache.

VirtualHost

Se creará un Host Virtual (VirtualHost) en el Servidor HTTP Apache basado en el Nombre de Dominio servidor.red.local, de tal forma que cuando visitemos con el navegador web a http://servidor.red.local accedamos al contenido del directorio /home/www/servidor.red.local.

  1. Agrega una nueva entrada en el archivo /etc/hosts para relacionar la actual dirección IP de la computadora con el nombre de dominio servidor.red.local:

    • Obten la dirección IP de la interfaz de red eth0, ya sea con el comando ifconfig eth0 o bien con ip addr show eth0. En mi caso es 10.0.2.15:

        root@servidor:~# ifconfig eth0
        eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
         inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
         inet6 fe80::a00:27ff:fe26:f0d2  prefixlen 64  scopeid 0x20<link>
         ether 08:00:27:26:f0:d2  txqueuelen 1000  (Ethernet)
         RX packets 5352  bytes 1129882 (1.0 MiB)
         RX errors 0  dropped 0  overruns 0  frame 0
         TX packets 3282  bytes 512548 (500.5 KiB)
         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
      
    • Agrega la siguiente línea al final del archivo /etc/hosts en base a la dirección IP de la computadora.

        10.0.2.15    servidor    servidor.red.local
      
    • Realiza una prueba enviando un ping al dominio servidor.red.local:

       root@servidor:~# ping -c4 servidor.red.local
       PING servidor.red.local (10.0.2.15) 56(84) bytes of data.
       64 bytes from servidor.red.local (10.0.2.15): icmp_seq=1 ttl=64 time=0.027 ms
       64 bytes from servidor.red.local (10.0.2.15): icmp_seq=2 ttl=64 time=0.054 ms
       64 bytes from servidor.red.local (10.0.2.15): icmp_seq=3 ttl=64 time=0.041 ms
       64 bytes from servidor.red.local (10.0.2.15): icmp_seq=4 ttl=64 time=0.048 ms
       --- servidor.red.local ping statistics ---
       4 packets transmitted, 4 received, 0% packet loss, time 2999ms
       rtt min/avg/max/mdev = 0.027/0.042/0.054/0.012 ms
      

    Si todo ha salido bien, puedes continuar.

  2. Modifica el archivo de configuración del Servidor HTTP Apache:

    Localiza la línea:

     #Include /etc/httpd/extra/httpd-vhosts.conf
    

    y deja la como:

     Include /etc/httpd/extra/httpd-vhosts.conf
    

    Localiza la línea:

     #LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
    

    y dejala como:

     LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
    
  3. Renombra el archivo /etc/httpd/extra/httpd-vhosts.conf:

     root@servidor:~# mv /etc/httpd/extra/httpd-vhosts.conf /etc/httpd/extra/httpd-vhosts.conf.orig
    
  4. Crea un nuevo archivo /etc/httpd/extra/httpd-vhosts.conf con el siguiente contenido:

     <VirtualHost *:80>
         DocumentRoot "/srv/httpd/htdocs"
         ServerName localhost
         ErrorLog "/var/log/httpd/error_log"
         CustomLog "/var/log/httpd/access_log" common
     </VirtualHost>
     <VirtualHost *:80>
         DocumentRoot "/home/www/servidor.red.local"
         ServerName servidor.red.local
         ErrorLog "/var/log/httpd/servidor.red.local/error_log"
         CustomLog "/var/log/httpd/servidor.red.local/access_log" common
         Options FollowSymLinks
         RewriteEngine on
         <Directory "/home/www/servidor.red.local">
             AllowOverride FileInfo
             Require all granted
             Options +Indexes
         </Directory>
     </VirtualHost>
    
  5. Crea los directorios requeridos según la configuración para el Host Virtual:

     root@servidor:~# mkdir -p /home/www/servidor.red.local
     root@servidor:~# mkdir -p /var/log/httpd/servidor.red.local
    
  6. Asigna como propietario del directorio /home/www/servidor.red.local al usuario alumno:

     root@servidor:~# chown -R alumno /home/www/servidor.red.local
    
  7. Corrobora la correcta configuración del Servidor HTTP Apache y VirtualHost:

     root@servidor:~# httpd -S
     VirtualHost configuration:
     *:80                   is a NameVirtualHost
              default server localhost (/etc/httpd/extra/httpd-vhosts.conf:1)
              port 80 namevhost localhost (/etc/httpd/extra/httpd-vhosts.conf:1)
              port 80 namevhost servidor.red.local (/etc/httpd/extra/httpd-vhosts.conf:7)
     ServerRoot: "/usr"
     Main DocumentRoot: "/srv/httpd/htdocs"
     Main ErrorLog: "/var/log/httpd/error_log"
     Mutex rewrite-map: using_defaults
     Mutex default: dir="/var/run/" mechanism=default
     PidFile: "/var/run/httpd.pid"
     Define: DUMP_VHOSTS
     Define: DUMP_RUN_CFG
     User: name="apache" id=80
     Group: name="apache" id=80
    
  8. Reinicia al Servidor HTTP Apache para que haga uso de su nueva configuración: /etc/rc.d/rc.httpd restart

  9. Finalmente ingresa con el navegador web a http://servidor.red.local. Veremos el contenido del directorio /home/www/servidor.red.local. Dicho directorio tiene como propietario al usuario alumno por lo que podrás crear/subir archivos en él.

Acceso desde Windows a servidor.red.local

En Windows busca un archivo con nombre hosts (muy similar a /etc/hosts de GNU/Linux), posiblemente lo encuentres en el directorio C:\Windows\System32\drivers\etc, y agrega al final la línea

10.0.2.15    servidor    servidor.red.local

Accede con un navegador web desde Windows a http://servidor.red.local.

Uso de otro puerto TCP

Para que el Servidor HTTP Apache atienda solicitudes de red en otro puerto TCP, distinto al puerto TCP 80, se modifica su archivo de configuración (/etc/httpd/httpd.conf) así como el archivo de configuración de VirtualHost (/etc/httpd/extra/httpd-vhosts.conf).

  1. En el archivo de configuración del Servidor HTTP Apache localiza la línea Listen 80 y agrega justo despues de ella una línea con la opción Listen 1234.

    NOTA: al haber dos opciones Listen con distinto puerto TCP hará que el Servidor HTTP Apache atienda solicitudes de red en ambos puertos TCP.

  2. En el archivo de configuración de VirtualHost modifica el elemento <VirtualHost *:80> quedando como <VirtualHost *:1234>.

    NOTA: cada elemento VirtualHost queda expuesto en algún puerto TCP establecido por la opción Listen.

Como ejemplo:

root@servidor:~# grep -E '^Listen' /etc/httpd/httpd.conf
Listen 80
Listen 1234
root@servidor:~# grep '<VirtualHost' /etc/httpd/extra/httpd-vhosts.conf
<VirtualHost *:80>
<VirtualHost *:1234>
root@servidor:~# cat /etc/httpd/extra/httpd-vhosts.conf
<VirtualHost *:80>
    DocumentRoot "/srv/httpd/htdocs"
    ServerName localhost
    ErrorLog "/var/log/httpd/error_log"
    CustomLog "/var/log/httpd/access_log" common
</VirtualHost>
<VirtualHost *:1234>
    DocumentRoot "/home/www/servidor.red.local"
    ServerName servidor.red.local
    ErrorLog "/var/log/httpd/servidor.red.local/error_log"
    CustomLog "/var/log/httpd/servidor.red.local/access_log" common
    Options FollowSymLinks
    RewriteEngine on
    <Directory "/home/www/servidor.red.local">
        AllowOverride FileInfo
        Require all granted
        Options +Indexes
    </Directory>
</VirtualHost>

NOTA: recuerda ejecutar httpd -t y httpd -S para determinar la correcta sintaxis en los archivos de configuración editados.

Al terminar reinicia al Servidor HTTP Apache y con netstat -plutn observa su ejecución en ambos puertos TCP asignados.

En las lecturas con respecto al protocolo HTTP encontrarás términos como GET, POST, Header o Cabecera, User-Agent, etc. Para que dichos términos tengan un sentido más práctico, mientras el Servidor HTTP Apache está en ejecución, en Firefox pulsa el juego de teclas Ctrl+Shift+Q, lo anterior te abrirá una ventana incrustada en Firefox, dirígete a http://127.0.0.1:1234 y observa la información otorgada por Web Developer Tools en su pestaña Red o Network.

Lecturas