Saltar la navegación

Directivas básicas

El servidor Apache dispone de muchos módulos y directivas para establecer su configuración, algunas directivas importantes y que se establecen desde el inicio en apache2.conf las vamos a describir en este punto.

Hay que tener en cuenta algunas reglas al escribir directivas, estas son:

  1. Hay que escribirlas en una sola línea, y si hubiera que dividirlas, tenemos que usar la barra invertida ( \ ) como en los script de GNU/Linux, es decir, después de la barra invertida hay que pulsar la tecla ENTER, no puede ir ningún otro carácter.
  2. No se tiene en cuenta la diferencia entre mayúsculas y minúsculas (M = m), pero muchos argumentos sí.
  3. Los argumentos se separan con espacios y si alguno lleva un espacio hay que enmarcarlo entre comillas.
  4. Aunque ya se ha dicho, los comentarios no pueden ir en la misma línea que una directiva.
  5. Las líneas en blanco y los espacios y tabuladores que se pongan al inicio de una línea se ignoran, por lo que podemos utilizar todo esto en nuestro favor, para dejar más claro el fichero de configuración.

Hay dos tipos de directivas, las simples, que establecen alguna característica de Apache, pueden llevar argumentos o no, y las directivas contenedoras, las cuales pueden agrupar una o varias directivas simples o contenedoras, que se aplicarán todas a algún objeto.

Cuando se describen directivas, una información que se da es la de contexto, que indica dónde se acepta la directiva en los ficheros de configuración, mostrando una lista separada por comas de uno o más de los siguientes valores:

  • server config: indica que la directiva puede usarse en los ficheros de configuración del servidor (apache2.conf, etc.), pero no dentro de contenedores como <VirtualHost> o <Directory>, ni tampoco dentro de ficheros .htaccess, a menos que explícitamente se indique.
  • virtual host: significa que la directiva puede estar dentro de un contenedor <VirtualHost>.
  • directory: informa que la directiva puede ponerse dentro de los contenedores: <Directory>, <Location>, <Files>, <If> y <Proxy>.
  • .htaccess: permite que la directiva pueda aparecer dentro de ficheros .htaccess de contexto de directorio. Aunque podría no ser procesada, dependiendo de la configuración que tenga la directiva AllowOverride en ese momento.

Directiva ServerRoot

Sintaxis: ServerRoot ruta-a-directorio

Contexto: server config

La directiva ServerRoot establece la ruta absoluta en la que se encuentra la configuración de Apache. Para argumentos de ruta de otras directivas de configuración, como por ejemplo Include o LoadModule, cuando se escriben las rutas de forma relativa, se consideran relativas a este directorio.

En Debian, ServerRoot posee el valor por defecto /etc/apache2, y en apache2.conf aparece comentada, pues es raro cambiar su valor.

# cat /etc/apache2/apache2.conf
...
#ServerRoot "/etc/apache2"
...

Esta directiva está implementada en el módulo core, como puede verse en la documentación oficial a donde nos dirige el enlace anterior:

Módulo:   core

El módulo core se encuentra activo siempre, pues es uno de los módulos que forman el núcleo de Apache y se encuentran dentro del propio ejecutable (/usr/sbin/apache2), por lo que se cargan siempre.

Para ver los módulos que contiene el ejecutable de Apache podemos usar la opción -l:

# apache2 -l
Compiled in modules:
  core.c
  mod_so.c
  mod_watchdog.c
  http_core.c
  mod_log_config.c
  mod_logio.c
  mod_version.c
  mod_unixd.c

Recordar que además de estos módulos, Apache dispone de otros que están disponibles en /etc/apache2/mods-available y que activamos enlazándolos en la carpeta /etc/apache2/mods-enabled. Estos módulos están implementados como librerías dinámicas y depositados en el directorio /usr/lib/apache2/modules. Los ficheros .load de los módulos nos muestran cuál es la librería concreta del módulo.

# ls -l /etc/apache2/mods-enabled/status.*
lrwxrwxrwx 1 root root 29 feb 17 12:51 /etc/apache2/mods-enabled/status.conf -> ../mods-available/status.conf
lrwxrwxrwx 1 root root 29 feb 17 12:51 /etc/apache2/mods-enabled/status.load -> ../mods-available/status.load
# cat /etc/apache2/mods-enabled/status.load
LoadModule status_module /usr/lib/apache2/modules/mod_status.so
# ls -l /usr/lib/apache2/modules/mod_status.so
-rw-r--r-- 1 root root 26832 abr 13  2023 /usr/lib/apache2/modules/mod_status.so

Además de todos estos módulos, existen otros que para usarlos hay que instalarlos como cualquier otro software. Estos módulos se encuentran en paquetes cuyos nombres son de la forma libapache2-mod-*. Podemos hacer una búsqueda de ellos con apt-cache:

# apt-cache search libapache2-mod-
libapache2-mod-upload-progress - upload progress support for the Apache web server
libapache2-mod-md - transitional package
libapache2-mod-proxy-uwsgi - transitional package
libapache2-mod-xforward - Apache module implements redirection based on X-Forward response header
libapache2-mod-apparmor - changehat AppArmor library as an Apache module
...

Como ya se mencionó, podemos ver todos los módulos de Apache que están cargados en memoria (activos), haciendo uso del comando apache2ctl:

# apache2ctl -M
Loaded Modules:
core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
...

Directiva Timeout

Sintaxis: TimeOut segundos

Contexto: server config, virtual host
Valor por defecto: 60

Establece el tiempo en segundos que el servidor esperará como máximo para recibir peticiones o enviar respuestas durante la comunicación, tras este tiempo el servidor cierra la conexión.

En apache2.conf de Debian se cambia el valor por defecto por 300 segundos.

# cat /etc/apache2/apache2.conf
...
TimeOut 300
...

Las tres directivas siguientes están relacionadas con el rendimiento del servidor Apache.

Directiva KeepAlive

Sintaxis: KeepAlive On|Off

Contexto: server config, virtual host
Valor por defecto: On

En un principio, el protocolo HTTP, para cada petición/respuesta abría y cerraba una conexión TCP, para mejorar el rendimiento del protocolo se crean las conexiones persistentes, las cuales permiten que en una misma conexión TCP se puedan realizar múltiples peticiones/respuestas, estamos hablando entonces de sesiones HTTP de larga duración. En algunos casos, se ha demostrado que esto da como resultado una aceleración de casi el 50% en los tiempos de latencia para documentos HTML con muchas imágenes. A partir de HTTP/1.1, las conexiones persistentes son las predeterminadas, pero esto puede modificarse.

# cat /etc/apache2/apache2.conf
...
KeepAlive On ...

Directiva MaxKeepAliveRequests

Sintaxis: MaxKeepAliveRequests número

Contexto: server config, virtual host
Valor por defecto: 100

Esta directiva nos sirve para establecer el máximo de solicitudes/respuestas permitidas en una misma conexión persistente. Para indicar un número ilimitado se utiliza el valor 0. Un valor alto aumenta el rendimiento del servidor. Llegar al máximo de solicitudes/respuestas dentro de la misma conexión TCP, implica cerrar dicha conexión, y abrir una nueva si la comunicación tiene que seguir.

# cat /etc/apache2/apache2.conf
...
MaxKeepAliveRequests 100 ...

Directiva KeepAliveTimeout

Sintaxis: KeepAliveTimeout num[ms]

Contexto: server config, virtual host
Valor por defecto: 5

Especifica cuántos segundos o milisegundos se esperará una solicitud del cliente antes de cerrar la conexión persistente. Una vez recibida una solicitud, se aplica el valor de tiempo de espera especificado por la directiva Timeout. Este valor hay que cuidarlo mucho, sobre todo en servidores con alta carga, ya que podría afectar al rendimiento por el tiempo que se tarda en liberar los recursos reservados para conexiones que están ociosas.

Aunque esta directiva puede usarse en un contexto de host virtuales, realmente solo tendrá efecto el valor dado en el host virtual por defecto (el primero por orden alfabético), obviándose el valor de dicha directiva en el resto de host virtuales.

# cat /etc/apache2/apache2.conf
... KeepAliveTimeout 5
...

Directiva User

Sintaxis: User id-usuario

Contexto: server config

Indica el usuario que ejecutará el proceso del servidor Apache, lo cual tiene sus implicaciones a nivel de permisos. Se puede especificar tanto el nombre del usuario como su UID. No es aconsejable poner al root en esta directiva.

En Debian, el valor establecido es www-data, el cual se establece a través de la variable APACHE_RUN_USER que se encuentra en /etc/apache2/envvars.

# cat /etc/apache2/apache2.conf
... User ${APACHE_RUN_USER}
...

Directiva Group

Sintaxis: Group id-grupo

Contexto: server config

Indica cuál será el grupo efectivo del proceso Apache, y tiene que ser un grupo del usuario especificado anteriormente. Para asignarlo podemos usar tanto el nombre del grupo como su GID. No es aconsejable poner el grupo root en esta directiva.

En Debian, el valor establecido es www-data, el cual se establece a través de la variable APACHE_RUN_GROUP que se encuentra en /etc/apache2/envvars.

# cat /etc/apache2/apache2.conf
... User ${APACHE_RUN_GROUP}
...

Directiva Include

Sintaxis: Include [optional|strict] ruta-a-fichero|ruta-a-directorio|wildcard

Contexto: server config, virtual host, directory

Con esta directiva incluimos ficheros de configuración dentro de otros ficheros de configuración.

En el caso de incluir un directorio, se incluirán todos los ficheros que tenga ese directorio y sus subdirectorios. Es algo no recomendable, pues accidentalmente se podría incluir en el directorio un fichero que no entendiera Apache, con el consiguiente mensaje de error.

Tanto si el fichero o el directorio no existieran, se producirá un error.

Es posible usar wildcard del estilo de expansión de ficheros tanto para ruta-a-fichero como para ruta-a-directorio. Es esto lo que quiere decir la aparición de la palabra wildcard en la sintaxis.

En el caso de usar wildcard con ficheros, si no existieran ficheros coincidentes, no sucederá nada, pero en el caso de usar wildcard con directorios, la no coincidencia con ninguno, producirá un error. Para homogeneizar este comportamiento, se puede usar optional, que hace que no suceda nada en ninguno de los casos anteriores, y strict, que hace lo contrario, producir un error en ambos casos.

# cat /etc/apache2/apache2.conf
... Include ports.conf
...

Directiva IncludeOptional

Sintaxis: IncludeOptional ruta-a-fichero|ruta-a-directorio|wildcard

Contexto: server config, virtual host, directory

Esta directiva es equivalente a usar la directiva Include con optional, por lo que está pensada para especificar ficheros y/o directorios con wildcard.

# cat /etc/apache2/apache2.conf
... IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
...
IncludeOptional conf-enabled/*.conf
...
IncludeOptional sites-enabled/*.conf
...

Directiva Listen

Sintaxis: Listen [Dirección-IP:]puerto [protocolo]

Contexto: server config

Esta directiva es obligatoria y no ponerla implica que el servidor no se inicie.

La directiva Listen especifica una dirección IP y su correspondiente puerto por el que el servidor escuchará peticiones. Si no se especifica ninguna IP, se escuchará por todas las interfaces de red disponibles en el servidor utilizando el puerto dado. La directiva puede repetirse para especificar más de una IP y puerto.

En debian la directiva Listen se incluye a través del fichero /etc/apache2/ports.conf, y su valor indica que se escuchen peticiones en el puerto 80 de todas las interfaces de red del servidor.

# cat /etc/apache2/ports.conf
... Listen 80
...

Si la dirección IP es IPv6, esta debe estar encerrada entre corchetes, por ejemplo:

Listen [2001:db8::c001:53ab:add1:e487]:80

Por último, el valor de protocolo puede ser http o https, para indicar a qué protocolo afecta la configuración de IP y puerto. Por defecto se asumen el protocolo http.