Apache keeps all of its configuration information in text files. The main file is called httpd.conf. This file contains directives and containers, which enable you to customize your Apache installation. Directives configure specific settings of Apache, such as authorization, performance, and network parameters. Containers specify the context to which those settings refer. For example, authorization configuration can refer to the server as a whole, a directory, or a single file.
The following rules apply for Apache directive syntax:
In the Apache server documentation, found online at http://httpd.apache.org/docs-2.0/, you can browse the directives in alphabetical order or by the module to which they belong. You'll soon learn about some of the basic directives, but you should supplement your knowledge using the online documentation.
Figure 3.5 shows an entry from the documentation for the ServerName directive description. You can read this description in the online documentation at http://httpd.apache.org/docs-2.0/mod/core.html#servername.
Figure 3.5. Directive description example.
The schema, as detailed in the documentation at http://httpd.apache.org/docs-2.0/mod/directive-dict.html, is the same for all directives:
Further explanation of the directive follows these entries in the documentation, and a reference to related directives or documentation might appear at the end.
Directive containers, also called sections, limit the scope for which directives apply. If directives are not inside a container, they belong to the default server scope (server config) and apply to the server as a whole.
These are the default Apache directive containers:
Containers surround directives, as shown in Listing 3.1.
Listing 3.1. Sample Container Directives
1: <Directory "/some/directory"> 2: SomeDirective1 3: SomeDirective2 4: </Directory> 5: <Location "/downloads/*.html"> 6: SomeDirective3 7: </Location> 8: <Files "\.(gif|jpg)"> 9: SomeDirective4 10: </Files>
Sample directives SomeDirective1 and SomeDirective2 will apply to the directory /www/docs and its subdirectories. SomeDirective3 will apply to URLs referring to pages with the .html extension under the /download/ URL. SomeDirective4 will apply to all files with .gif or .jpg extensions.
Apache provides support for conditional containers. Directives enclosed in these containers will be processed only if certain conditions are met.
Listing 3.2. IfDefine Example
1: <IfDefine MyModule> 2: LoadModule my_module modules/libmymodule.so 3: </IfDefine>
Listing 3.3. IfModule Example
1: <IfModule prefork.c> 2: StartServers 5 3: MinSpareServers 5 4: MaxSpareServers 10 5: MaxClients 20 6: MaxRequestsPerChild 0 7: </IfModule> 8: 9: <IfModule worker.c> 10: StartServers 3 11: MaxClients 8 12: MinSpareThreads 5 13: MaxSpareThreads 10 14: ThreadsPerChild 25 15: MaxRequestsPerChild 0 16: </IfModule>
The ServerRoot directive takes a single argument: a directory path pointing to the directory where the server lives. All relative path references in other directives are relative to the value of ServerRoot. If you compiled Apache from source on Linux/Unix, as described earlier in this chapter, the default value of ServerRoot is /usr/local/apache2. Mac OS X users, your ServerRoot defaults to /Library/WebServer. If you used the Windows installer, the ServerRoot is c:\Program Files\Apache Group.
Per-Directory Configuration Files
Apache uses per-directory configuration files to allow directives to exist outside the main configuration file, httpd.conf. These special files can be placed in the file system. Apache will process the content of these files if a document is requested in a directory containing one of these files or any subdirectories under it. The contents of all the applicable per-directory configuration files are merged and processed. For example, if Apache receives a request for the /usr/local/apache2/htdocs/index.html file, it will look for per-directory configuration files in the /, /usr, /usr/local, /usr/local/apache2, and /usr/local/apache2/htdocs directories, in that order.
Enabling per-directory configuration files has a performance penalty. Apache must perform expensive disk operations looking for these files in every request, even if the files do not exist.
Per-directory configuration files are called .htaccess by default. This is for historical reasons; they were originally used to protect access to directories containing HTML files.
The directive AccessFileName enables you to change the name of the per-directory configuration files from .htaccess to something else. It accepts a list of filenames that Apache will use when looking for per-directory configuration files.
To determine whether a directive can be configuration files overridden in the per-directory configuration file, check whether the Context: field of the directive syntax definition contains .htaccess.
Apache directives belong to different groups, specified in the Override: field in the directive syntax description. Possible values are
You can control which of these directive groups configuration files can appear in per-directory configuration files by using the AllowOverride directive. AllowOverride can also take an All or a None argument. All means that directives belonging to all groups can appear in the configuration file. None disables per-directory files in a directory and any of its subdirectories. Listing 3.4 shows how to disable per-directory configuration files for the server as a whole. This improves performance and is the default Apache configuration.
Listing 3.4. Disabling Per-Directory Configuration Files
1: <Directory /> 2: AllowOverride none 3: </Directory>