La mayoría de las personas sirven más de un dominio en su servidor en la nube. Ya sea que esté sirviendo diferentes dominios o diferentes subdominios del mismo dominio, el procedimiento es el mismo. Este artículo describe cómo crear hosts virtuales para atender varios dominios y cómo solucionar problemas con las configuraciones de host virtual basadas en nombres de Apache.
Creación de hosts virtuales para múltiples dominios
Cuando un navegador envía una solicitud a la dirección IP de su servidor solicitando el contenido de su nombre de dominio (por ejemplo, https://yourexampledomain.com
), su servidor web ofrece una representación HTTP de su sitio. Si el servidor sirve solo un sitio web, sirve el HTML en su /var/www/html
directorio, comenzando con index.html
. Pero tener un servidor único para cada sitio web que desea servir es costoso y un uso ineficiente de sus recursos.
Hosts virtuales basados en nombres le permite servir contenido para múltiples sitios web desde un servidor.
Una de las primeras líneas en cualquier archivo de configuración de host virtual especifica el nombre de dominio asociado con el host virtual. A continuación se muestra un ejemplo de configuración de host virtual para Apache, sirviendo domain1.com
:
<VirtualHost \*:80>
ServerName domain1.com
ServerAlias www.domain1.com
</VirtualHost>
El siguiente ejemplo muestra una configuración de host virtual para NGINX:
server {
server_name www.domain1.com;
rewrite ^/(.\*) https://domain1.com/$1 permanent;
Cada configuración comienza de forma ligeramente diferente, pero se aplica el mismo principio:ese host virtual en particular responde a las consultas de domain1.com
y www.domain1.com
.
Para servir contenido diferente para diferentes dominios, agrega otro host virtual.
Por ejemplo, tiene un subdominio llamado blog.domain1.com que sirve un blog.
Primero, crea una carpeta en su carpeta public_html con los archivos relevantes para el blog (por ejemplo, una instalación de WordPress).
Luego, crea un host virtual con server_name
o ServerName
especificado como blog.domain1.com
y configúrelo para que apunte a los archivos y carpetas del blog en su public_html
carpeta.
Para obtener más información sobre hosts virtuales, utilice el documento de Apache Hosts virtuales basados en nombres
Solución de problemas
Esta sección le muestra cómo solucionar problemas con configuraciones de host virtual basadas en nombres de Apache. Proporciona comandos útiles para probar su configuración de host virtual, describe cómo interpretar su salida y describe cómo ayudan a solucionar problemas comunes de configuración de host virtual.
Reiniciar Apache
Antes de que pueda diagnosticar un problema, asegúrese de haber reiniciado Apache desde la última vez que realizó cambios en sus archivos de configuración de Apache:
-
Para distribuciones de Red Hat use:
sudo /usr/sbin/httpd -k restart
-
Para distribuciones Debian use:
sudo /usr/sbin/apache2 -k restart
Si Apache le da una advertencia o un mensaje de error, anótelo para más adelante. Su próximo paso es obtener información sobre la configuración del host virtual.
Obtener un informe de configuración
Ejecute -S
comando en el servidor web para verificar la configuración de su host virtual
-
Para distribuciones derivadas de Red Hat, utilice:
sudo /usr/sbin/httpd -S
-
Para distribuciones derivadas de Debian use:
sudo /usr/sbin/apache2 -S
El resultado muestra la configuración del host virtual del archivo de configuración. El siguiente ejemplo muestra el informe de configuración de un servidor configurado con dos hosts virtuales basados en nombres:vh1.example.com y vh2.example.com. Las líneas numeradas se explican siguiendo el ejemplo.
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
[1] \*:80 is a NameVirtualHost
[2] default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
[3] port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
[4] port 80 namevhost vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
[5] Syntax OK
-
La línea [1] informa que el servidor web está escuchando en el puerto predeterminado 80 para todas las direcciones IP que escucha Apache, y que el alojamiento virtual basado en nombres está activado. El * es un comodín que especifica todas las direcciones IP.
-
La línea [2] informa el host virtual predeterminado que el servidor web ServerAlias para cualquier solicitud para la que no se solicita un nombre de host específico. También muestra la ruta al archivo de configuración y el número de línea donde se establece esta configuración.
-
La línea [3] informa el puerto y el nombre de la primera configuración de host virtual encontrada, el archivo en el que está configurado y el número de línea en el que comienza su configuración.
-
La línea [4] informa el puerto y el nombre de la segunda configuración de host virtual encontrada, el archivo en el que está configurado y el número de línea en el que comienza su configuración.
-
La línea [5] informa si la sintaxis de configuración es correcta, aunque eso no significa necesariamente que su sitio esté funcionando
El siguiente resultado fue producido por la siguiente configuración de archivo de host virtual:
NameVirtualHost \*:80 Turns on name-based host resolution and binds the virtual server to IP addresses and ports as in [1] above. The \* is a wildcard specifying all IP addresses.
<VirtualHost \*:80> Configures the first and default virtual host in [2] & [3] above. It is the default because it is the first virtual host whose IP and port matches those in the NameVirtualHost directive before it.
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80> Configures the second virtual host in [4] above.
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Ahora que ha visto el aspecto de una configuración básica de host virtual y cómo se asigna al propio informe de configuración de Apache, puede usar esos informes para ver problemas de configuración comunes. Las siguientes secciones describen algunos de estos problemas y brindan orientación sobre cómo solucionarlos.
Hosts no configurados como hosts virtuales basados en nombres
Si ejecuta httpd -S
informa la siguiente advertencia:
[Wed May 18 15:24:51 2011] [warn] \_default\_ VirtualHost overlap on port 80, the first has precedence
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
\*:80 vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
\*:80 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
Syntax OK
Esta advertencia indica que varios hosts virtuales están intentando usar el mismo "socket" sin configurarse como hosts virtuales basados en nombres. Este error ocurre a menudo cuando los hosts virtuales de Apache se crean por primera vez porque el valor predeterminado NameVirtualHost
directiva se comenta con un símbolo hash. Ese símbolo indica a Apache que ignore la directiva.
Para solucionar este problema en un archivo de configuración predeterminado de Apache, verifique que NameVirtualHost *:80
la directiva no está comentada. Si está trabajando con un archivo de configuración mínimo de Apache, agregue un NameVirtualHost *:80
directiva sobre las configuraciones de host virtual individuales.
El siguiente ejemplo muestra la directiva comentada que provocó el error:
#NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Elemento que falta en la directiva VirtualHost
Si ejecuta httpd -S
informa el siguiente mensaje de error:
Syntax error on line 8 of /etc/httpd/conf/custom/virtualhost.conf:
<VirtualHost> directive requires additional arguments
Este mensaje significa que el VirtualHost
del host virtual a la directiva le falta un elemento necesario. El VirtualHost
directiva es la primera línea de cualquier configuración de host virtual individual. En este caso, el error está en la línea 8 del archivo de configuración /etc/httpd/conf/custom/virtualhost.conf
.
La siguiente es la configuración de Apache que produjo este error anterior:
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Tenga en cuenta que el segundo VirtualHost
directiva no tiene dirección IP o puerto especificado, que es la causa del error.
La siguiente es una versión corregida del ejemplo anterior, con la adición de \*:80
a la directiva del host virtual. Como siempre, el \*
es un comodín que especifica todas las direcciones IP.
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
Los números de puerto no coinciden
Si ejecuta httpd -S
, muestra que un host virtual aparece arriba del is a NameVirtualHost
línea:
VirtualHost configuration:
wildcard NameVirtualHosts and \_default\_ servers:
\*:800 vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
\*:80 is a NameVirtualHost
default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
Syntax OK
En este ejemplo, la prueba de configuración informa el vh2.example.com
configuración antes de que informe el NameVirtualHost
configuración. Es posible que vea este error si la dirección IP o el puerto de VirtualHost no coincide con la dirección IP o el puerto del NameVirtualHost
del servidor web. directiva. En este ejemplo, el informe muestra que vh2.example.com
usa el puerto 800 en lugar del puerto 80. El número de puerto se escribió mal cuando vh2.example.com
Se configuró el puerto de escucha del host virtual. Como resultado, Apache trata vh2.example.com
como un host virtual basado en puerto separado.
El httpd -S
el comando de prueba no advierte sobre este problema porque está permitido configurar hosts virtuales para usar cualquier puerto, como 800, sin que formen parte de la configuración de host virtual basada en el nombre en el mismo servidor.
Si experimenta este error, probablemente verá contenido del host virtual predeterminado (vh1.example.com
en este ejemplo) cuando intenta ver el sitio en su navegador web.
Para ayudarlo a asignar la salida anterior a su archivo de configuración, a continuación se muestra la configuración del host virtual que generó este error:
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:800>
ServerName vh2.example.com
DocumentRoot /var/www/vhosts/vh2
</VirtualHost>
El directorio raíz del documento no existe
Si ejecuta httpd -S
informa el siguiente error:
Warning: DocumentRoot [/etc/httpd/var/www/vhosts/vh2] does not exist
Este error indica que el directorio especificado contiene los archivos del sitio web para vh2.example.com
host virtual no existe, o que Apache no puede acceder a él. Pueden aparecer errores similares para cualquiera de las rutas de archivo especificadas en una configuración de host virtual, como las rutas a los archivos de registro del host virtual.
Para corregir este error, asegúrese de haber creado el directorio. Si lo creó, verifique que no haya errores en DocumentRoot
directiva. Un error común es omitir la barra oblicua inicial de la ruta (/). Omitir la barra inclinada le indica a Apache que lea la ruta:DocumentRoot
ruta en este caso, como una ruta relativa, es decir, como una ruta relativa al ServerRoot
de la configuración principal de Apache camino.
El siguiente ejemplo muestra solo una de las formas en que se crea este error. La ruta para DocumentRoot
La directiva en el primer host virtual comienza con una barra inclinada pero la segunda no.
ServerRoot /etc/httpd
NameVirtualHost \*:80
<VirtualHost \*:80>
ServerName vh1.example.com
DocumentRoot /var/www/vhosts/vh1
</VirtualHost>
<VirtualHost \*:80>
ServerName vh2.example.com
DocumentRoot var/www/vhosts/vh2
</VirtualHost>
Uso de cURL para probar su sitio
Después de verificar los archivos de configuración del host virtual y el httpd -S
el comando no informa problemas, intente acceder a su sitio usando cURL:
curl -I www.example.com
La salida debería verse así:
HTTP/1.1 200 OK
Date: Sat, 07 May 2011 15:09:50 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Mon, 25 Apr 2011 11:07:43 GMT
ETag: "2c32e-77-4a1bc37723dc0"
Accept-Ranges: bytes
Content-Length: 119
Content-Type: text/html; charset=UTF-8
La primera línea muestra el código de estado. Quiere ver 200 OK
, como se muestra en el ejemplo. Si eso es lo que ve, pruebe el servidor web con su navegador, pero considere que su navegador podría mostrar una página en caché.
Si no ve 200 OK
, es posible que vea uno de los siguientes mensajes comunes:
-
curl: (6) Couldn't resolve host vh1.example.com
Si cURL informa que no puede encontrar el host, verifique que haya un registro A para el dominio que apunte a la dirección IP correcta para su servidor. Puedes usar la excavación para hacer esto:
dig vh1.example.com
-
curl: (7) couldn't connect to host
Verifique que sus archivos de configuración de Apache incluyan el
Listen
necesario directivas y que no están comentadas. NecesitaListen 80
como mínimo.Otra forma de verificar esto es verificar el registro de errores. El registro de errores predeterminado está en
/var/log/httpd/error_log
en sistemas Red Hat y/var/log/apache2/error_log
en sistemas Debian. Si no se especifica ningún puerto para que Apache escuche, el mensaje no hay conectores de escucha disponibles, el apagado sigue al intento de reinicio de Apache.[notice] SIGHUP received. Attempting to restart no listening sockets available, shutting down Unable to open logs
-
HTTP/1.1 403 Forbidden
Esta respuesta indica que los permisos que permiten el acceso de Apache a la página que está solicitando no son correctos. Tal vez los permisos del directorio sean incorrectos, o podría ser la propia página.
También puede ver una respuesta 403 en las siguientes situaciones:
- The `DocumentRoot` contains no index file—-typically named `index.html` or `index.php`. Note that the file name is case sensitive.
- The virtual host doesn't contain a `DirectoryIndex` directive specifying the default index file.
Los registros de errores de Apache generalmente muestran qué directorio o archivo tiene los permisos configurados incorrectamente. Los hosts virtuales individuales podrían escribir errores en sus propios registros si estuvieran configurados para ello, por lo tanto, verifique estos registros también.
No se desanime por la cantidad de datos en los archivos de registro de un servidor ocupado. En su lugar, utilice el comando tail para ver de forma selectiva solo las diez líneas más recientes de un registro. Por ejemplo:
tail /var/log/apache2/error\_log
Puede ver nuevas entradas a medida que se agregan al registro de errores, o cualquier registro, mientras prueba el servidor si le indica al tail
comando para "seguir" el registro. Por ejemplo:
tail -f /var/log/httpd/error\_log
Errores comunes relacionados con los permisos
Los siguientes son ejemplos de algunos errores de configuración comunes relacionados con los permisos que pueden aparecer en los registros de Apache:
-
La siguiente entrada de registro muestra que los permisos en
index.html
archivo paravh2.example.com
están denegando el acceso a Apache.[error] [client 203.0.113.96] (13)Permission denied: access to /index.html denied
-
La siguiente entrada de registro muestra que los permisos en
/var/www/vhosts/vh2
están bloqueando la solicitud de lectura de Apache.[error] [client 203.0.113.96] (13)Permission denied: file permissions deny server access: /var/www/vhosts/vh2/index.html
-
La siguiente entrada de registro muestra que Apache no tiene permisos de ejecución o lectura en uno de los directorios anteriores
DocumentRoot
.[error] [client 203.0.113.96] (13)Permission denied: access to / denied