Posted by Steve on Thu 6 Jul 2006 at 22:03
One of the most common Apache2 questions I've seen on Debian mailing lists is from users who wonder how to host multiple websites with a single server. This is very straightforward, especially with the additional tools the Debian package provides.
We've previously discussed some of the tools which are included in the Apache2 package, but what we didn't do was show they're used from start to finish.
There are many different ways you can configure Apache to host multiple sites, ranging from the simple to the complex. Here we're only going to cover the basics with the use of the NameVirtualHost directive. The advantage of this approach is that you don't need to hard-wire any IP addresses, and it will just worktm. The only thing you need is for your domain names to resolve to the IP address of your webserver.
For example if you have an Apache server running upon the IP address 192.168.1.1 and you wish to host the three sites example.com, example.net, and example.org you'll need to make sure that these names resolve to the IP address of your server.
(This might mean that you need example.com and www.example.com to resolve to the same address. However that is a choice you'll need to make for yourself).
Since we'll be hosting multiple websites on the same host it makes a lot of sense to be very clear on the location of each sites files upon the filesystem. The way I suggest you manage this is to create a completely seperate document root, cgi-bin directory, and logfile directory for each host. You can place these beneath the standard Debian prefix of /var/www or you may use a completely different root - I use /home/www.
If you've not already done create the directories to contain your content, etc, as follows:
root@irony:~# mkdir /home/www root@irony:~# mkdir /home/www/www.example.com root@irony:~# mkdir /home/www/www.example.com/htdocs root@irony:~# mkdir /home/www/www.example.com/cgi-bin root@irony:~# mkdir /home/www/www.example.com/logs root@irony:~# mkdir /home/www/www.example.net root@irony:~# mkdir /home/www/www.example.net/htdocs root@irony:~# mkdir /home/www/www.example.net/logs root@irony:~# mkdir /home/www/www.example.net/cgi-bin root@irony:~# mkdir /home/www/www.example.org root@irony:~# mkdir /home/www/www.example.org/htdocs root@irony:~# mkdir /home/www/www.example.org/logs root@irony:~# mkdir /home/www/www.example.org/cgi-bin
Here we've setup three different directory trees, one for each site. If you wanted to have identical content it might make sense to only create one, and then use symbolic links instead.
The next thing to do is to enable virtual hosts in your Apache configuration. The simplest way to do this is to create a file called /etc/apache2/conf.d/virtual.conf and include the following content in it:
# # We're running multiple virtual hosts. # NameVirtualHost *
(When Apache starts up it reads the contents of all files included in /etc/apache2/conf.d, and files you create here won't get trashed on package upgrades.)
Once we've done this we can create the individual host configuration files. The Apache2 setup you'll find on Debian GNU/Linux includes two directories for locating your site configuration files:
This contains configuration files for sites which are available but not necessarily enabled.
This directory contains site files which are enabled.
As with the conf.d directory each configuration file in the sites-enabled directory is loaded when the server starts - whilst the files in sites-available are completely ignored.
You are expected to create your host configuration files in /etc/apache2/sites-available, then create a symbolic link to those files in the sites-enabled directory - this will cause them to be actually loaded/read.
Rather than actually messing around with symbolic links the Debian package includes two utility commands a2ensite and a2dissite which will do the necessary work for you as we will demonstrate shortly.
Lets start with a real example. Create /etc/apache2/sites-available/www.example.com with the following contents:
#
# Example.com (/etc/apache2/sites-available/www.example.com)
#
<VirtualHost *>
ServerAdmin webmaster@example.com
ServerName www.example.com
ServerAlias example.com
# Indexes + Directory Root.
DirectoryIndex index.html
DocumentRoot /home/www/www.example.com/htdocs/
# CGI Directory
ScriptAlias /cgi-bin/ /home/www/www.example.com/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>
# Logfiles
ErrorLog /home/www/www.example.com/logs/error.log
CustomLog /home/www/www.example.com/logs/access.log combined
</VirtualHost>
Next create the file www.example.net:
#
# Example.net (/etc/apache2/sites-available/www.example.net)
#
<VirtualHost *>
ServerAdmin webmaster@example.net
ServerName www.example.net
ServerAlias example.net
# Indexes + Directory Root.
DirectoryIndex index.html
DocumentRoot /home/www/www.example.net/htdocs/
# CGI Directory
ScriptAlias /cgi-bin/ /home/www/www.example.net/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>
# Logfiles
ErrorLog /home/www/www.example.net/logs/error.log
CustomLog /home/www/www.example.net/logs/access.log combined
</VirtualHost>
Finally create the file www.example.org:
#
# Example.org (/etc/apache2/sites-available/www.example.org)
#
<VirtualHost *>
ServerAdmin webmaster@example.org
ServerName www.example.org
ServerAlias example.org
# Indexes + Directory Root.
DirectoryIndex index.html
DocumentRoot /home/www/www.example.org/htdocs/
# CGI Directory
ScriptAlias /cgi-bin/ /home/www/www.example.org/cgi-bin/
<Location /cgi-bin>
Options +ExecCGI
</Location>
# Logfiles
ErrorLog /home/www/www.example.org/logs/error.log
CustomLog /home/www/www.example.org/logs/access.log combined
</VirtualHost>
Now we've got:
To enable the sites simply run:
root@irony:~# a2ensite www.example.com Site www.example.com installed; run /etc/init.d/apache2 reload to enable. root@irony:~# a2ensite www.example.net Site www.example.net installed; run /etc/init.d/apache2 reload to enable. root@irony:~# a2ensite www.example.org Site www.example.org installed; run /etc/init.d/apache2 reload to enable.
This will now create the symbolic links so that /etc/apache2/sites-enabled/www.example.org, etc, now exist and will be read.
Once we've finished our setup we can restart, or reload, the webserver as the output above instructed us to do with:
root@irony:~# /etc/init.d/apache2 reload Reloading web server config...done. root@irony:~#
Can you not just use Alias as part of the main config to achieve the same thing?
You could, but I don't like having webmail as (essentially) a subdirectory. Also, this way you can apply different configurations to each webmail as necessary.
And you can just reload the server instead of restarting it if you change the config.
Heh...I haven't used reload in so long after having odd behavior early on that I forgot about it completely. I don't restart webservers often so it doesn't come up a whole lot.
[ Parent ]
I guess with that setup, since the webmail is "inside" the document root you can access it either via either of the links:
For me I'd tend to only use the webmail.example.org site available and I'd do it with:
mkdir /home/www/webmail.example.org/ mkdir /home/www/webmail.example.org/logs ln -s /home/www/webmail /home/www/webmail.example.org/htdocs
(No need for a CGI directory in this case I guess!)
Still I guess this is personal preference really..
[ Parent ]
[ Parent ]
[ Parent ]
Like I said there are multiple ways to do this and using your method is a neat approach if you have lots of simple sites which don't need anything special.
The advantage of the method shown here is that it allows you to customize each different site very easily, (since there is a configuration file for each host), that might allow you to do things like install mailman on one host, and add custom redirects, etc.
In my server I have around 10 domains, and each has different customizations - for example the configuration file for this site enables lots of mod_rewrite magic so that all our URLs are pretty - but I don't want those customisations applied globally which I think I would have to do if I used the mass-virtual hosting you suggest.
[ Parent ]
<VirtualHost *:80>
ServerName lists.example.com
ServerAlias lists.*
RedirectMatch permanent ^/$ /mailman/listinfo
RewriteEngine on
RewriteRule ^/mailman(/.*)?$ /cgi-bin/mailman$1 [PT,L]
</VirtualHost>
[ Parent ]
UseCanonicalName Off LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon VirtualDocumentRoot /Library/WebServer/Hosts/%0/Documents VirtualScriptAlias /Library/WebServer/Hosts/%0/CGI-Executables- My costumised virtual host bits are like this:
VirtualHost
ServerName svn.domain.ltd
ServerAlias svn
RewriteEngine On
Redirect / http://10.0.0.0:8080/
#ProxyPreserveHost On
#ProxyPass / http://10.0.0.0:8080/
#ProxyPassReverse / http://10.0.0.0:8080/
VirtualHost
On my error log I still get like:
... File does not exist: /Library/WebServer/Hosts/svn.domain.tld/Documents/- Any hints? Regards Admir ~
[ Parent ]
[ Parent ]
I tend to regard PHPs safe mode as still-broken.
For my PHP I use mod_security/mod_ifier + suphp.
[ Parent ]
[ Parent ]
For your first question I'm unsure - I can't see how that could ever happen in the setup I described. Each site is only "example.com", or "www.example.com" - the name "blahblah.example.com" wouldn't even resolve, and if it did shouldn't be visible - unless you have a default virtual host setup for /var/www and you're storing your sites beneath that?
In that case move the virtual hosts beneath /home/www, like I do, or comment out the default entry.
For the second I'd just remove the line "NameVirtualHost *:0" since it isn't relevant.
Run "rgrep -li NameVirtualHost /etc/apache2" to find where it is set.
[ Parent ]
[ Parent ]
I think that what is happening is that the host you're requesting is pointed to the IP of the server, but you don't have a virtual setup explicity setup for it.
So instead Apache passes it to the first available virtual host (ie. the file in /etc/apache2/sites-enabled which is first will be used.)
To fix this either:
Really I can't see this being a problem in general since people don't often use wildcard dns.
I'd suggest you add the folloing to www.alpha.com:
ServerName www.alpha.com ServerAlias alpha.com ServerAlias *.alpha.com
That will ensure that blah.alpha.com is handled by the Alpha.com virtual host. Add similar wildcard settings to beta.com, etc.
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
Not bad.
I have something similar for adding, removing, and listing sites for Apache2 and mail handling with Exim4... :)
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
Probably you forgot the alias. Something like this:
<VirtualHost *>
ServerName firstsite.com
ServerAlias www.firstsite.com
...
...
Failing that is that you forgot to delete the 000-default site which is enabled.
[ Parent ]
[ Parent ]
[ Parent ]
If the keywords all point at the same directory then you could do it without having to make any symlinks. Just use a config file like this:
<VirtualHost> ServerName mysite.com ServerAlias *.mysite.com .. DocumentRoot /home/www/mysite.com/
You just need to add the DNS entries and it will work as expected.
[ Parent ]
[ Parent ]
The obvious question: Your error says:
File does not exist: /var/www/html/websites/www.mysite.com
Does it? If not make it via :
mkdir -p /var/www/html/websites/www.mysite.com echo "test" >> /var/www/html/websites/www.mysite.com/index.html
[ Parent ]
[ Parent ]
If you have the configuration file as you suggested above you shouldn't be seeing this error.
You shouldn't have *any* other virtual hosts defined for mysite.com - just the one with the "*" in it. Did you leave the old ones in place?
If so remove them, and restart Apache2.
[ Parent ]
Could be, I don't know.
I know that if the configuration file that you've pasted is the only configuration file, and you're not using any mass-hosting modules it should work as expected - it does for me.
I guess you'll need to ask for assistance on the debian-user mailing list.
[ Parent ]
[ Parent ]
Add 'ServerName mysite.com' to a file /etc/apache2/conf.d/local and restart and all will be well.
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
NameVirtualHost *:80 Listen 80if NOT issue this command: (assuming you're in apache2 folder as shown below) and add those two line
ruvan@ubuntu:/etc/apache2$ sudo gedit apache2.conf
ruvan@ubuntu:/etc/apache2$ sudo touch sites-enabled/websiteAnd add these lines(the minimal version) to the file we just created.
#Add top domains as many as you need
<VirtualHost *:80>
ServerName website.com
DocumentRoot /home/ruvan/www/website.com
DirectoryIndex index.php index.html
</VirtualHost>
<VirtualHost *:80>
ServerName website.net
DocumentRoot /home/ruvan/www/website.net
DirectoryIndex index.php index.html
</VirtualHost>
#And a sub domain for website.com (add as many as you require)
<VirtualHost *:80>
ServerName my.website.com
#set subdomain folder created inside main domain website.com
DocumentRoot /home/ruvan/www/website.com/my
DirectoryIndex index.php index.html
</VirtualHost>
Note: You don't really need separate files for each and every domain. So to keep things simple I added one virtual host file to website.com (but you can ad as many as you need)127.0.1.1 website.com 127.0.1.1 my.website.com 127.0.1.1 website.net
[ Parent ]
NameVirtualHost *:80
Listen 80
NameVirtualHost xxx.xxx.xxx.xxx:80
Listen 80
[ Parent ]
subdomain.example.com/sub/dirpublic_html/~subdomain/sub/dir[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
When I go to example.com it shows up all working BUT
When I go to example2.com it shows up the same as example.com when it should be different
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
[ Parent ]
I faced lot of difficulties like site loading issue, poor response and DNS error, I would suggest to use cloud hosting for your websites like cloudways offering, I am using Magento hosting by cloudways (https://www.cloudways.com/en/magento-managed-cloud-hosting.php), Its best at Its offers and support is awesome.
[ Parent ]
[ View Weblogs ]
I found it very easy to add webmail to all domains given this sort of setup, by adding the following to each conf:
ServerAdmin webmaster@example.org ServerName webmail.example.org # Indexes + Directory Root. DirectoryIndex index.html DocumentRoot /home/www/www.example.org/webmail/ # Logfiles ErrorLog /home/www/www.example.org/logs/error.log CustomLog /home/www/www.example.org/logs/access.log combinedThen, you can install Horde (for example, as I did) in /home/www/webmail, have it use the hostname as part of the login, and make a symbolic link by doing the following:
I made symbolic links rather than defining the path directly in the conf, because that way I can easily change webmails without restarting the server. Especially handy if a few domains should have a different set of modules enabled or use different authentication methods, etc.
[ Parent ]