Linux:Powerful Server Administration
上QQ阅读APP看书,第一时间看更新

Hosting multiple websites with a virtual domain

Setting multiple domains on a single server is a very commonly asked question. In fact, it is very easy to do this with virtual host. In this recipe, we will set up two domains on a single server and set up a sub-domain as well. We will also look at IP-based virtual hosts.

Getting ready

You will need access to a root account or an account with sudo privileges.

You will need the Apache server installed and working. This recipe describes configuration for Apache version 2.4

You may need a DNS set up if you want to access configured domains over the Internet.

We will set up two domains, namely example1.dom and example2.com, and a sub-domain, dev.example1.com.

How to do it…

Follow these steps to host multiple websites with a virtual domain:

  1. Change the directory to /var/www and create a directory structure for the required domains and sub-domain. Also create a blank index.html for each domain:
    $ cd /var/www
    $ sudo mkdir -p example1.com/public_html
    $ sudo touch example1.com/public_html
    $ sudo cp -R example1.com example2.com
    $ sudo cp -R example1.com dev.example1.com
    
  2. Change the directory ownership and file permissions on the newly created directories:
    $ sudo chown -R ubuntu:www-data example*
    $ sudo chown -R ubuntu:www-data dev.example1.com
    $ chmod 750 -R example*
    $ chmod 750 -R dev.example1.com
    

    Tip

    Note the use of the wildcard syntax (chmod 750 -R example*). You can use a similar syntax with various other commands in Linux and save some repeated typing or copy and paste work.

  3. Edit the index.html file for each domain with the respective text:
  4. Next, we need to create virtual host configuration for each domain. Change the directory to /etc/apache2/sites-available and copy the default virtual host file 000-default.conf:
    $ cd /etc/apache2/sites-available
    $ sudo cp 000-default.conf example1.com.conf
    
  5. Edit the new virtual host file and set ServerName, DocumentRoot, and other variables to match your environment. The final file should look something like this:
    <VirtualHost *:80>
     ServerName example1.com
     ServerAlias www.example1.com
     DocumentRoot /var/www/example1.com/public_html
     
    ...
    </VirtualHost>
    
  6. Now copy this virtual host file to create example2.com.conf and dev.example1.com.conf and modify the respective settings in each of them. You need to update the serverName, serverAlias, and DocumentRoot parameters.
  7. Here, we are done with the setup and configuration part. Now enable the virtual hosts and reload the Apache server for the settings to take effect:
    $ sudo a2ensite example*
    $ sudo a2ensite dev.example1.com.conf
    $ sudo service apache2 reload
    
  8. You can check all enabled virtual hosts with the following command:
    $ sudo a2query -s
    
  9. Next, to test our setup, we need to configure the hosts' setup on the local system. Open and edit the /etc/hosts file and add host entries. If you have Windows as your local system, you can find the hosts file under %systemroot%\System32\drivers\etc:
  10. Finally, try to access domains by their names. You should see text entered in the respective index.html files for each domain:

How it works…

Multiple domain hosting works with the concept of NamedVirtualHost. We have configured virtual hosts with ServerName and ServerAlias. When a client sends a request with a domain name, it sends a host name in the request headers. This host name is used by Apache to determine the actual virtual host to serve this request. If none of the available virtual hosts match the requested host header, then the default virtual host or the first virtual host will be used to serve the request.

In this example, we have used hosts file to map test domain names with local IP. With the actual domain name, you need to point DNS servers to the IP address of your web server. Generally, all popular hosting providers host their own DNS servers. You need to add these DNS servers to your domain setting with domain registrar. Then, on your hosting side, you need to set respective A records and CNAME records. An A record points to an IP address and the CNAME record is an alias for the A record used for pointing a subdomain to an A record. Your hosting provider should give you details on how to configure domains and subdomains.

In previous versions of Apache server, you might need to enable NameVirtualHost under the configuration file. Find a line similar to #NameVirtualHost 172.20.30.40 and uncomment it by removing the # symbol at the start.

You can also set up IP-based virtual hosts. If you have multiple IP addresses available on your server, you can set the virtual host to listen on a particular IP address. Use the following steps to set up an IP-based virtual host:

  1. Get a list of the available IP addresses:
    $ ifconfig | grep "inet addr"
    ubuntu@ubuntu:~$ ifconfig | grep "inet addr"
    inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
    inet addr:192.168.56.102 Bcast:192.168.56.255 Mask:255.255.255.0
    inet addr:127.0.0.1 Mask:255.0.0.0
    
  2. Edit the virtual host configuration and set it to match the following:
    Listen 80
    <VirtualHost 192.168.56.102>
     DocumentRoot /var/www/example1.com/public_html
     ServerName example1.com
    </VirtualHost>
    

See also