Many systems allow multiple IP addresses for a single host. For systems
with this capability it is possible to use a different data hierarchy for
each IP address to which your host responds. Sometimes this is referred
to as "virtual hosts" or a "multi-homed" server since when combined with
DNS aliasing it permits a single
server to appear to be multiple servers on different
hosts. Unfortunately, I cannot help you in configuring your system to
respond to multiple IP addresses. (Some information about this can be
found at http://www.thesphere.com/%7Edlp/TwoServers/)
However, if your system supports this capability you can have different
data hierarchies for each IP address if you run the stand-alone version
of the server (wnsd
).
There are two ways to have multiple virtual hosts. Assuming
that you actually have more than one network interface
(i.e. more than one NIC), the easiest is to run multiple
instances of the server each with a different IP address indicated
on the command line via the -i
option.
For example running the commands:
wnsd -i 192.168.1.1 -L abc.log /abc/root
wnsd -i 192.168.1.2 -L def.log /def/root
will start two instances of the server, both on the same port (80) but responding to different IP addresses.
Alternatively,
wnsd -h www.abc.com -L abc.log /abc/root
wnsd -h www.def.com -L def.log /def/root
will start two instances of the server, both on the same port (80) but
responding to different IP addresses. The server will ascertain the
appropriate IP address by using the UNIX gethostbyname(3)
system call for the name supplied on the command line.
Note: To use this method make sure the "#define USE_VIRTUAL_HOSTS
" line inconfig.h
is commented out.
This method has the disadvantage of using somewhat more resources than the alternate method (described below) because at least one instance of the server for each host name is running at all times and thus using memory. On the other hand with this method it is possible to specify a different log file for each host, while the method below uses only one log file and a utility to separate it into the contributions of each host.
The second method to implement a multi-homed server involves only a
single initial instance of the server which responds to all requests and
changes the document root as appropriate based on the IP address or host
name to which the request was sent. To use this method you need to edit
the config.h
file and
uncomment the line containing "#define USE_VIRTUAL_HOSTS
".
Then you have two choices. You can either create a file containing a
list of the virtual hosts or you can build this list into the compiled
version of the sever by editing one of the source files and recompiling.
If you have only a few virtual hosts and you don't anticipate adding new
ones, I recommend compiling in the list. This is easy to do and much
more efficient if you use wnd
with the UNIX inetd(8)
system utility. If you use wnsd
there is little difference
in efficiency.
You can either compile in the list of virtual hosts or keep this list
in a file which will be read each time the server starts. The second
option is described here and the first is described in the next section.
To use a virtual host file you must uncomment the line containing "#define VIRTUAL_HOSTS_FILE
"
in the file config.h
and
change the quoted path to the full path of a file containing virtual host
information in a format described below. Then you must recompile the
server. Once this has been done you may change the file you use with the
-V
option to the server.
But to turn this feature on, it is necessary that "#define VIRTUAL_HOSTS_FILE
"
be uncommented when the server is compiled. Each time this file is
changed, in order for the change to take effect, you will need to restart
the server or send it the SIGHUP
signal with the UNIX
kill(1)
utility.
The format of this file is one line per virtual host. Each such line should have the form:
hostname IP_address root_path vhost_nickname user group flag
with the four parts separated by white space. For example entries might be:
myhost.com 111.222.222.111 /usr/wn/myroot myhost bob mygroup 0
client.com 111.222.222.111 /usr/wn/client client george clientgroup 1
In particular the hostname should be a fully qualified domain name.
The user
and group
fields are the name of the user and
group to be passed to suexec
if it is used. If it is not these
can be set to the string NULL
. However, if suexec
is used, both the user and group must be defined for each virtual
host -- they could have the value of the user and group under which your
server runs. The flag
field currently
has only two allowable values, 0 and 1. The value 1 indicates that
user home directories are not permitted
for this virtual host.
Lines in this file which are empty or start with '#
' are
ignored. When using verbose logging the nickname will be enclosed in
angle brackets and used as the last field of each log entry. If the
nickname is omitted a number will be used representing the position of
virtual host in the virtual host file.
By default there is a maximum of 64 virtual hosts allowed in a virtual
host file. But this can be increased by editing the file
wn/vhost.c
and changing the line
"#define MAXVHOSTS (64)
". Just replace the
64
with the value you wish.
WN supports the "Host:
" header implemented by
some browsers (e.g. Netscape
Communicator) and so-called "full URL requests". For browsers that
support either of these features it is now possible to have multiple
virtual hosts with a single IP address. The HTTP/1.1 protocol requires
browsers to support the "Host:
" header.
Using this feature requires nothing beyond setting up the server exactly
as described above for virtual hosts. Of course, all your virtual hosts
will have the same IP number if your system only has one. Then if a
browser provides the "Host:
" header (which should contain
the hostname and port it is trying to access) the WN server will
use the root data directory you specified for that host name. Similarly
if a full URL request like
"GET http://host.abc.com/dir/foo.html
" is used the
server will use the root data directory corresponding to
"host.abc.com
". If the browser provides neither of these
the server will use the first root data directory whose IP number matches
(which will be the first in your list if you have only one IP address).
To compile in the list of virtual hosts you need to edit the file
wn/vhost.h
. This file is quite short and contains something
like:
#ifdef USE_VIRTUAL_HOSTS WN_CONST char * WN_CONST vhostlist[][7] = { { "realname.com" , "123.123.121.1", ROOT_DIR, "nickname0", "usr0", "grp0", "0" }, { "virtual1.com" , "123.123.121.1", "/var/data1", "nickname1", NULL, NULL, NULL }, { "virtual2.com" , "123.123.121.1", "/var/data2", "nickname2", "usr2", "grp2", "1" }, { "another.ip.com", "123.123.123.2", "/var/data3", "nickname3", "usr3", "grp3", "1" }, { NULL, NULL, NULL, NULL, NULL, NULL, NULL } }; #endif
The line containing
{ "virtual2.com", "123.123.121.1", "/var/data2", "nickname1" }
,
etc., should be replaced by a line containing one of the IP addresses of your
host instead of "123.123.121.1"
, the correct system path to
the corresponding data root instead of "/var/data1"
, one of
the hostnames that corresponds to this IP address, and a nickname to use
in logging. The "usr2"
and "grp2"
are only used with
suexec
and can have the value NULL
if you
are not using suexec
. The final entry in this line is a string
representing a flag for use with virtual hosting.
For the moment it should only be NULL
or one of the quoted strings
"0"
or "1"
. The quoted string "1"
disallows
the use of any user home directories for
URL's referring to this virtual host. The values NULL
or "0"
are
equivalent and give the default behavior which allows serving from user home directories
only if the server was compiled with this feature enabled.
The hostname in these lines is used by the server in only two
ways: when a redirect header is sent, and to pass the correct server host
name to CGI/1.1 programs
in the environment variable. The nicknames are used as a field of a verbose log entry. When using verbose
logging the nickname (enclosed in angle brackets) will be the last field
of each log entry. If the nickname is NULL
then a number will be used for its value
representing the position of virtual host in the virtual host file.
All the lines of this file should be changed in a similar fashion. You
may have more as many lines as you wish and you should remove any of the
lines you don't need. Don't change anything else. In particular make
sure that the
{ NULL, NULL, NULL, NULL, NULL, NULL, NULL }
line is unchanged and that you change only the parts inside quotation marks. If
the IP address by which the server is accessed does not match any of the
addresses listed in this file then the server will use the default data
root (as specified when you ran the configure
program
or edited the value of "#define ROOT_DIR
" in config.h
).
The server will not produce separate log files for each IP address.
However, if the server is configured to produce verbose logs then each
entry is tagged at the end with the nickname of the virtual host which
received the request. The wnv2c
utility can then be used
to produce separate log files for each IP address.