One of the more popular services to provide with a web server is to host a virtual domain. Also known as a virtual host , a virtual domain is a complete website with its own domain name, as if it were a standalone machine, but it's hosted on the same machine as other websites. Apache implements this capability in a simple way with directives in the httpd.conf
configuration file.
Apache now can dynamically host virtual servers by using the mod_vhost_alias
module you read about in the preceding section of the chapter. The module is primarily intended for ISPs and similar large sites that host a large number of virtual sites. This module is for more advanced users and, as such, it is outside the scope of this introductory chapter. Instead, this section concentrates on the traditional ways of hosting virtual servers.
Address-Based Virtual Hosts
After you've configured your Linux machine with multiple IP addresses, setting up Apache to serve them as different websites is simple. You need only put a VirtualHost
directive in your httpd.conf
file for each of the addresses you want to make an independent website:
ServerName gnulix.org
DocumentRoot /home/virtual/gnulix/public_html
TransferLog /home/virtual/gnulix/logs/access_log
ErrorLog /home/virtual/gnulix/logs/error_log
Use the IP address, rather than the hostname, in the VirtualHost
tag.
You can specify any configuration directives within the tags. For example, you might want to set AllowOverrides
directives differently for virtual hosts than you do for your main server. Any directives that aren't specified default to the settings for the main server.
Name-based virtual hosts enable you to run more than one host on the same IP address. You must add the names to your DNS as CNAMEs of the machine in question. When an HTTP client (web browser) requests a document from your server, it sends with the request a variable indicating the server name from which it's requesting the document. Based on this variable, the server determines from which of the virtual hosts it should serve content.
NOTE
Some older browsers are unable to see name-based virtual hosts because this is a feature of HTTP 1.1 and the older browsers are strictly HTTP 1.0-compliant. However, many other older browsers are partially HTTP 1.1-compliant, and this is one of the parts of HTTP 1.1 that most browsers have supported for a while.
Name-based virtual hosts require just one step more than IP address-based virtual hosts. You must first indicate which IP address has the multiple DNS names on it. This is done with the NameVirtualHost
directive:
NameVirtualHost 212.85.67.67
You must then have a section for each name on that address, setting the configuration for that name. As with IP-based virtual hosts, you need to set only those configurations that must be different for the host. You must set the ServerName
directive because it's the only thing that distinguishes one host from another:
ServerName bugserver.gnulix.org
ServerAlias bugserver
DocumentRoot /home/bugserver/htdocs
ScriptAlias /home/bugserver/cgi-bin
TransferLog /home/bugserver/logs/access_log
ServerName pts.gnulix.org
ServerAlias pts
DocumentRoot /home/pts/htdocs
ScriptAlias /home/pts/cgi-bin
TransferLog /home/pts/logs/access_log
ErrorLog /home/pts/logs/error_log
TIP
If you're hosting websites on an intranet or internal network, users are likely to use the shortened name of the machine rather than the FQDN. For example, users might type http://bugserver/index.htmlin their browser location fields rather than http://bugserver.gnulix.org/index.html. In that case, Apache would not recognize that those two addresses should go to the same virtual host. You could get around this by setting up VirtualHost
directives for both bugserver
and bugserver.gnulix.org
, but the easy way around it is to use the ServerAlias
directive, which lists all valid aliases for the machine:
ServerAlias bugserver
For more information about VirtualHost, refer to the help system on http://localhost/_manual.
Apache provides for logging just about any web access information in which you might be interested. Logging can help with the following:
► System resource management, by tracking usage
► Intrusion detection, by documenting bad HTTP requests
► Diagnostics, by recording errors in processing requests
Two standard log files are generated when you run your Apache server: access_log
and error_log
. They are found under the /var/log/httpd
directory. (Others include the SSL logs ssl_access_log
, ssl_error_log
, and ssl_request_log
.) All logs except for the error_log
(by default, this is just the access_log
) are generated in a format specified by the CustomLog
and LogFormat
directives. These directives appear in your httpd.conf
file.
A new log format can be defined with the LogFormat
directive:
LogFormat "%h %l %u %t \"%r\" %>s %b" common
The common log format is a good starting place for creating your own custom log formats. Note that most of the available log analysis tools assume that you are using the common
log format or the combined
log format — both of which are defined in the default configuration files.
The following variables are available for LogFormat
statements:
%a |
Remote IP address. |
%A |
Local IP address. |
%b |
Bytes sent, excluding HTTP headers. This is shown in Apache's Combined Log Format (CLF). For a request without any data content, a - is shown instead of 0. |
%B |
Bytes sent, excluding HTTP headers. |
%{VARIABLE}e |
The contents of the environment variable variable. |
%f |
The filename of the output log. |
%h |
Remote host. |
%H |
Request protocol. |
%{HEADER}i |
The contents of header ; header line(s) in the request sent to the server. |
%l |
Remote log name (from identd , if supplied). |
%m |
Request method. |
%{NOTE}n |
The contents of note NOTE from another module. |
%{HEADER}o |
The contents of header ; header line(s) in the reply. |
%p |
The canonical port of the server serving the request. |
%P |
The process ID of the child that serviced the request. |
%q |
The contents of the query string, prepended with a ? character. If there's no query string, this evaluates to an empty string. |
%r |
The first line of request. |
%s |
Status. For requests that were internally redirected, this is the status of the original request — %>s for the last. |
%t |
The time, in common log time format. |
%{format}t |
The time, in the form given by format , which should be in strftime(3) format. |
%T |
The seconds taken to serve the request. |
%u |
Remote user from auth ; this might be bogus if the return status ( %s ) is 401. |
%U |
The URL path requested. |
%V |
The server name according to the UseCanonicalName directive. |
%v |
The canonical ServerName of the server serving the request. |
You can put a conditional in front of each variable to determine whether the variable is displayed. If the variable isn't displayed, — is displayed instead. These conditionals are in the form of a list of numerical return values. For example, %!401u
displays the value of REMOTE
_USER unless the return code is 401
.
Читать дальше