Architecturally, Apache takes a modular approach. A number of other separate modules are actually responsible for implementing each phase. Specifically, the role of modules is to implement, override, and extend the functionality of the Apache core. Modules do not directly interact with each other, but instead interact via the Apache core. Since Apache supports dynamic linking, the initialization and configuration of a module does not occur until the module is needed and linked in.
Modules can define handlers, which are responsible for handling one or more phases of a request.
A special structure, called the request record, is used to exchange data with handlers. For instance, a handler for a file needs to open the file, read the file content, close the file, and pass the content back to the Apache core. Handlers are called in a fixed, pre-determined order, based on the request servicing phase. Some phases, such as authentication, require only one handler. Other phases, such as logging, may require a sequence of handlers.