GNU/Linux >> Tutoriales Linux >  >> Linux

Servir múltiples dominios mediante el uso de hosts virtuales

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. Necesita Listen 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

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 para vh2.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
    

Linux
  1. ¿Cómo cambiar el nombre de varios archivos usando Buscar?

  2. Cómo configurar un subdominio o alojar múltiples dominios usando nginx en el servidor Linux

  3. Uso de SNI para alojar varios certificados SSL en Apache

  4. Múltiples bibliotecas glibc en un solo host

  5. ssh_exchange_identification:conexión cerrada por host remoto (sin usar hosts.deny)

Aloja varios dominios de correo en PostfixAdmin en CentOS/RHEL

Cómo configurar servidores virtuales Apache en Rocky Linux

Cómo configurar servidores virtuales de Apache en Debian 11

Cómo configurar servidores virtuales Apache en Ubuntu 18.04

Cómo configurar servidores virtuales Apache en Ubuntu 20.04

Administración de hosts dedicados