Mapeo de Direcciones y Puertos.

Configurando Apache HTTP Server para que escuche en una dirección y puertos específicos.

Hosts Virtuales Problemas de DNS
Visión General core mpm_common VirtualHost Listen

Cuando httpd se ejecuta, se mapea a una dirección y un puerto en la máquina local, y espera a recibir peticiones. Por defecto, escucha en todas las direcciones de la máquina. Ahora bien, se le puede especificar que escuche en un determinado puerto, o en una sola dirección IP especifica, o una combinación de ambos. A menudo esto se combina con la característica de los Hosts virtuales, que determina como responde el httpd a diferentes direcciones IP, nombres de máquinas y puertos.

La directiva Listen le dice al servidor que acepte peticiones en el puerto o puertos que se le especifiquen al servidor, o a combinaciones de direcciones y puertos. Si sólo se especifica el número del puerto en la directiva Listen, el servidor escuchará en ese puerto pero en todas las interfaces de red. Si además del puerto se le especifica una dirección IP, el servidor escuchará en el puerto y en la interfaz de red asociado a la dirección IP que se le ha especificado en la directiva. Se pueden especificar múltiples directivas Listen para especificar un determinado número de IP´s y puertos por donde el servidor escuchará. El servidor por tanto, responderá a las peticiones en cualquiera de las IP´s y puertos listados en la directiva.

Por ejemplo, para hacer que el servidor escuche en ambos puertos 80 y 8080 en todas sus interfaces de red, se usa lo siguiente:

Listen 80 Listen 8000

Para hacer que el servidor acepte peticiones en el puerto 80 en una sola interfaz de red, usaremos:

Listen 192.0.2.1:80 Listen 192.0.2.5:8000

Las direcciones IPv6 debrán ir entre '[ ]' corchetes como en el siguiente ejemplo:

Listen [2001:db8::a00:20ff:fea7:ccea]:80

Si se superponen directivas de tipo Listen, dará como resultado un error fatal que impedirá que se inicie el servidor.

(48)Address already in use: make_sock: could not bind to address [::]:80

Puede mirar el articulo de la wiki de consejos para solucionar problemas relacionados.

Consideraciones especiales con IPv6

Un creciente número de plataformas implementan ya IPv6, y APR soporta IPv6 en la mayoría de estas plataformas, permitiendo así a httpd asignar sockets IPv6, y manejar las respuestas enviadas a través de IPv6.

Un factor bastante complejo para un administrador del httpd es si un socket IPv6 puede o no manejar tanto conexiones IPv6 como IPv4. El manejo por httpd de conexiones IPv4 con socket IPv6 se debe al mapeo de direcciones IPv4 sobre IPv6, que está permitido por defecto en muchas plataformas, pero no lo está en sistemas FreeBSD, NetBSD y Open BSD, con el fin de que en estas plataformas, cumpla con la política del sistema. En los sistemas que no está permitido el mapeo por defecto, existe un parámetro de configure especial para cambiar éste comportamiento para httpd.

Por otro lado, en algunas plataformas, como Linux y True64, la única forma para el manejo de IPv4 e IPv6 al mismo tiempo es mediante direcciones mapeadas. Si quieres que httpd maneje amos tipos de conexiones IPv4 e IPv6 con el mínimo de sockets, hay que especificar la opción --enable-v4-mapped al configure.

--enable-v4-mapped es la opción que está estipulada por defecto en todos los sistemas menos en FreeBSD, NetBSD y Open BSD, por lo que es probablemente como se compiló su httpd.

Si lo que quiere es manejar sólo conexiones IPv4, independientemente de lo que soporten APR y su plataforma, especifique una dirección IPv4 por cada directiva Listen, como en el siguiente ejemplo:

Listen 0.0.0.0:80 Listen 192.0.2.1:80

Si en cambio, su plataforma lo soporta, y lo que quiere es que su httpd soporte tanto conexiones IPv4 como IPv6 en diferentes sockets (ejemplo.: para deshabilitar mapeo de direcciones IPv4), especifique la opción --disable-v4-mapped al configure. --disable-v4-mapped es la opción por defecto en FreeBSD, NetBSD y OpenBSD.

Especificar el Protocolo en el Listen

El segundo argumento en la directiva Listen el protocolo que es opcional no es algo que se requiera en las configuraciones. Si éste argumento no se especifica, https es el protocolo usado por defecto en el puerto 443 y http para el resto. El protocolo se utiliza para determinar que módulo deberá manejar la petición, y se le aplicarán optimizaciones específicas del protocolo con la directiva AcceptFilter.

Sólo necesitará especificar el protocolo si no está escuchando en un puerto de los que son estándares, por ejemplo si ejecuta un sitio web https en el puerto 8443:

Listen 192.170.2.1:8443 https
Como Funciona en los Hosts Virtuales

La directiva Listen no implementa los Hosts Virtuales - solo le dice al servidor en que direcciones y puertos debe escuchar. Si no hay directiva VirtualHost en uso, el servidor se comportará de la misma manera para todas las peticiones aceptadas. Ahora bien, VirtualHost puede ser usado para especificar un comportamiento diferente en una o varias direcciones o puertos. Para implementar los Hosts Virtuales, antes se le tiene que decir al servidor que direcciones y puertos van a ser usados. Después de esto, se deberá especificar una sección de la directiva VirtualHost especificando direcciones y puertos que se van a usar en el Host Virtual Note que si se configura un VirtualHost para una dirección y puerto en el que el servidor no está escuchando, no se podrá acceder al Host Virtual.