Apache Virtual Hosting: Name-Based and IP-Based Virtual Hosts in RHEL Systems

Virtual Hosting is a concept where multiple websites or domains are hosted on a single server, which is done to reduce resource overhead and running costs of a business or organization.

Apache web server simplifies hosting multiple sites by allowing system administrators to easily configure virtual hosts for each website. Virtual hosting can either be IP-based or name-based.

In this tutorial, we explore how to set up virtual hosting in RHEL-based distributions such as Fedora, CentOS Stream, Rocky Linux, and Alma Linux using both IP-based and name-based virtual hosts in Linux.

Apache Virtual Hosting in Linux
Apache Virtual Hosting in Linux

The concepts of Shared Web Hosting and Reseller Web Hosting are based primarily on this feature of Apache.

Types of Apache Virtual Hosting in Linux

There are two types of Virtual Hosting is available with Apache.

Name Based Virtual Hosting

In this type of hosting, several domains or websites can be hosted on a single server using just a single IP address. Simply put, all domains will share a single IP address. This is the easiest virtual hosting type to configure since all you need to do is map the domain names to the IP address and then configure Apache virtual hosts for each of the domain names.

Apache Name Based Virtual Hosting-in-Linux
Apache Name-Based Virtual Hosting-in-Linux

IP Based Virtual Hosting

IP-based virtual hosting is where each domain is assigned a unique IP address. These IP addresses can be attached to the server using multiple NIC cards or a single NIC card.

Apache IP Based Virtual Hosting in Linux
Apache IP-Based Virtual Hosting in Linux

Testing Environment

  • OSFedora 34
  • ApplicationApache Web Server
  • IP Address192.168.2.105
  • IP Address192.168.2.106
  • Domainwww.mydomain1.com
  • Domainwww.mydomain2.com

How to Setup IP Based and Name-Based Apache Virtual Hosts

Before you get started, ensure that the Apache web server is installed on your system using the dnf command as shown.

$ sudo dnf install httpd -y
Install Apache in Linux
Install Apache in Linux

Setup Name-Based Virtual Hosting

The first step in setting up name-based virtual hosting is to set up domain name resolution in the /etc/hosts file. Therefore, run the following commands as root user to add the domain name entries pointing to the host’s IP address.

$ echo '192.168.2.105 www.mydomain1.com' >> /etc/hosts
$ echo '192.168.2.105 www.mydomain2.com' >> /etc/hosts

The next step is to create a directory that will contain the website files. Therefore, we will create two directories for the virtual hosts in the Document Root which is the /var/www/html folder in the Apache configuration.

$ sudo mkdir /var/www/html/mydomain1.com/
$ sudo mkdir /var/www/html/mydomain2.com/

The next step is to modify the virtual host file which will instruct Apache the IP to listen on for incoming Apache web server requests for all the domain names. Therefore, open the Apache configuration file using your preferred text editor.

$ sudo vim /etc/httpd/conf/httpd.conf

Add the following code blocks for the two virtual hosts.

<VirtualHost 192.168.2.105:80>
   ServerName mydomain1.com
   ServerAlias www.mydomain1.com
   DocumentRoot /var/www/html/mydomain1.com/
ErrorLog logs/www.mydomain1.com-error_log
CustomLog logs/www.mydomain1.com-access_log common
</VirtualHost>


<VirtualHost 192.168.2.105:80>
    ServerName mydomain2.com
    ServerAlias www.mydomain2.com
    DocumentRoot /var/www/html/mydomain2.com
ErrorLog logs/www.mydomain2.com-error_log
CustomLog logs/www.mydomain2.com-access_log common
</VirtualHost>

Save the changes and exit. Next, check if the syntax is okay and that there are no errors.

$ httpd -t

Next, we will create HTML test pages for each of the domains and add some content as a way of confirming if everything is working properly from the browser.

For mydomain1.com

Create an index.html file under the mydomain1.com directory.

$ sudo vim /var/www/html/mydomain1.com/index.html 

Paste the following lines.

<html>
  <head>
    <title>My sample site</title>
  </head>
  <body>
    <h1>Success! Welcome to mydomain1.com.</h1>
  </body>
</html>

Save the changes and exit the file.

For mydomain2.com

Create an index.html file under mydomain2.com directory.

$ sudo vim /var/www/html/mydomain2.com/index.html 

Paste the following lines.

<html>
  <head>
    <title>My sample site</title>
  </head>
  <body>
    <h1>Success! Welcome to mydomain2.com.</h1>
  </body>
</html>

Save the changes and exit the file.

Now start the Apache web server and confirm that it is running.

$ sudo systemctl start httpd
$ sudo systemctl status httpd
Check Apache in Linux
Check Apache in Linux

If you have a firewall enabled, allow the HTTP and HTTPS ( when necessary) traffic.

$ sudo firewall-cmd --add-service=http --zone=public --permanent
$ sudo firewall-cmd --add-service=https --zone=public --permanent
$ sudo firewall-cmd --reload

Now test the domains from a browser.

Check mydomain1.com
Check mydomain1.com
Check mydomain2.com

Setup IP Based Virtual Hosting Linux

IP-based virtual hosting, as the name suggests, involves multiple IP addresses assigned to your Linux server. In most cases, two or more NIC cards are attached to your system to provide multiple IP addresses.

The goal of IP-based virtual hosting is to assign each domain to a unique IP address that will not be used by any other domain.

This is ideal for situations when you have websites encrypted with an SSL certificate (mod_ssl) or running on different ports. In our setup, we have two NIC adapters.

To view the IP configuration on your system, run the ifconfig or ip a command.

$ ifconfig
OR
$ ip addr
Check IP Address in Linux
Check IP Address in Linux

Our server has two IP addresses, each assigned to one NIC. The IP 192.168.2.106 is assigned to ens160 and 192.168.2.105 is assigned to ens224.

Once again, let’s configure the httpd.conf file.

$ sudo vim /etc/httpd/conf/httpd.conf

Create virtual hosts for both domains as shown. Be sure that each IP address is assigned to its respective virtual host configuration.

<VirtualHost 192.168.2.105:80>
   ServerName mydomain1.com
   ServerAlias www.mydomain1.com
   DocumentRoot /var/www/html/mydomain1.com/
ErrorLog logs/www.mydomain1.com-error_log
CustomLog logs/www.mydomain1.com-access_log common
</VirtualHost>


<VirtualHost 192.168.2.106:80>
    ServerName mydomain2.com
    ServerAlias www.mydomain2.com
    DocumentRoot /var/www/html/mydomain2.com
ErrorLog logs/www.mydomain2.com-error_log
CustomLog logs/www.mydomain2.com-access_log common
</VirtualHost>

Save and exit the configuration file. Next, modify the /etc/hosts file as shown.

$ echo '192.168.2.105 www.mydomain1.com' >> /etc/hosts
$ echo '192.168.2.106 www.mydomain2.com'>> /etc/hosts

Confirm the entries:

$ cat /etc/hosts

192.168.2.105 www.mydomain1.com
192.168.2.106 www.mydomain2.com

Next, restart the Apache webserver for the changes to come into effect.

$ sudo systemctl restart httpd

Finally, test your IP-based Virtual hosting setup by accessing the URLs as shown.

http://192.168.2.105
http://192.168.2.106
Check mydomain1.com
Check mydomain2.com
Check mydomain2.com

This test confirms that the IP-based virtual hosting is working just as expected!

Conclusion

And that’s it for this lecture. We hope that you can seamlessly configure both types of virtual hosting without much of a problem. Your feedback on this guide is much appreciated.

Tarunika Shrivastava
I am a linux server admin and love to play with Linux and all other distributions of it. I am working as System Engineer with a Web Hosting Company.

Each tutorial at TecMint is created by a team of experienced Linux system administrators so that it meets our high-quality standards.

Join the TecMint Weekly Newsletter (More Than 156,129 Linux Enthusiasts Have Subscribed)
Was this article helpful? Please add a comment or buy me a coffee to show your appreciation.

52 thoughts on “Apache Virtual Hosting: Name-Based and IP-Based Virtual Hosts in RHEL Systems”

  1. What you mentioned in this article about virtual hosting, is it the best practice to apply it in the production?? if not can you give us use case or real experience ?

    Regards,

    Reply
  2. In the IP-based example of lines for the .conf file, there is a missing less-than character at the start of the first line

    VirtualHost 192.168.0.100:80>
    
    Reply
  3. there is no httpd.conf and no httpd to install as
    PRETTY_NAME=”Debian GNU/Linux 9 (stretch)”
    NAME=”Debian GNU/Linux”
    VERSION_ID=”9″
    VERSION=”9 (stretch)”
    ID=debian
    HOME_URL=”https://www.debian.org/”
    SUPPORT_URL=”https://www.debian.org/support”
    BUG_REPORT_URL=”https://bugs.debian.org/”
    when try to install it
    sudo apt install httpd
    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Package httpd is a virtual package provided by:
    apache2 2.4.25-3+deb9u2
    yaws 2.0.4+dfsg-1
    webfs 1.21+ds1-12
    tntnet 2.2.1-3+b1
    ocsigenserver 2.7-1+b4
    nginx-light 1.10.3-1+deb9u1
    nginx-full 1.10.3-1+deb9u1
    nginx-extras 1.10.3-1+deb9u1
    mini-httpd 1.23-1.2
    micro-httpd 20051212-15.1
    lighttpd 1.4.45-1
    ebhttpd 1:1.0.dfsg.1-4.3+b2
    aolserver4-daemon 4.5.1-18.1
    aolserver4-core 4.5.1-18.1
    You should explicitly select one to install.

    E: Package ‘httpd’ has no installation candidate

    Reply
  4. Isn’t it better to use /var/www/domain.tld/public_html instead of /var/www/html/domain.tld/public_html because 000-default.conf points to /var/www/html and if enabled you can jump to other sites document if you know the folder name.

    Reply
  5. Hi, thanks for the material but thing is I followed the steps what you provided for name-based web server but I am not able to get the output can you please provide the full clear material to my mail [email protected]

    Reply
    • @Mallikarjuna,

      What output you getting and where? could you share here so that we can provide more better solution on Apache named-based setup.

      Reply
  6. Purpose of implementing IP based virtual hosting is to assign implementing for each domain and that particular IP will not be used by any other domain. *didn’t understand*

    Reply
  7. I have tried your steps, but not able to see the output. config files are correct, services are running, selinux is disabled, still no success.

    Please let me know the step to get output. my workaround.

    [root@suman oracle]$ uname -a
    Linux suman.example.com 2.6.32-71.el6.x86_64 #1 SMP Wed Sep 1 01:33:01 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
    [root@suman oracle]$
    [root@suman oracle]$ httpd -t
    Syntax OK
    [root@suman oracle]$
    [root@suman oracle]$ service httpd status
    httpd (pid  2057) is running...
    [root@suman oracle]$
    

    Example1.com output

    [root@suman oracle]$ cat /var/www/html/example1.com/index.html
    hi suman
    welcome to linux training
    

    Example1.com Output

    [root@suman oracle]$ cat /var/www/html/example2.com/index.html
    www.example2.com
    welcome to example2 website
    
    Reply
    • @Arun,

      May I know what output you getting while accessing these domains via web browser? Also could you share your VirtualHost configuration for these domains in httpd.conf file?

      Reply
  8. Hello,
    I have one domain, do I need to add my IP address of server to their control panel (for their DNS ) ?

    Do I need to install DNS server or apache is enough ?

    Thank you

    Norbert

    Reply
    • @Norbert,

      Just point the domain to IP address of the server in your Hosting DNS control panel, no need to install DNS server, onl Apache is enough to run your website..

      Reply
  9. i want to redirect my website from http to https. i changed many configuration like .htaccess file and httpd file but i am not getting solution. could help me.

    Reply
    • @Arjun,

      Create a .htaccess file in root of domain or website that you want to redirect to HTTPS and add the following rules.

      RewriteEngine On
      RewriteCond %{HTTPS} off
      RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
      
      Reply
      • I have already added this code in .htaccess file in website root but i am not getting solution. i want to know you i am also unable to open website in local network from http with domain name but i able open http with ip domain address.

        Reply
        • @Arjun,

          Make sure that “AllowOverride All” is set in your httpd.conf file and also make sure you have added DNS ‘A’ record for you domain and point back to the server IP address.

          Reply
  10. No it shouldn’t be the same hostname.

    You don’t have to use the same local FQDN as your vhost FQDN(ServerName). Create an ‘CNAME’ record lets say ‘www2 CNAME http://www.example1.com‘ & put the ServerName www2.example1.com. Thats all. 8-)

    Reply
    • I expect FQDN can be example1.mycompany.com then domain is mycompany and example1 is host name. FQDN is nothing but host name along with domain name.

      Reply
  11. Hi ravi/Tarun ,

    In our case we are using tomcat Apache reverse proxy server . In our application(peoplesoft ) we create authentication domain as well as cookie doamin.

    After Siteminder authentication, reverse proxy tries to handshake with our application , but connection is not established to our app , authentication domain not allowing to connect . Can you please help on this .

    Where to add the authentication domain or cookie domain in apache config files.

    Reply
  12. Hi Tarunika,

    Thank you for your tutorial, very helpful but i am still having problem about the local DNS entry for ServerName, http://www.example1.com and example2.com.

    when i put http://www.example1.com ….”error can’t connect to server”

    i have been looking for a week to find the clue but it seems no luck yet.

    could you please help with adding more tutorial to this ?

    Thank you in advance.
    Bun Hin

    Reply
  13. Hi,

    Nice article , I followed same steps mentioned by you but still unable to connect by any way i mean neither by ip or by vhostname, it onle works for first entry in httpd.conf file, os is CentOS release 6.5 (Final)

    plz help..

    Reply
      • hey Tarunika, Great Post !!!

        There is a small correction required.
        Listen 192.168.0.100:80 only allow to connect to example1.com and it wouldn’t allow to access example2.com
        and for the same you need to put Listen *:80

        Reply
  14. Hi Tarunika,

    Can you Please upload an article on how to install multiple instances of apache in a single centos machine.

    Reply
  15. Hi Tarunika, I’m new to Linux. I’ve been working on Windows though for many years. I was practicing Apache hosting but really confused as to how would you host more than one websites on one server which is in local environment i.e. 192.168.1.8. Now we don’t have Internet nor we have DNS server. How would we tweak Hosts file and also what would be entered in httpd.conf “VirtualHost” section. Please reply by email. Thanks

    Reply
  16. Hi Tarunika,

    Nice one …is there any requirement to configure DNS / hosts for resolve the hostname correctly …if yes ..could you please tell me how can we configure it …and which is the best method…

    Reply
  17. hi Tarunika Shrivastava
    it is really really help me. you are a god for me, hh.

    but this content have some errors. especially syntax
    for example

    mkdir /var/www/html/example1.com/

    but

    ServerAdmin [email protected]
    DocumentRoot /var/www/html/example1
    ServerName http://www.example1.com
    ErrorLog logs/www.example1.com-error_log
    CustomLog logs/www.example1.com-access_log common

    DocumentRoot example1.
    but we make example1.com

    please correct errors

    Reply
  18. HI Tarunika,

    Have configured IP base hosting but unable to access second domain i.e example2.com

    It redirecting me to online site.

    Reply
  19. Hi Tarunika,

    Thank you for this wonderfull artical.It helped me alot to understand concepts regarding virtual host and apache web server. Really appriciate for this. Thank you for Tecmint .

    Please keep posting such informative articals :-)

    Reply
      • hi Tarunika
        i am doubt in ipbased virtual host , im create multple ip adress in my system ,but not display alias ip adress keep command ifconfig,so how it resolv and then conf.
        ipbased host in my system……….please rectify me…….

        Reply
  20. host a apachee server on your hostname =”wwwX.example.com”

    pc hostname: desktop45.example.com
    path /var/www/virtual/index .html

    I did all the configuration correctly, plz follow :..

    vim /etc/httpd/conf/httpd.conf
    Nme VirtualHost: desktop45.example.com

    VirtualHost desktop45.example.:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/virtual
    ServerName wwwX.example.com
    ErrorLog logs/wwwX.example.com-error_log
    TransferLog logs/www.example1.com-access_log

    plz help as soon as possible……

    Reply
  21. USEFUL ONE..BUT I AM HAVING A DOUBT….WHICH IS HOW MANY VIRTUAL HOSTS CAN BE CREATED IN APACHE WEB SERVER….I THINK IT HAS NO LIMITS….BUT I AM NOT SURE..ANY ONE IF KNOW ABOUT THIS PLEASE REPLY HERE OR CONTACT THRU MY ID [email protected]….

    Reply
  22. @ satish,

    There is no option to list out directory files except “ls” in linux instead of listing files you can use find command to check the corresponding files.

    # find / -name “filename”

    If you want to count the files use below commands.

    1) ls -l | wc -l (To count only current directory file and folders)
    2) find -type f | wc -l ( To count file and folders recursively)

    Reply
    • 2) find -type f | wc -l ( To count file and folders recursively)

      Hi Magesh, the above one only count the files not folders.

      need small change like this, find -type d | wc -l ( To count folders recursively)

      Reply
  23. I would like to have a module for authentication squid proxy users using a web login form.
    When a users tries to access the internet, first it should redirect to web login form,then after authentication only users should access internet…..!
    Can any once suggest me how to do this….!

    Reply
  24. One really useful apache command to see whether name based or ip based virtual hosting is applied to various IP/port/default combinations is to run:
    ‘httpd -S’
    It also does a syntax check of the config file like -t does.

    Reply
  25. Thanks for it..

    Its Really good for understand a newbie, simple language with best example.. keep it up..

    Regards
    Rahul Patadiya

    Reply
  26. it really helps us………….thank you very much…………….i would like to ask one question if you please reply me….configuration of qmail server?????????? and one more
    if suppose we have directory in that we have 1 million file so we which command we have to used to see list of file……………in that directory?i know that ls is not option……….

    Reply

Got Something to Say? Join the Discussion...

Thank you for taking the time to share your thoughts with us. We appreciate your decision to leave a comment and value your contribution to the discussion. It's important to note that we moderate all comments in accordance with our comment policy to ensure a respectful and constructive conversation.

Rest assured that your email address will remain private and will not be published or shared with anyone. We prioritize the privacy and security of our users.