Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Httpd Wiki" for change 
notification.

The "TroubleshootingVhosts" page has been changed by SeanTimmins:
http://wiki.apache.org/httpd/TroubleshootingVhosts?action=diff&rev1=1&rev2=2

+ This page is not linked anywhere yet. I was going to have it linked to my 
personal home page until I was informed they were not suitable for the wiki. 
I'll join the documentation project mailing list and the wiki changes list and 
then update/delete this page as necessary.
+ 
  = TroubleShooting Virtual Hosts =
- The page will concentrate on Named Base virtual hosts mainly because it is 
what most people use and it is the one most people seem to have problems with. 
Some things are 2.2 only and are marked as such.
+ The page will concentrate on Named Base virtual hosts mainly because it is 
what most people use and it is the one many people seem to have problems with. 
Some things are httpd 2.2 or 2.4 only and are marked as such.
  
  == The Basics ==
- Virtual Hosts are much simpler than most people seem to think. This is not 
helped by some unusual 'default' virtual hosts setups distributed by some of 
the major distributions.
+ Virtual Hosts are much simpler than most people seem to think. Thing are made 
more complicated by some unusual 'default' virtual host setups installed by 
some of the major distributions.
  
- First of all '''read the documentation'''!
+ First things first, '''read the documentation'''!
+ 
   * http://httpd.apache.org/docs/current/vhosts/
   * http://httpd.apache.org/docs/current/vhosts/examples.html
   * ExampleVhosts
  
- Secondly, and I can't stree this enough, '''USE''' "apachectl -S", "httpd -S" 
or "apache2ctl -S" whenever you make any change to your configuration. It 
outputs various lines of information that are vital to troubleshooting virtual 
host configuration.
+ Secondly, and I can't stress this enough, use `apachectl -S` or `httpd -S` 
whenever you make any change to your configuration. It outputs various lines of 
information that are vital to the troubleshooting of virtual host 
configuration. See below for further information.
  
+ Thirdly, althought there are a couple of exceptions, if you have defined an 
access log then httpd will ''always'' log something to it when it serves a 
request and an entry will always be logged in the error log on a 4xx or 5xx 
return code. If you cannot find the access/error log entry then you are either 
looking in the wrong log or the request never hit your web server.
- == The Requirements ==
-  * (2.2 only) You '''must''' have a 
[[http://httpd.apache.org/docs/current/mod/core.html#namevirtualhost|NamedVirtualHost]]
 directive for each IP+port combination you wish to use, it should be IP:port 
or *:port
  
+ == Virtual Host Requirements ==
+  * (httpd 2.2 only) You ''must'' have a 
[[http://httpd.apache.org/docs/current/mod/core.html#namevirtualhost|NamedVirtualHost]]
 directive for each IP+port combination you wish to use, it should be IP:port 
or *:port and should come before any of your actual virtual hosts.
   {{{
   NameVirtualhost *:80
   }}}
  
-  * Each [[http://httpd.apache.org/docs/current/vhosts/|<VirtualHost>]] 
directive should have and IP:port inside it, in httpd 2.2 this should match 
your 
[[http://httpd.apache.org/docs/current/mod/core.html#namevirtualhost|NamedVirtualHost]]
 directive
+  * Each [[http://httpd.apache.org/docs/current/vhosts/|<VirtualHost>]] 
directive should have an IP:port inside it, in httpd 2.2 this should match your 
[[http://httpd.apache.org/docs/current/mod/core.html#namevirtualhost|NamedVirtualHost]]
 directive
- 
   {{{
   <VirtualHost *:80>
   }}}
  
-  * Each virtual host '''must''' have its own unique 
[[http://httpd.apache.org/docs/current/mod/core.html#servername|ServerName]]. 
It is this that must match the host component of the URL that the user types 
into their browser. If you define a second virtual host with the same server 
name then whichever virtual host comes first in the configuration will be the 
only one that works with that name.
+  * Each virtual host ''must'' have its own unique 
[[http://httpd.apache.org/docs/current/mod/core.html#servername|ServerName]]. 
It is this that must match the host component of the URL that the user types 
into their browser. If you define a second virtual host with the same server 
name then whichever virtual host comes first in the configuration will be the 
only one that works with that name.
- 
   {{{
   ServerName foo.com
   }}}
-  * Each virtual host should also have its own distinct 
[[http://httpd.apache.org/docs/current/mod/core.html#documentroot|DocumentRoot]].
 Although it is possible and in a few cases needed to share document roots, it 
is normally better to use a single virtual hosts with server aliases.
  
+  * Each virtual host should also have its own distinct 
[[http://httpd.apache.org/docs/current/mod/core.html#documentroot|DocumentRoot]].
 Although it is possible, and in a few cases needed, to share the document 
root, if this is required it is normally better to use a single virtual host 
with server aliases.
   {{{
   DocumentRoot /var/www/foo
   }}}
  
  == The First Virtual Host ==
- With named base virtual hosts, the first one apache finds in the 
configuration files is special. This is the one that requests will be passed to 
if apache has no way to determine which specific virtual host to use. It is the 
'''default''' virtual host.
+ With named base virtual hosts, the first one apache finds in the 
configuration files is special. This is the one that requests will be passed 
to, if apache has no way to determine which specific virtual host to use. It is 
the ''default'' virtual host.
  
- If the user types `http://my.domain.com/my/url/path` then it is the string 
`my.domain.com` that is matched against the host component of the 
[[http://httpd.apache.org/docs/current/mod/core.html#servername|ServerName]] or 
any 
[[http://httpd.apache.org/docs/current/mod/core.html#serveralias|ServerAlias]] 
(Remember Server``Name can contain an optional schema and port)
+ In general, if the user types `http://my.domain.com/my/url/path` into their 
browser, then it is the string `my.domain.com` that is matched against the host 
component of the 
[[http://httpd.apache.org/docs/current/mod/core.html#servername|ServerName]] or 
any 
[[http://httpd.apache.org/docs/current/mod/core.html#serveralias|ServerAlias]] 
(Remember Server``Name can contain an optional schema and port).
  
+ Anything that does not match a ServerName or ServerAlias in one of your 
virtual hosts will be served by the default.
+ 
- ''Advanced Note:'' It is actually the contents of the `Host` header that is 
used rather than the host component of the URL. Though these would normally be 
the same.
+ ''Note:'' It is actually the contents of the `Host` header that is used 
rather than the host component of the URL, though these would normally be the 
same.
  
  == Virtual Host Example ==
+ 
+ Here is a very simple 2 virtual hosts example that we will use to highlight 
the output of `apachectl -S`.
  {{{
+ # NameVirtualhost is needed in httpd 2.2 only
  NameVirtualHost 192.168.0.1:80
  
- # any request to foo.com, or indeen anything other than bar.com that resolves
+ # Any request to foo.com, or indeed anything other than bar.com that resolves
- # to 192.160.0.1 will hit this first virtual host
+ # to 192.168.0.1 will hit this first virtual host
  <VirtualHost 192.168.0.1:80>
    ServerName foo.com
    ServerAlias www.foo.com
@@ -64, +71 @@

    DocumentRoot /var/www/bar
  </Virtualhost>
  }}}
+ == Problem Solving Tips ==
- 
- == Troubleshooting ==
  The [[http://httpd.apache.org/docs/current/mod/core.html#errorlog|ErrorLog]] 
is always the first place to look when you get any problems, but there are 
things you can do to make troubleshooting virtual hosts easier.
  
-  * Give each virtual host its own access and error log. this will enable you 
to easily separate out requests to each virtual host and in particular verify a 
particular request is actually hitting the virtual host you think it is. An 
alternative for determining the virtual host a request hits is to add `%v` to 
the 
[[http://httpd.apache.org/docs/current/mod/mod_log_config.html#logformat|LogFormat]]
+  * Give each virtual host its own access and error log. This will enable you 
to easily separate out requests to each virtual host and in particular verify a 
particular request is actually hitting the virtual host you think it should be. 
An alternative for determining the virtual host a request hits is to add `%v` 
to the relevant 
[[http://httpd.apache.org/docs/current/mod/mod_log_config.html#logformat|LogFormat]].
  
- === Log Files ===
+  * Use a command line tool to access your virtual host. This is particularly 
useful when you have redirects in place and wish to make sure they are working 
correctly. Commonly used tools for the troubleshooting of httpd from the 
command line are [[http://curl.haxx.se|curl]] and 
[[http://www.gnu.org/software/wget/|wget]]. If you have the perl LWP module 
installed you can use lwp-request (often linked as GET). It is worth 
familiarising yourself with these tools and their options.
  
+  {{{
+  # Get the headers from foo.com
+  # Output in the file headers.txt
+  curl -s -D headers.txt -o /dev/null http://foo.com/
+  GET -uUsSed http://foo.com/ > headers.txt
+ 
+  # Using just the host header instead of the fqdn
+  # Output in the file headers.txt
+  curl -H "Host: foo.com" -s -D headers.txt -o /dev/null http://192.168.0.1/
+  wget --header="Host: foo.com" -nv --save-headers=on -O headers.txt 
http://192.168.0.1/
+  GET -H "Host: foo.com" -uUsSed http://192.168.0.1/ > headers.txt
+ 
+  # Get headers and content to terminal
+  curl -s -i http://foo.com/
+  wget -nv --save-headers=on -O - http://foo.com/
+  GET -uUsSe http://foo.com/
+  }}}
+ 
+  * ''Every'' time you modify your configuration you should be running 
`apachectl -S` to test it before you restart your web server. Below are two 
examples of the output from this command for httpd 2.2 and 2.4 when using the 
example virtual host configuration above, with a line by line explanation after 
each.
+  {{{
+  # Example output from httpd 2.2
+  1: VirtualHost configuration:
+  2: 192.168.0.1:8080       is a NameVirtualHost
+  3:        default server foo.com (/etc/httpd/conf.d/vhosts.conf:11)
+  4:        port 80 namevhost foo.com (/etc/httpd/conf.d/vhosts.conf:11)
+  5:        port 80 namevhost bar.com (/etc/httpd/conf.d/vhosts.conf:18)
+  }}}
+ 
+   1. The first line of output, unless there are warnings/errors.
+ 
+   1. If there is no Name``Virtual``Host directive this line will not be 
present.
+ 
+   1. The 'default' virtual host is the one with server name 'foo.com'. It was 
defined in the file /etc/httpd/conf.d/vhosts.conf and started on line 9.
+ 
+   1. A second entry refering to the default virtual host. It runs on port 80 
and it's server name is foo.com. The file and start line are repeated.
+ 
+   1. We have another name based virtual host running on port 80 with server 
name bar.com. It was defined in the file /etc/httpd/conf.d/vhosts.conf and 
started on line 18.
+ 
+  {{{
+  # Example output from httpd 2.4
+  1: VirtualHost configuration:
+  2: 192.168.0.1:80         is a NameVirtualHost
+  3:          default server foo.com (/etc/httpd/conf.d/vhosts.conf:2)
+  4:          port 80 namevhost foo.com (/etc/httpd/conf.d/vhosts.conf:2)
+  5:                  alias www.foo.com
+  6:          port 80 namevhost bar.com (/etc/httpd/conf.d/vhosts.conf:9)
+  7:                  alias www.bar.com
+  8: <After this are several lines of output relating to the global 
configuration>
+  }}}
+ 
+   1. The first line of output, unless there are warnings/errors.
+ 
+   1. httpd 2.4 automatically works out you need a name based virtual host 
(you will get a warning if the directive is present).
+ 
+   1. The 'default' virtual host is the one with server name 'foo.com'. It was 
defined in the file /etc/httpd/conf.d/vhosts.conf and started on line 2.
+ 
+   1. A second entry refering to the default virtual host. It runs on port 80 
and it's server name is foo.com. The file and start line are repeated.
+ 
+   1. The name virtual host foo.com has an alias www.foo.com (this output is 
new in httpd 2.4).
+ 
+   1. We have another name based virtual host running on port 80 with server 
name bar.com. It was defined in the file /etc/httpd/conf.d/vhosts.conf and 
started on line 9.
+ 
+   1. The name virtual host bar.com has an alias www.bar.com.
+ 
+   1. After the virtual hosts information, the output contains lines useful 
for debugging the global configuration.
+ 
+ <<BR>>
+  In the ouput, if you see any duplicate server names or aliases (other than 
the default one and the namevhost immediately after it) then you have virtual 
hosts with duplicate names and only the first one in the list will work.
+ 
+  If with httpd 2.2 you do not have a Name``Virtual``Host directive you will 
not see the line ending in `is a NameVirtualHost` and depending on your exact 
configuration you may see something similar to one of the following warnings:
+ 
+  {{{
+  # If your virtual hosts are defined with IP:port
+ [Fri Jan 11 22:27:30 2013] [warn] VirtualHost 192.168.0.1:80 overlaps with 
VirtualHost 192.168.0.1:80, the first has precedence, perhaps you need a 
NameVirtualHost directive
+  # If your virtual hosts are defined with *:port
+ [Fri Jan 11 22:28:04 2013] [warn] _default_ VirtualHost overlap on port 80, 
the first has precedence
+  }}}
+ 

---------------------------------------------------------------------
To unsubscribe, e-mail: docs-unsubscr...@httpd.apache.org
For additional commands, e-mail: docs-h...@httpd.apache.org

Reply via email to