<!doctype linuxdoc system>
<article>

<!-- Title Information -->

<title>Apache Overview HOWTO
<author>Daniel Lopez Ridruejo, <tt/ridruejo@apache.org/ 
<date>v0.9, 2002-10-10

<!-- Abstract -->
<abstract>
This document gives you an overview of the different Apache projects,
such as the Apache HTTP server and the Tomcat Servlet and JSP engine.
It provides pointers for further information and implementation details.
</abstract>

<!-- Table of Contents -->
<toc>
<sect>Introduction
<p>
This document gives you an overview of the Apache world, including
Apache Software Foundation projects such as the Apache web server
and commercial and open source third party software.  Apache is the <url
name="most popular server on the Internet"
url="http://www.netcraft.com/survey/">. New Apache users, especially those
coming from a Windows background, are often unaware of the possibilities of
Apache, its useful addons and, more in general, how everything works
together. This document aims to show a general picture of such possibilities
with a brief description of each one and pointers for further information.
The information has been gathered from many sources, including projects' web
pages, conference talks, mailing lists, Apache websites and my own hands-on
experience. Full credit is given to these authors. Without them and
their work, this document would not have been possible or necessary.

<p>Copyright 2002 Daniel Lopez Ridruejo

Permission is granted to copy, distribute and/or modify this document
under the terms of the Open Content Open Publication License, Version
1.1. A copy of the license is included in the appendix entitled "Open
Content Open Publication License", or at www.opencontent.org/openpub/.

<sect1>Apache Software Foundation
<p>
<em>The Apache Software Foundation provides support for the Apache community of
open-source software projects. The Apache projects are characterized by a
collaborative, consensus based development process, an open and pragmatic
software license, and a desire to create high quality software that leads
the way in its field. We consider ourselves not simply a group of projects
sharing a server, but rather a community of developers and users.</em>
<p>The ASF is home to many successful Open Source projects, such as the
Tomcat Servlet/JSP engine and the ANT build tool.
<p>You can learn more about the foundation <url name="here" url="http://www.apache.org/foundation/">.

<sect1>Structure of this document
<p>The first part of this document deals with the Apache Web Server and
related modules. It covers the history, architecture and capabilities of the
server and describes ways in which you can extend and customize it.
<p>The second part of this document covers projects of the Apache Software
Foundation, such as those form the Jakarta and Java XML communities. Rather
than organizing the projects around a certain programming language or
technology, they are organized based on functionality provided.

<sect>Apache
<p>Apache is the leading internet web server, with over 60% market share, according
to the <url name="Netcraft survey" url="http://www.netcraft.com/survey">.
Several key factors have contributed to Apache's success:
<itemize>
<item>The <url name="Apache license" url="http://www.apache.org/LICENSE.txt">. It is
an open source, BSD-like license that allows for both commercial and non-commercial
uses of Apache.
<item>Talented community of <url name="developers" url="http://www.apache.org/foundation/members.html">
with a variety of backgrounds and an open development process based on technical merits.
<item>Modular architecture. Apache users can easily add functionality or tailor Apache to their
specific enviroment.
<item>Portable: Apache runs on nearly all flavors of Unix (and Linux), Windows, BeOs, mainframes...
<item>Robustness and security.
</itemize>
Many commercial vendors have adopted Apache-based solutions for their products, including <url name="Oracle"
url="http://www.oracle.com">, <url name="Red Hat" url="http://www.redhat.com"> and <url name="IBM" url="http://www.ibm.com">.
In addition, <url name="Covalent" url="http://www.covalent.net"> provides add-on modules and 24x7 support for Apache.
<p>The following websites use Apache or derivatives. Chances are that if Apache
is good enough for them, it is also good enough for you :)
<itemize>
<item><url name="Amazon.com" url="http://www.amazon.com">
<item><url name="Yahoo!" url="http://www.yahoo.com">
<item><url name="W3 Consortium" url="http://www.w3c.org">
<item><url name="Financial Times" url="http://www.ft.com">
<item><url name="Apple" url="http://www.apple.com">
<item><url name="MP3.com" url="http://www.mp3.com"
<item><url name="Stanford" url="http://www.stanford.edu">
</itemize>
<p>
>From the <url name="Apache website" url="http://httpd.apache.org">:
<p>
<em>The Apache HTTP Server Project is an effort to develop and maintain an
open-source HTTP server for modern operating systems including UNIX and
Windows NT. The goal of this project is to provide a secure, efficient and
extensible server that provides HTTP services in sync with the current HTTP
standards.</em>
<p>Apache started its life as modifications to the NCSA Web server,
one of the first HTTP servers. You can learn more about Apache's history 
<url name="here" url="http://httpd.apache.org/ABOUT_APACHE.html">: 
<p>
The Apache project has grown beyond building just a web server into developing other
critical server side technologies. The Apache Software Foundation, described
in a later section, serves as an umbrella for these projects.

<sect1>Architecture
<p>There are two main versions of Apache, the 1.3 series and the
2.0 series. Although both versions are considered production quality, they
differ in architecture and capabilities.
<p>
<sect2>2.1.1 Apache 1.3
<p>Apache 1.3 has been ported to a great variety of Unix platforms and is
the most widely deployed Web server on the Internet. 

<sect3>Process-based Web server
<p>
Apache 1.3 on Unix is a process-based Web server. The Apache program forks
several children at startup. Forking means that a parent process makes identical copies 
of itself, called <em>children</em>. Each one of the children can serve a
request independent of the others. This approach has the advantage of
improved stability: If one of the children misbehaves (runs out of control
or has memory leaks) it can be terminated without affecting the others.
The stability comes with a performance penalty. In most Unix operating
systems, creating processes and context switching (assigning processor time
to each process) are expensive operations. Since processes are isolated from
each other, they cannot easily share code and data, consuming system resources.

<sect3>Windows support
<p>
Apache 1.3 is the first version of Apache to support Windows, although the
port is not considered to be as stable as its Unix counterparts. This is due
to the fact that the server had been designed with Unix in mind and the
Windows port was a later addition that did not integrate very well.

<sect3>Modular
<p>Apache 1.3 has a modular architecture. You can enable or disable modules
to add and remove Web server functionality. You can customize Apache
to improve performance and security. In addition to modules bundled with the
server, there is a great number of third party modules, providing extended
functionality.

<sect2>2.1.2 Apache 2.0
<p>Apache 2.0 is the latest and greatest version of the Apache server. 
The architecture contains significant improvements over the 1.3 series. The
following are some of them.


<sect3>Multi Processing Modules
<p>Apache 2.0 abstracts the request processing architecture in special server
modules, called Multi Processing modules (MPMs). This means that Apache can be configured to be a pure process-based
server, a purely threaded server or a mixture of those models. Threads are
contained inside processes and run simultaneously. Unlike processes, threads
can share data and code. Threads are thus more "lighweight" than
processes, and in most cases threaded servers scale better than process
based servers. The disadvantage is that the server is less reliable, since
if a thread misbehaves it can corrupt data or code belonging to other threads.

<sect3>Protocol Modules
<p>The protocol handling has been encapsulated in its own layer in
Apache 2.0. That means it is possible to write modules to serve protocols
other than HTTP, such as POP3 for mail or FTP for file transfer. These
protocol modules can take advantage of a solid server framework and module
functionality, such as authentication and dynamic content generation. This
means that, for example, you can authenticate your POP3 users against the
same user database Apache uses for web requests and that FTP content can be
generated dynamically using PHP, CGI or any other technologies explained
later in this document.

<sect3>Module and filter architecture.
<p>Apache 2.0 maintains the 1.3 modular architecture and adds an additional
extension mechanism: filters. Filters allow modules to modify the content
generated by other modules. They can encrypt, scan for viruses or compress
not only static files but dynamically generated content.

<sect3>Compatibility issues
<p>Unfortunately, though the module API is similar between versions, they are not identical
and Apache 1.3 modules need to be ported to the new architecture. Most
mainstream modules such as PHP and mod_perl already have Apache 2.0 versions
and others, such as mod_dav and mod_ssl, are now part of the server
distribution. Running modules on a threaded architecture requires specific
changes to modules. Modules distributed with Apache have undergone those
changes and are considered `thread-safe', but third-party modules or
libraries may not. If you need one of those, you will be limited to running
Apache as a pure process-based server. 

<sect3>Portable
<p>Apache runs equally well now on Windows and Unix platforms thanks to the
Apache Portable Runtime (APR) library. It abstracts the differences among
operating systems, such as file or network access APIs. Porting Apache to a
new platform is often as simple as porting the Apache Portable Runtime.
This abstraction layer also provides for platform-specific tuning and
optimization.


<sect1>Security
<p>Apache provides several security-related modules for securing and
restricting access to the server.

<sect2>Authentication
<p>Authentication modules allow you to determine the identity of a client,
usually by verifying an username and password against a backend database.
Apache includes modules to authenticate against plain text and database files.
Additional authentication modules exist that connect Apache to 
existing security frameworks or databases, including: NT Domain
controller, Oracle, mySQL, PostgresSQL and so on.<p>
The LDAP modules are specially interesting, as they allow integration with
company and enterprise wide existing directory services.
You can find these modules at <htmlurl url="http://modules.apache.org">.
An Apache 2.0 LDAP module can be found <url name="at the Apache website"
url="http://httpd.apache.org/docs-2.0/mod/mod_auth_ldap.html">.


<sect2>Access Control
<p>Apache provides the mod_access module that can restrict access to
resources based on parameters of the client request, such as the presence of
a specific header or the IP address or hostname of the client. Third party
modules allow you to restrict access to clients that misbehave, as explained
in later sections on performance and bandwidth control. 

<sect2>SSL/TLS
<p>The Secure Sockets Layer/Transport Layer Security protocols allow data
between the Web server and client to be encrypted. In Apache 1.3, the
protocols are implemented by mod_ssl, which is distributed separately from the
<url name="mod_ssl website" url="http://www.modssl.org"> and requires
applying patches to the server. This was necessary because of export
regulations on encryption. Most of those restrictions have since then being
lifted and starting with Apache 2.0, mod_ssl is now included as a base
module with Apache. 

<sect1>Proxy
<p>A proxy is a program that performs requests on behalf of another. There
are different kind of Web proxies. A traditional HTTP proxy, also called a
<em>forward proxy</em>, accepts requests from clients (usually Web
browsers), contacts the remote server, and returns the responses.
<p>A reverse proxy is a Web server that is placed in front of other servers,
providing a unified front end and offloading certain tasks, such as SSL
processing, from the backend Web servers.
<p>Apache supports both types of proxy, caching of proxied content and
differente proxy backends such as FTP. 

<sect1>Performance and scalability<label id="performance">
<p>Raw performance is only one of the factors to consider in a web server 
(flexibility and stability come usually first).<p>
Having said that, there are solutions to improve performance on heavy loaded
webservers serving static content. If you are in the hosting business
Apache also provides ways in which you can measure and control bandwidth usage.
Throttling in this context usually means slowing down the delivery of content
based on the file requested, a specific client IP address and so on. This is done
to prevent abuse.
<itemize>
<item><bf>mod_mmap</bf>: Included in current Apache 1.3 releases, it maps to
memory a statically configured list of files that are frequently requested
but infrequently changed. This functionality is included in mod_file_cache
in Apache 2.
<item><bf><url name="Mod_bandwidth"
url="http://www.cohprog.com/mod_bandwidth.html"></bf>: This Apache 1.3 module
enables the setting of server-wide or per connection bandwidth limits, based
on the specific directory, size of files and remote IP/domain.
<item><bf><url name="Bandwidth share module"
url="http://www.topology.org/src/bwshare/README.html"></bf>: provides
bandwidth throttling and balancing by client IP address. It supports Apache 1.3 and earlier versions of Apache 2. 
<item><bf><url name="Mod_throttle"
url="http://www.snert.com/Software/Throttle/index.shtml"></bf>:Throttle
bandwidth per virtual host or user. For Apache 1.3
</itemize>
<sect2>Load Balancing
<p>Using the Apache reverse proxy and mod_rewrite you can have an Apache
process distributing requests among a variety of backend web servers.
You can find more information at <htmlurl
url="http://www.apache.org/docs/misc/rewriteguide.html">
<p>Additionally, mod_backhand is an Apache 1.3 module that allows seamless
redirection of HTTP requests from one web server to another. This
redirection can be used to target machines with under-utilized resources,
thus providing fine-grained, per-request load balancing of web  
requests. You can find more information at <htmlurl url="http://www.backhand.org/">.

<sect2>Compression
<p>Apache 2.0 includes mod_deflate, a filtering module that compresses
content before delivering it to clients. This saves bandwidth but can have a
performance impact. The <url name="mod_gzip module"
url="http://www.remotecommunications.com/apache/mod_gzip/">
provides this functionality for Apache 1.3

<sect1>CGI scripts
<p>
CGI stands for Common Gateway Interface. CGI programs are external programs
that are called when a user requests a certain page. The CGI program receives information
from the web server (form variable values, type of browser, IP
address of the client and so on) and uses that information to output a web page to the client.
<p>Apache has support for CGIs and there is a third-party Apache 1.3 module
that provides support for the FastCGI protocol. It avoids the performance
penalties associated with starting and stopping a CGI program with every
request. You can find it at <htmlurl url="http://fastcgi.com/">

<sect1>Development Platform Integration
<p>Web applications are written in high-level languages such as Java, Perl,
C# and so on and Apache has several modules that integrate them with the
server. In many cases the modules expose the Apache API so entire Apache
modules can be written in those languages.
<sect2>Perl<label id="mod_perl">
<p>
<url name="mod_perl" url="http://perl.apache.org/"> is one of the most
veteran and successful Apache projects. It embeds a Perl interpreter
in Apache and allows access to the web server internals from
Perl. This allows for entire modules to be written in Perl or a
mixture of Perl and C code.  In the 1.3 Apache versions, one
interpreter has to be embedded in each child, since the server is
multiprocess based.  In heavy traffic dynamic sites, the increased
size could make a difference.  In threaded versions of Apache 2.0
mod_perl allows for sharing of code, data and session state among
interpreters. This results in a faster, leaner solution.
<p>mod_perl is in itself another platform, with a great variety of modules
available such as <url name="Mason" url="www.masonhq.com"> and
<url name="Embperl" url="http://perl.apache.org/embperl/"> for
embedding Perl in HTML pages and <url name="AxKit" url="axkit.org"> for
XML-driven templates.

<sect2>PHP<label id="php">
<p>From the <url name="PHP" url="http://www.php.net"> website:
<em>PHP is a server-side, cross-platform, HTML embedded scripting
language</em>. It is
the <url name="most popular module for Apache"
url="http://www.securityspace.com/s_survey/data/man.200209/apachemods.html">
and this is due to a variety of reasons:
<itemize>
<item>Learning curve is quite low 
<item>Great documentation
<item>Extensive database support
<item>Modularity
</itemize>
PHP has a modular design. Among many others, there are modules that provide
support for: 
<itemize>
<item>Database connetivity for popular databases such as Oracle, 
MS-SQL server, ODBC interface, MySQL, mSQL, PostgreSQL and so on.
<item>XML support
<item>File transfer: FTP
<item>HTTP
<item>Directory support: LDAP 
<item>Mail support: IMAP, POP3, NNTP
<item>PDF document generation
<item>CORBA
<item>SNMP
</itemize>
You only need to compile/use the modules you need. PHP can be used with Apache, as an external CGI or with other webservers.
It is crossplatform and it runs on most flavors of Unix and Windows. If you come from a Windows background, you probably have used Internet
Information Server with Active Server Pages and MS-SQL Server. A common
replacement in the Unix world for this trio is Apache with PHP and MySQL.
Since PHP works:
<itemize>
<item>with Apache and with Microsoft IIS
<item>with MySQL and with MS-SQL server
<item>on Unix and on Windows
</itemize>
you have a nice, gradual migration path from a Microsoft-centric solution to Unix based solutions.

<sect2>Python
<p>
Python is a popular object oriented scripting language.
<url name="Mod_Python" url="http://www.modpython.org">, which is now
an official Apache project, allows you to integrate Python with the Apache
web server. You can develop complex web applications or accelerate existing
Python CGI scripts. Recent versions run on Apache 2.0.

<sect2>Tcl
<p>The <url name="Tcl Apache project" url="http://tcl.apache.org"> integrates
Tcl with the Apache webserver. Tcl is a lightweight, extensible
scripting language. You can learn more about Tcl <url
url="http://tcl.activestate.com/" name="here">.
There are several modules currently under the Apache Tcl umbrella:
<itemize>
<item>Both <url name="Mod_dtcl" url="http://tcl.apache.org/mod_dtcl/"> and 
<url name="Neowebscript" url="http://tcl.apache.org/neowebscript/"> allow
embedding Tcl on HTML pages. <url name="Rivet"
url="http://tcl.apache.org/rivet/"> combines the best of both modules.
<item><url name="Mod_tcl" url="http://tcl.apache.org/mod_tcl/mod_tcl.html"> takes an approach similar
to mod_perl, exposing the Apache API.
<item><url name="WebSH" url="http://tcl.apache.org/websh/"> provides a Tcl Web
application environment
</itemize>

<sect2>Microsoft technologies
<p>Several modules allow integration with Microsoft languages and
technologies such as the .Net framework or Active Server Pages.
<sect3>.Net
<p><url name="mod_haydn" url="http://haydn.sourceforge.net/"> integrates
<url name="Mono" url="http://www.go-mono.com"> with Apache and exposes
the Apache API to the .Net framework, allowing you to write modules in C#,
for example. <url name="Covalent" url="http://www.covalent.net"> provides
mod_asp.net, an commercial Windows module that allows Apache to run ASP.Net
applications, allowing you to replace Microsoft IIS.
<sect3>ASP
<p>ASP stands for Active Server Pages and is a Microsoft technology that
allows you to embed code, usually Visual Basic, in HTML pages. Several
companies such as <url name="ChilliSoft" url="http://www.chilisoft.com/"> and <url name="Stryon"
url="http://www.stryon.com/"> provide products that can run ASP
applications on Unix environments. 
<sect3>ISAPI
<p>ISAPI is an API that you can use to extend Microsoft IIS, similarly to
how you would use the Apache API. Apache includes a module mod_isapi that
mirrors this functionality and allows you to run ISAPI modules.

<sect2>Java
<p>Most applications servers, such as those from Oracle, IBM and BEA provide
modules to integrate with the Apache web server. Additionally, several
modules such as mod_jk and mod_webapp allow you to connect to Tomcat, a
Servlet and JavaServer Pages container that is also part of the Apache
Software Foundation.

<sect2>Modules for other languages
<p>This document has described modules for popular server side languages
such as Perl, Python and PHP. You can find additional language modules (JavaScript, Haskell, Ruby and others)
at the <url name="Apache modules directory" url="http://modules.apache.org">. 

<sect1>Management
<p>An important part of Web server administration includes building,
configuring and monitoring different servers.

<sect2>Build tools
<p>Apache can be extended and customized in many different ways. Integration
of different modules with the server can sometimes be a difficult task.
Tools such as the <url name="Apache Toolbox"
url="http://www.apachetoolbox.com"> can make this task easier, by
providing a menu driven build framework.

<sect2>User Interfaces for Apache
<p>Apache is configured thru text configuration files, and that sometimes
can be hard, specially for people coming from a Windows background.
There are open source graphical tools that make this task easier:
<itemize>
<item><url name="Comanche" url="http://www.comanche.org">, by yours truly,
is crossplatform and runs on Unix/Linux, Windows and Mac.
<item><url name="Webmin" url="http://www.webmin.com/webmin/">: A nice
web based interface.
<item><url name="gui.apache.org" url="http://gui.apache.org">: GUI interfaces
for Apache project. Programs are in various degrees of development.
</itemize>

<sect2>SNMP
<p>SNMP stands for Simple Network Management Protocol. It allows monitoring
and management of network servers, equipment and so on. SNMP modules for Apache
help manage large deployments of web servers, measure the quality of service 
offered and integration of Apache with existing management frameworks.
<itemize>
<item>Open source <url name="Mod SNMP"
url="http://www.simpleweb.org/software/packages/mod-snmp/"> for Apache 1.3.
<item><url name="Covalent SNMP" url="http://www.covalent.net"> provides
a commercial SNMP module, support for the latest SNMPv3 standard, integration
with HP-Openview, Tivoli and so on.
</itemize>

<sect1>Publishing
<p>Authors of Web content require a means of managing that content and
uploading it to the server. One of the protocols used for this purpose is
DAV (Distributed Authoring and Versioning). DAV is an extension to the HTTP
protocol that enables users and applications to publish and modify Web
content. DAV technology is widely implemented, Microsoft supports it
at the operating system level (WebFolders) and in its Office suite. Same
goes for Apple OS-X and a variety of third party products from Adobe,
Oracle and so on. You can get the mod_dav module for Apache 1.3 at
<htmlurl url="http://www.webdav.org/mod_dav/">. In Apache 2.0, mod_dav is
included with the base distribution.
<p>Previous to DAV, Microsoft had its own publishing protocol, integrated
with the Microsoft FrontPage tool. You can add server-side support for Frontpage using
the modules at <htmlurl url="http://www.rtr.com/Ready-to-Run_Software/">,
though due to the way they integrate with Apache they are not considered
secure.

<sect1>Protocol modules
<p>Apache 2.0 introduced the concept of protocol modules. That means that
developers can reuse the Apache server framework to implement new protocols
such as those dealing with mail and file transfer. mod_ftp is a commercial
Apache-based FTP module from <url name="Covalent"
url="http://www.covalent.net">. <url name="mod_pop3"
url="http://cvs.apache.org/viewcvs.cgi/httpd-pop3/"> is an open source module that
implements the POP3 protocol, commonly used by mail readers to retrieve
messages from mail servers. 

<sect1>Virtual Hosting
<p>
Apache provides extensive virtual hosting support which means that you can
serve multiple websites from a single server. In Apache 2.0, with the
per-child MPM you can have multiple children, each one serving a different
domain under different Unix user ids. This is very important for security
in shared hosting scenarios, as it allows you to isolate
customers from each other. The following are additional, alternative, virtual
hosting modules.
<itemize>
<item><url name="mod_dynvhost" url="http://funkcity.com/0101/">
<item><url name="mod_pweb" url="http://www.joytec.de/mod_pweb.html">
<item><url name="mod_v2h" url="http://www.fractal.net/mod_v2h.tm">
</itemize>
<p>

<sect1>Commercial support
<p>Apache is the web server of choice for many commercial entities,
including big enterprises. These companies have certain requirements when
adopting a technology, specially one that is at the core of their Internet
strategy, such as Web servers. Those requirements include performance,
stability, management capabilities, support, professional services and
integration with legacy systems. A number of commercial companies, such as
<url name="IBM" url="http://www.ibm.com">, <url name="Red Hat"
url="http://www.redhat.com"> and <url name="Covalent" 
url="http://www.covalent.net">, provide the products and services necessary to
make Apache meet the needs of Enterprise customers.
<p>In addition, many other companies and OEMs ship Apache as a bundled web
server with their products.


<sect>ASF Projects
<p>Although Apache is probably the most popular, the Apache Software
Foundation is home to many other projects. This section provides an overview
of the most relevant ones, organized logically. Most of them belong either
to the Jakarta project and the XML project. The Jakarta project hosts
Java-based projects and the XML project hosts, surprise, XML-related projects.

<sect1>Applications and Frameworks
<p>The following are application and development frameworks that are part
of the ASF. 

<sect2>3.1.1 Servers
<p>The following are some ASF server projects.
<sect3>Tomcat<label id="tomcat">
<p>Tomcat is the flagship product of the Jakarta project.
It is the official reference implementation for the Java
Servlet and JavaServer Pages technologies.
<p>You can learn more in the <url name="Tomcat homepage"
url="http://jakarta.apache.org/tomcat/">.

<sect3>JAMES (Java Apache Mail Enterprise Server)
<p>Complementary to the other Apache server side technologies, JAMES provides
<em>a 100% pure Java server designed to be a complete and portable enterprise
mail engine solution based on currently available open protocols (SMTP, POP3,
IMAP, HTTP)</em>
<p>More information can be found <url name="here" 
url="http://jakarta.apache.org/james/">.

<sect3>Lucene
<p>Jakarta Lucene is a high-performance, full-featured text search engine
written in Java and part of the Jakarta project. You can find more
information at <htmlurl url="http://jakarta.apache.org/lucene/">

<sect3>Jetspeed
<p><url name="Jetspeed" url="http://jakarta.apache.org/jetspeed/">
is a web based portal written in Java. It has a modular API that
allows aggregation of different data sources (XML, SMTP, iCalendar)


<sect2>3.1.2 Content management
<p>The following are projects related to content management

<sect3>Slide
<p>Slide is a high-level content management framework.
Conceptually, it provides a hierarchical organization of binary
content which can be stored into arbitrary, heterogenous, distributed
data stores. In addition, Slide integrates security, locking and versioning
services. It also provides a <url name="WebDAV" url="http://www.webdav.org">
server and client implementation.
You can learn more at the <url name="Slide home page"
url="http://jakarta.apache.org/slide/index.html">.

<sect3>Alexandria
<p>Alexandria is an integrated documentation management system. It brings
together technologies common to many open source projects like CVS and JavaDoc.
The goal is to integrate source code and documentation to encourage code
documentation and sharing. More information at <htmlurl 
url="http://jakarta.apache.org/alexandria/index.html">  

<sect2>3.1.3 Frameworks
<p>The following are application development frameworks.

<sect3>Turbine<label id="turbine">
<p>Turbine is a servlet based framework that allows experienced Java developers
to quickly build secure web applications. Turbine brings together a platform
for running Java code and reusable components. Some of its features include:
Integration with template systems, MVC style development, Access Control
Lists, localization support and so on. You can find more information at the
<url name="Turbine web site" url="http://java.apache.org/turbine">.

<sect3>Avalon
<p>If you are familiar with Perl or BSD systems, Avalon is roughly the
equivalent of <url name="CPAN" url="http://www.cpan.org"> or the Ports
collection for Java Apache technologies. It does not only provide guidelines
for a common repository of code, it goes one step further: <em>is an effort to
create, design, develop and maintain a common framework for server
applications written using the Java language.</em> It provides the means so 
server side Java projects can be easily integrated and build on each other.
You can find more information at 
the <url name="Avalon web site" url="http://java.apache.org/avalon/">.

<sect1>Presentation
<p>The following template systems, transformation engines and other
presentation related projects.

<sect2>Cocoon<label id="cocoon">
<p>Cocoon leverages other Apache XML technologies like Xerces, Xalan and FOP
to provide a comprehensive XML publishing framework. The framework can talk
to many different data sources and can transform the content into several
different delivery formats such as PDF, HTML, XML and RTF. It can run as a
servlet or as a command line program. You can learn more about Cocoon at the
<url name="project homepage" url="http://xml.apache.org/cocoon/"> 

<sect2>Velocity
<p><em>Velocity is a Java based template engine. It can be used as a
stand-alone utility for generating source code, HTML, reports, or
it can be combined with other systems to provide template services.</em>
Velocity has a Model View Controller paradigm that enforces separation of
Java code and the HTML template. You can learn more about Velocity <url name="here"
url="http://jakarta.apache.org/velocity/index.html">.

<sect2>AxKit
<p>
<url name="AxKit" url="http://axkit.org"> <label id="axkit"> is
a popular XML-based Application Server for mod_perl and Apache. It allows
separation of content and presentation and provides on-the-fly conversion
from XML to any format.

<sect2>Xalan
<p>
Xalan is an XSLT processor available for Java and C++.
XSL is a style sheet language for XML. The T is for Transformation. XML
is good at storing structured data (information). You sometimes need to
display this data to the user or apply some other transformation.
Xalan takes the original XML document, reads transformation configuration
(stylesheet) and outputs HTML, plain text or another XML document.
You can learn more about Xalan at the <url name="Xalan Java"
url="http://xml.apache.org/xalan-j/index.html"> and <url name="Xalan C++"
url="http://xml.apache.org/xalan-c/index.html"> project homepages.  

<sect2>FOP
<p>From the website: <em>FOP is a Java application that reads a formatting
object tree and then turns it into a PDF document</em>. So FOP takes an
XML document and outputs PDF, in a similar way that Xalan does with HTML
or text. You can learn more about FOP <url name="here"
url="http://xml.apache.org/fop">.


<sect1>Parsers and Document Access libraries
<p>The following are different libraries that can be used to parse and
manipulate a variety of document formats.

<sect2>Xerces
<p>
The Xerces project provides XML parsers for a variety of languages, including
Java, C++ and Perl. The Perl bindings are based on the C++ sources.
An XML parser is a tool used for programatic access to XML documents.
This is a description of the standards supported by Xerces:
<itemize>
<item><url name="DOM" url="http://www.w3.org/TR/1998/REC-DOM-Level-1-19981001/level-one-core.html">: DOM stands for Document Object Model. XML documents
are hierarchical by nature (nested tags). XML documents can be accessed thru
a tree like interface. The process is as follows:
<itemize>
<item>Parse document
<item>Build tree
<item>add/delete/modify nodes
<item>Serialize tree
</itemize>
<item><url name="SAX" url="http://www.saxproject.org">:Simple API for XML. This is a stream based API. This means 
that we will receive callbacks as elements are encountered. These callbacks
can be used to construct a DOM tree for example.
<item><url name="XML Namespaces" url="http://www.w3.org/TR/REC-xml-names/">
<item>XML Schema: The XML standard provides the syntax for writing documents. XML
Schema provides the tools for defining the <em>contents</em> of the XML
document (semantics). It allows to define that a certain element in the
document must be an integer between 10 and 20 or contain an IP address.
</itemize>
The Xerces XML project initial code base was donated by IBM. You can find more
information in the <url name="Xerces Java"
url="http://xml.apache.org/xerces-j/index.html">, <url name="Xerces C++"
url="http://xml.apache.org/xerces-c/index.html"> and <url name="Xerces Perl"
url="http://xml.apache.org/xerces-p/index.html"> homepages.    

<sect2>Batik
<p><em>Batik is a Java based toolkit for applications that want to use images in the 
<url name="Scalable Vector Graphics (SVG)" url="http://www.w3.org/TR/SVG/"> format for various
purposes, such as viewing, generation or manipulation.</em>
<p> It is XML centric and compliant with the W3C specification. It is a bit atypical from other Apache
projects, in that it provides a graphical component. Batik provides hooks to extend the
framework thru custom tags and it allows conversion from SVG to other formats like JPEG or PNG.
You can learn more at the <url name="Batik homepage" url="http://xml.apache.org/batik/">

<sect2>POI
<p>
The POI project consists of APIs for manipulating various file formats based
upon Microsoft's OLE 2 Compound Document format using pure Java. This
includes Word and Excel documents. You can find more information at <htmlurl
url="http://jakarta.apache.org/poi/">

<sect1>Interoperability
<p>The following are libraries for remote communication and interoperability
between servers.

<sect2>SOAP
<p>Apache SOAP ("Simple Object Access Protocol") and Axis are
implementations of the <url name="SOAP protocol" url="http://www.w3.org/TR/SOAP"> 
<p>SOAP is a lightweight protocol for exchange of information in a
decentralized, distributed environment. It is an XML based protocol that
consists of three parts: 
<itemize>
<item><em>An envelope that defines a framework for describing what is in a
message and how to process it</em>,
<item><em>a set of encoding rules for expressing instances of
application-defined datatypes</em>, and
<item><em>a convention for representing remote procedure calls and
responses</em>.  
</itemize>
Basically you can think of SOAP as an remote procedure call
system, based on HTTP and XML. On the one hand this means it is
verbose and slow compared to other systems. On the other hand it eases
interoperatibility, debugging and development of clients and servers
for a variety of languages since most modern languages have HTTP and XML
modules. You can learn more at the <url name="Apache SOAP homepage"
url="http://xml.apache.org/soap/"> 

<sect2>XML-RPC
<p>The <url name="XML-RPC project" url="http://xml.apache.org/xmlrpc/">
is a Java implementation of the XML-RPC protocol, a light-weight protocol
similar and predecessor to SOAP.

<sect2>XML security
<p>The <url name="XML security project" url="http://xml.apache.org/security/"> provides
XML document signature verification for secure exchange of documents.

<sect1>Development

<sect2>Apache Portable Runtime
<p>The <url name="APR" url="http://apr.apache.org"> project provides
a portability layer that abstracts a number of APIs for file manipulation,
network access and so on. It is written in C and works on most Unix flavors,
Windows and a variety of other systems. It is the basis for Apache 2.0

<sect2>Ant
<p><url name="Ant" url="http://jakarta.apache.org/ant/"> is a Java based
build tool. It has a modular API and can be extended by creating new tasks. It
is driven by XML configuration files. 

<sect2>Byte Code Library
<p>The <url name="Byte Code Engineering Library"
url="http://jakarta.apache.org/bcel/"> (BCEL) is a
library to analyze, create, and manipulate binary Java class files.

<sect2>Log4j
<p>This package provides a logging framework that Java applications can use.
It can be enabled at runtime without modifying the binary and has been designed 
with performance in mind. It can be found at <htmlurl url="http://jakarta.apache.org/log4j/">

<sect2>ORO and Regexp
<p>ORO is a complete package that provides regular expression support for
Java. It includes Perl5 regular expression support, glob expressions and so on.
All under the Apache license. 
You can learn more about ORO at <htmlurl url="http://jakarta.apache.org/oro/index.html">. There is another ASF
lightweight regular expression package, <url name="Regexp" url="http://jakarta.apache.org/regexp/">.

<sect2>Struts
<p>Struts is an Apache project that tries to bring the
Model-View-Controller (MVC) design paradigm to web development. It
builds on <url name="Servlet"
url="http://java.sun.com/products/servlet"> and <url name="JavaServer
Pages" url="http://java.sun.com/products/jsp"> technologies. The model
part is made up of Java server objects, which represent the internal
state of the application. The view part is constructed via JavaServer Pages (JSP), which
is a combination of static HTML/XML and Java. JSPs also allow the
developer to define new tags.  The controller part consists of servlets,
which take requests (GET/POST) from the client, perform actions on the
model and update the view by providing the appropriate JSP.  You can
learn more at the <url name="Struts project pages"
url="http://jakarta.apache.org/struts/index.html">.

<sect2>Taglibs
<p>The JavaServer pages technology allows developers to provide functionality
by adding custom tags. The Taglibs project intends to be a common repository
for these extensions. It includes tags for common utilities (i.e. date),
SQL database access and so on.
<p>
You can learn about TagLibs at
<htmlurl url="http://jakarta.apache.org/taglibs/">.
More documentation is included in the package.

<sect2>Database
<p><url name="OJB" url="http://jakarta.apache.org/ojb/"> is a database
mapping tool that allows persistance and storage of Java objects in
relational databases. <url name="Xindice"
url="http://xml.apache.org/xindice/"> is a native XML database for storing
and querying XML documents.

<sect2>Commons
<p>The <url name="Commons project" url="http://jakarta.apache.org/commons/">
provides a great variety of reusable Java components with minimal dependencies.

<sect1>Testing
<p>The following ASF projects cover testing and performance analisys.

<sect2>httpd-test
<p>The <url name="httpd-test project"
url="http://httpd.apache.org/test/"> provides a testing framework for the
Apache web server and tools such as <url name="flood" url="http://httpd.apache.org/test/flood/"> for HTTP load testing. 

<sect2>Cactus
<p><url name="Cactus" url="http://jakarta.apache.org/cactus/"> is a
testing framework for testing server side Java code such as Servlets and EJBs.

<sect2>JMeter
<p>This is a testing tool written in Java with a GUI frontend. It can be obtained at <htmlurl 
url="http://jakarta.apache.org/jmeter/">.

<sect2>Lakta
<p><url name="Lakta" url="http://jakarta.apache.org/lakta/"> is an end-to-end
HTTP testing tool

<sect2>Watchdog
<p>The <url name="Watchdog project" url="http://jakarta.apache.org/watchdog/"> is a suite of validation sets for the
Servlet and JavaServer Pages specification.

<sect>Where to find more information
<p>Additional Apache related resources
<sect1>Websites
<p>The following are some useful websites
<itemize>
<item><url name="Apache Website" url="http://www.apache.org">
<item><url name="Apache Week" url="http://www.apacheweek.com">
<item><url name="Apache modules directory" url="http://modules.apache.org">
<item><url name="Apache today" url="http://www.apachetoday.com">
<item><url name="Apache World" url="http://www.apacheworld.org">
<item><url name="Slashdot Apache section" url="http://slashdot.org/index.pl?section=apache">
</itemize>
<sect1>Books
<p>I maintain <url name="a list of books"
url="http://www.apacheworld.org/apache_overview/books/"> related to this
document. It is not a comprehensive list, but rather I include only those
books that I have personally found well-written and useful.
<sect1>Support forums
<p>You can find the Apache users mailing list at <htmlurl
url="http://httpd.apache.org/lists.html">. Similar lists exist for the
rest of projects mentioned there. Make sure you read the Frequently Asked
Questions document before posting . You can also get support in the newsgroup
comp.infosystems.www.servers.unix at <htmlurl url="http://groups.google.com">. 
<p>If you want commercial support, consider contacting <url name="Covalent"
url="http://www.covalent.net">, which provides expert support for Apache (at a fee,
of course). If you are using Apache on Linux, your Linux vendor may have support
plans that include Apache.

<sect>Contacting the Author
<p>You can contact me at daniel @ rawbyte.com . I welcome suggestions
and corrections, but please, please, do not send me messages asking me to
troubleshoot your Apache installation. I just do not have the time to answer people individually.
If you need support, please refer to the resources mentioned above.
<p>

<sect1>Translations
<p>If you want to contribute a translation of this document you should use 
the SGML source. Check <htmlurl url="http://www.tldp.org"> for info.
Please drop me a note so I can make sure you get the most recent version.

<sect>Open Content Open Publication License

<p>Open Publication License
Draft v1.0, 8 June 1999 (text version)


<sect1>REQUIREMENTS ON BOTH UNMODIFIED AND MODIFIED VERSIONS

<p>The Open Publication works may be reproduced and distributed in
whole or in part, in any medium physical or electronic, provided that
the terms of this license are adhered to, and that this license or an
incorporation of it by reference (with any options elected by the
author(s) and/or publisher) is displayed in the reproduction.

<p>Proper form for an incorporation by reference is as follows:

<p>Copyright (c) &lt;year&gt; by &lt;author's name or
designee&gt;. This material may be distributed only subject to the
terms and conditions set forth in the Open Publication License, vX.Y
or later (the latest version is presently available at
http://www.opencontent.org/openpub/). The reference must be
immediately followed with any options elected by the author(s) and/or
publisher of the document (see section VI).

<p>Commercial redistribution of Open Publication-licensed material is
permitted.

<p>Any publication in standard (paper) book form shall require the
citation of the original publisher and author. The publisher and
author's names shall appear on all outer surfaces of the book. On all
outer surfaces of the book the original publisher's name shall be as
large as the title of the work and cited as possessive with respect to
the title.


<sect1>COPYRIGHT

<p>The copyright to each Open Publication is owned by its author(s) or designee.


<sect1>SCOPE OF LICENSE

<p>The following license terms apply to all Open Publication works,
unless otherwise explicitly stated in the document.

<p>Mere aggregation of Open Publication works or a portion of an Open
Publication work with other works or programs on the same media shall
not cause this license to apply to those other works. The aggregate
work shall contain a notice specifying the inclusion of the Open
Publication material and appropriate copyright notice.

<p>SEVERABILITY. If any part of this license is found to be
unenforceable in any jurisdiction, the remaining portions of the
license remain in force.

<p>NO WARRANTY. Open Publication works are licensed and provided "as
is" without warranty of any kind, express or implied, including, but
not limited to, the implied warranties of merchantability and fitness
for a particular purpose or a warranty of non-infringement.


<sect1>REQUIREMENTS ON MODIFIED WORKS

<p>All modified versions of documents covered by this license,
including translations, anthologies, compilations and partial
documents, must meet the following requirements:

<itemize>

<item> 1. The modified version must be labeled as such.

<item> 2. The person making the modifications must be identified and
the modifications dated.

<item> 3. Acknowledgement of the original author and publisher if
applicable must be retained according to normal academic citation
practices.

<item> 4. The location of the original unmodified document must be
identified.

<item> 5. The original author's (or authors') name(s) may not be used
to assert or imply endorsement of the resulting document without the
original author's (or authors') permission.

</itemize>


<sect1>GOOD-PRACTICE RECOMMENDATIONS

<p>In addition to the requirements of this license, it is requested
from and strongly recommended of redistributors that:

<itemize>

<item> 1. If you are distributing Open Publication works on hardcopy
or CD-ROM, you provide email notification to the authors of your
intent to redistribute at least thirty days before your manuscript or
media freeze, to give the authors time to provide updated
documents. This notification should describe modifications, if any,
made to the document.

<item> 2. All substantive modifications (including deletions) be
either clearly marked up in the document or else described in an
attachment to the document.

<item> 3. Finally, while it is not mandatory under this license, it is
considered good form to offer a free copy of any hardcopy and CD-ROM
expression of an Open Publication-licensed work to its author(s).

</itemize>

<sect1>LICENSE OPTIONS

<p>The author(s) and/or publisher of an Open Publication-licensed
document may elect certain options by appending language to the
reference to or copy of the license. These options are considered part
of the license instance and must be included with the license (or its
incorporation by reference) in derived works.

<p>A. To prohibit distribution of substantively modified versions
without the explicit permission of the author(s). "Substantive
modification" is defined as a change to the semantic content of the
document, and excludes mere changes in format or typographical
corrections.

<p>To accomplish this, add the phrase `Distribution of substantively
modified versions of this document is prohibited without the explicit
permission of the copyright holder.' to the license reference or copy.

<p>B. To prohibit any publication of this work or derivative works in
whole or in part in standard (paper) book form for commercial purposes
is prohibited unless prior permission is obtained from the copyright
holder.

<p>To accomplish this, add the phrase 'Distribution of the work or
derivative of the work in any standard (paper) book form is prohibited
unless prior permission is obtained from the copyright holder.' to the
license reference or copy.

</article>

