Apache is the
most commonly used Web Server on Linux systems. Web Servers are used to serve
Web Pages requested by client computers. Clients typically request and view Web
Pages using Web Browser applications such as Firefox, Opera, or Mozilla.
Users enter a
Uniform Resource Locator (URL) to point to a Web server by means of its Fully
Qualified Domain Name (FQDN) and a path to the required resource. For example,
to view the home page of the Ubuntu
Web site
a user will enter only the FQDN. To request specific information about paid support, a user will enter the FQDN followed
by a path.
The most common
protocol used to transfer Web pages is the Hyper Text Transfer Protocol (HTTP).
Protocols such as Hyper Text Transfer Protocol over Secure Sockets Layer
(HTTPS), and File Transfer Protocol (FTP), a protocol for uploading and
downloading files, are also supported.
Apache Web Servers
are often used in combination with the MySQL database engine, the
HyperText Preprocessor (PHP) scripting language, and other popular
scripting languages such as Python and Perl. This configuration
is termed LAMP (Linux, Apache, MySQL and Perl/Python/PHP) and forms a powerful
and robust platform for the development and deployment of Web-based
applications.
Installation
The Apache2
web server is available in Ubuntu Linux. To install Apache2:
- At a
terminal prompt enter the following command:
·
sudo
apt-get install apache2
Configuration
Apache2 is
configured by placing directives in plain text configuration files.
These directives are separated between the following files and
directories:
- apache2.conf: the main
Apache2 configuration file. Contains settings that are global to
Apache2.
- conf.d: contains
configuration files which apply globally to Apache2. Other packages
that use Apache2 to serve content may add files, or symlinks, to this
directory.
- envvars: file where
Apache2 environment variables are set.
- httpd.conf:
historically the main Apache2 configuration file, named after the httpd
daemon. The file can be used for user specific configuration
options that globally effect Apache2.
- mods-available: this
directory contains configuration files to both load modules and
configure them. Not all modules will have specific configuration files,
however.
- mods-enabled: holds symlinks
to the files in /etc/apache2/mods-available. When a
module configuration file is symlinked it will be enabled the next time apache2
is restarted.
- ports.conf: houses the
directives that determine which TCP ports Apache2 is listening on.
- sites-available: this
directory has configuration files for Apache2 Virtual Hosts.
Virtual Hosts allow Apache2 to be configured for multiple sites that have
separate configurations.
- sites-enabled: like
mods-enabled, sites-enabled contains
symlinks to the /etc/apache2/sites-available directory.
Similarly when a configuration file in sites-available is symlinked, the
site configured by it will be active once Apache2 is restarted.
In addition,
other configuration files may be added using the Include directive, and
wildcards can be used to include many configuration files. Any directive may be
placed in any of these configuration files. Changes to the main configuration
files are only recognized by Apache2 when it is started or restarted.
The server also
reads a file containing mime document types; the filename is set by the TypesConfig
directive, and is /etc/mime.types by default.
Basic Settings
This section
explains Apache2 server essential configuration parameters. Refer to the Apache2
Documentation
for more details.
- Apache2
ships with a virtual-host-friendly default configuration. That is, it is
configured with a single default virtual host (using the VirtualHost
directive) which can modified or used as-is if you have a single site, or
used as a template for additional virtual hosts if you have multiple
sites. If left alone, the default virtual host will serve as your default
site, or the site users will see if the URL they enter does not match the ServerName
directive of any of your custom sites. To modify the default virtual host,
edit the file /etc/apache2/sites-available/default.
|
Note:-
|
|
|
The
directives set for a virtual host only apply to that particular virtual host.
If a directive is set server-wide and not defined within the virtual host
settings, the default setting is used. For example, you can define a
Webmaster email address and not define individual email addresses for each
virtual host.
|
- If you wish
to configure a new virtual host or site, copy that file into the same
directory with a name you choose. For example:
·
sudo
cp /etc/apache2/sites-available/default /etc/apache2/sites-available/mynewsite
- Edit the new
file to configure the new site using some of the directives described
below.
- The ServerAdmin
directive specifies the email address to be advertised for the server's
administrator. The default value is webmaster@localhost. This should be
changed to an email address that is delivered to you (if you are the
server's administrator). If your website has a problem, Apache2 will
display an error message containing this email address to report the
problem to. Find this directive in your site's configuration file in
/etc/apache2/sites-available.
- The Listen
directive specifies the port, and optionally the IP address, Apache2
should listen on. If the IP address is not specified, Apache2 will listen
on all IP addresses assigned to the machine it runs on. The default value
for the Listen directive is 80. Change this to 127.0.0.1:80 to cause
Apache2 to listen only on your loopback interface so that it will not be
available to the Internet, to (for example) 81 to change the port that it
listens on, or leave it as is for normal operation. This directive can be
found and changed in its own file, /etc/apache2/ports.conf
- The ServerName
directive is optional and specifies what FQDN your site should answer to.
The default virtual host has no ServerName directive specified, so it will
respond to all requests that do not match a ServerName directive in
another virtual host. If you have just acquired the domain name
ubunturocks.com and wish to host it on your Ubuntu server, the value of
the ServerName directive in your virtual host configuration file should be
ubunturocks.com. Add this directive to the new virtual host file you
created earlier (/etc/apache2/sites-available/mynewsite).
You
may also want your site to respond to www.ubunturocks.com, since many users
will assume the www prefix is appropriate. Use the ServerAlias directive
for this. You may also use wildcards in the ServerAlias directive.
For
example, the following configuration will cause your site to respond to any domain
request ending in .ubunturocks.com.
ServerAlias *.ubunturocks.com
- The DocumentRoot
directive specifies where Apache2 should look for the files that make up
the site. The default value is /var/www. No site is configured there, but
if you uncomment the RedirectMatch directive in /etc/apache2/apache2.conf requests
will be redirected to /var/www/apache2-default where the default Apache2
site awaits. Change this value in your site's virtual host file, and
remember to create that directory if necessary!
The
/etc/apache2/sites-available directory is not parsed by Apache2.
Symbolic links in /etc/apache2/sites-enabled point to "available"
sites.
Enable the new VirtualHost
using the a2ensite utility and restart Apache2:
sudo a2ensite mynewsite
sudo /etc/init.d/apache2 restart
|
Note:-
|
|
|
Be
sure to replace mynewsite with a more descriptive name for the
VirtualHost. One method is to name the file after the ServerName
directive of the VirtualHost.
|
Similarly, use
the a2dissite utility to disable sites. This is can be useful when
troubleshooting configuration problems with multiple VirtualHosts:
sudo a2dissite mynewsite
sudo /etc/init.d/apache2 restart
Default Settings
This section
explains configuration of the Apache2 server default settings. For example, if
you add a virtual host, the settings you configure for the virtual host take
precedence for that virtual host. For a directive not defined within the
virtual host settings, the default value is used.
- The DirectoryIndex
is the default page served by the server when a user requests an index of
a directory by specifying a forward slash (/) at the end of the directory
name.
For
example, when a user requests the page http://www.example.com/this_directory/,
he or she will get either the DirectoryIndex page if it exists, a
server-generated directory list if it does not and the Indexes option is
specified, or a Permission Denied page if neither is true. The server will try
to find one of the files listed in the DirectoryIndex directive and will return
the first one it finds. If it does not find any of these files and if Options
Indexes is set for that directory, the server will generate and return a
list, in HTML format, of the subdirectories and files in the directory. The
default value, found in /etc/apache2/mods-available/dir.conf is "index.html index.cgi
index.pl index.php index.xhtml index.htm". Thus, if Apache2 finds a file
in a requested directory matching any of these names, the first will be
displayed.
- The ErrorDocument
directive allows you to specify a file for Apache2 to use for specific
error events. For example, if a user requests a resource that does not
exist, a 404 error will occur, and per Apache2's default configuration,
the file /usr/share/apache2/error/HTTP_NOT_FOUND.html.var
will be
displayed. That file is not in the server's DocumentRoot, but there is an
Alias directive in /etc/apache2/apache2.conf that
redirects requests to the /error directory to /usr/share/apache2/error/.
To
see a list of the default ErrorDocument directives, use this command:
grep ErrorDocument
/etc/apache2/apache2.conf
- By default,
the server writes the transfer log to the file /var/log/apache2/access.log. You can
change this on a per-site basis in your virtual host configuration files
with the CustomLog directive, or omit it to accept the default,
specified in /etc/apache2/apache2.conf. You may
also specify the file to which errors are logged, via the ErrorLog
directive, whose default is /var/log/apache2/error.log. These are
kept separate from the transfer logs to aid in troubleshooting problems
with your Apache2 server. You may also specify the LogLevel (the
default value is "warn") and the LogFormat (see /etc/apache2/apache2.conf for the
default value).
- Some options
are specified on a per-directory basis rather than per-server. Options
is one of these directives. A Directory stanza is enclosed in XML-like
tags, like so:
·
<Directory
/var/www/mynewsite>
·
...
·
</Directory>
The
Options directive within a Directory stanza accepts one or more of the
following values (among others), separated by spaces:
- ExecCGI - Allow
execution of CGI scripts. CGI scripts are not executed if this option is
not chosen.
|
!
|
|
|
Most
files should not be executed as CGI scripts. This would be very dangerous.
CGI scripts should kept in a directory separate from and outside your
DocumentRoot, and only this directory should have the ExecCGI option set.
This is the default, and the default location for CGI scripts is /usr/lib/cgi-bin.
|
- Includes - Allow
server-side includes. Server-side includes allow an HTML file to include
other files. This is not a common option. See the Apache2 SSI HOWTO for more
information.
- IncludesNOEXEC - Allow
server-side includes, but disable the #exec and #include
commands in CGI scripts.
- Indexes - Display
a formatted list of the directory's contents, if no DirectoryIndex
(such as index.html) exists in the requested directory.
|
!
|
|
|
For
security reasons, this should usually not be set, and certainly should not be
set on your DocumentRoot directory. Enable this option carefully on a
per-directory basis only if you are certain you want users to see the entire
contents of the directory.
|
- Multiview - Support
content-negotiated multiviews; this option is disabled by default for
security reasons. See the Apache2 documentation on this option.
- SymLinksIfOwnerMatch - Only
follow symbolic links if the target file or directory has the same owner
as the link.
httpd Settings
This section
explains some basic httpd daemon configuration settings.
LockFile - The LockFile directive sets the
path to the lockfile used when the server is compiled with either
USE_FCNTL_SERIALIZED_ACCEPT or USE_FLOCK_SERIALIZED_ACCEPT. It must be stored
on the local disk. It should be left to the default value unless the logs
directory is located on an NFS share. If this is the case, the default value
should be changed to a location on the local disk and to a directory that is
readable only by root.
PidFile - The PidFile directive sets the file
in which the server records its process ID (pid). This file should only be
readable by root. In most cases, it should be left to the default value.
User - The User directive sets the userid
used by the server to answer requests. This setting determines the server's
access. Any files inaccessible to this user will also be inaccessible to your
website's visitors. The default value for User is www-data.
|
Unless
you know exactly what you are doing, do not set the User directive to root.
Using root as the User will create large security holes for your Web server.
|
The Group
directive is similar to the User directive. Group sets the group under which
the server will answer requests. The default group is also www-data.
Apache2 Modules
Apache2 is a
modular server. This implies that only the most basic functionality is included
in the core server. Extended features are available through modules which can
be loaded into Apache2. By default, a base set of modules is included in the
server at compile-time. If the server is compiled to use dynamically loaded
modules, then modules can be compiled separately, and added at any time using
the LoadModule directive. Otherwise, Apache2 must be recompiled to add or
remove modules.
Ubuntu compiles
Apache2 to allow the dynamic loading of modules. Configuration directives may
be conditionally included on the presence of a particular module by enclosing
them in an <IfModule> block.
You can install
additional Apache2 modules and use them with your Web server. For example, run
the following command from a terminal prompt to install the MySQL
Authentication module:
sudo apt-get install
libapache2-mod-auth-mysql
See the /etc/apache2/mods-available directory, for additional modules.
Use the a2enmod
utility to enable a module:
sudo a2enmod auth_mysql
sudo /etc/init.d/apache2 restart
Similarly, a2dismod
will disable a module:
sudo a2dismod auth_mysql
sudo /etc/init.d/apache2 restart
HTTPS Configuration
The mod_ssl
module adds an important feature to the Apache2 server - the ability to encrypt
communications. Thus, when your browser is communicating using SSL, the
https:// prefix is used at the beginning of the Uniform Resource Locator (URL)
in the browser navigation bar.
The mod_ssl
module is available in apache2-common package. Execute the following
command from a terminal prompt to enable the mod_ssl module:
sudo a2enmod ssl
There is a
default HTTPS configuration file in /etc/apache2/sites-available/default-ssl. In order for Apache2 to
provide HTTPS, a certificate and key file are also needed. The
default HTTPS configuration will use a certificate and key generated by the ssl-cert
package. They are good for testing, but the auto-generated certificate and key
should be replaced by a certificate specific to the site or server. For
information on generating a key and obtaining a certificate see the section called “Certificates”
To configure Apache2
for HTTPS, enter the following:
sudo a2ensite default-ssl
|
Note:-
|
|
|
The
directories /etc/ssl/certs and /etc/ssl/private are the default locations. If you
install the certificate and key in another directory make sure to change SSLCertificateFile
and SSLCertificateKeyFile appropriately.
|
With Apache2 now
configured for HTTPS, restart the service to enable the new settings:
sudo /etc/init.d/apache2 restart
|
Note:-
|
|
|
Depending
on how you obtained your certificate you may need to enter a passphrase when Apache2
starts.
|
You can access
the secure server pages by typing https://your_hostname/url/ in your browser
address bar.
References
- Apache2 Documentation contains in depth information on
Apache2 configuration directives. Also, see the apache2-doc package
for the official Apache2 docs.
- See the Mod SSL
Documentation
site for more SSL related information.
- O'Reilly's Apache Cookbook is a good resource for accomplishing
specific Apache2 configurations.
- For Ubuntu
specific Apache2 questions, ask in the #ubuntu-server IRC channel
on freenode.net.
- Usually
integrated with PHP and MySQL the Apache MySQL PHP Ubuntu Wiki page is a
good resource.