
                     The Apache HTTP Server Project

                        http://httpd.apache.org/

                             February 2002

The Apache Project is a collaborative software development effort aimed
at creating a robust, commercial-grade, featureful, and freely-available
source code implementation of an HTTP (Web) server.  The project is
jointly managed by a group of volunteers located around the world, using
the Internet and the Web to communicate, plan, and develop the server and
its related documentation.  These volunteers are known as the Apache Group.
In addition, hundreds of users have contributed ideas, code, and
documentation to the project.  This file is intended to briefly describe
the history of the Apache Group, recognize the many contributors, and
explain how you can join the fun too.

In February of 1995, the most popular server software on the Web was the
public domain HTTP daemon developed by Rob McCool at the National Center
for Supercomputing Applications, University of Illinois, Urbana-Champaign.
However, development of that httpd had stalled after Rob left NCSA in
mid-1994, and many webmasters had developed their own extensions and bug
fixes that were in need of a common distribution.  A small group of these
webmasters, contacted via private e-mail, gathered together for the purpose
of coordinating their changes (in the form of "patches").  Brian Behlendorf
and Cliff Skolnick put together a mailing list, shared information space,
and logins for the core developers on a machine in the California Bay Area,
with bandwidth and diskspace donated by HotWired and Organic Online.
By the end of February, eight core contributors formed the foundation
of the original Apache Group:

   Brian Behlendorf        Roy T. Fielding          Rob Hartill
   David Robinson          Cliff Skolnick           Randy Terbush
   Robert S. Thau          Andrew Wilson

with additional contributions from

   Eric Hagberg            Frank Peters             Nicolas Pioch

Using NCSA httpd 1.3 as a base, we added all of the published bug fixes
and worthwhile enhancements we could find, tested the result on our own
servers, and made the first official public release (0.6.2) of the Apache
server in April 1995.  By coincidence, NCSA restarted their own development
during the same period, and Brandon Long and Beth Frank of the NCSA Server
Development Team joined the list in March as honorary members so that the
two projects could share ideas and fixes.

The early Apache server was a big hit, but we all knew that the codebase
needed a general overhaul and redesign.  During May-June 1995, while
Rob Hartill and the rest of the group focused on implementing new features
for 0.7.x (like pre-forked child processes) and supporting the rapidly growing
Apache user community, Robert Thau designed a new server architecture
(code-named Shambhala) which included a modular structure and API for better
extensibility, pool-based memory allocation, and an adaptive pre-forking
process model.  The group switched to this new server base in July and added
the features from 0.7.x, resulting in Apache 0.8.8 (and its brethren)
in August.

After extensive beta testing, many ports to obscure platforms, a new set
of documentation (by David Robinson), and the addition of many features
in the form of our standard modules, Apache 1.0 was released on
December 1, 1995.

Less than a year after the group was formed, the Apache server passed
NCSA's httpd as the #1 server on the Internet.

The survey by Netcraft (http://www.netcraft.com/survey/) shows that Apache
is today more widely used than all other web servers combined.

 ============================================================================

Current Apache Group in alphabetical order as of 2 April 2002:

   Greg Ames              IBM Corporation, Research Triangle Park, NC, USA
   Aaron Bannert          Covalent Technologies, California
   Brian Behlendorf       Collab.Net, California 
   Ryan Bloom             Covalent Technologies, California 
   Ken Coar               IBM Corporation, Research Triangle Park, NC, USA
   Mark J. Cox            Red Hat, England
   Lars Eilebrecht        Freelance Consultant, Munich, Germany 
   Ralf S. Engelschall    Cable & Wireless Deutschland, Munich, Germany
   Justin Erenkrantz      University of California, Irvine
   Roy T. Fielding        Day Software, California 
   Tony Finch             Covalent Technologies, California
   Dean Gaudet            Transmeta Corporation, California 
   Dirk-Willem van Gulik  Covalent Technologies, California 
   Brian Havard           Australia
   Ian Holsman            CNET, California
   Ben Hyde               Gensym, Massachusetts
   Jim Jagielski          jaguNET Access Services, Maryland 
   Manoj Kasichainula     Collab.Net, California
   Alexei Kosut           Stanford University, California 
   Martin Kraemer         Munich, Germany
   Ben Laurie             Freelance Consultant, UK 
   Rasmus Lerdorf         Linuxcare, California
   Daniel Lopez Ridruejo  Covalent Technologies, California
   Doug MacEachern        Covalent Technologies, California
   Aram W. Mirzadeh       CableVision, New York 
   Chuck Murcko           The Topsail Group, Pennsylvania 
   Brian Pane             CNET Networks, California
   Sameer Parekh          California 
   David Reid             UK
   William A. Rowe, Jr.   Covalent, Illinois
   Wilfredo Sanchez       Apple Computer, California
   Cliff Skolnick         California
   Marc Slemko            Canada 
   Joshua Slive           Canada
   Greg Stein             California
   Bill Stoddard          IBM Corporation, Research Triangle Park, NC
   Sander Striker         The Netherlands
   Paul Sutton            Seattle
   Randy Terbush          Covalent Technologies, California 
   Jeff Trawick           IBM Corporation, Research Triangle Park, NC
   Cliff Woolley          University of Virginia

Apache Emeritus (old group members now off doing other things)

   Rob Hartill            Internet Movie DB, UK 
   David Robinson         Cambridge University, UK
   Robert S. Thau         MIT, Massachusetts
   Andrew Wilson          Freelance Consultant, UK 
   
Other major contributors

   Howard Fear (mod_include), Florent Guillaume (language negotiation),
   Koen Holtman (rewrite of mod_negotiation),
   Kevin Hughes (creator of all those nifty icons),
   Brandon Long and Beth Frank (NCSA Server Development Team, post-1.3),
   Ambarish Malpani (Beginning of the NT port),
   Rob McCool (original author of the NCSA httpd 1.3),
   Paul Richards (convinced the group to use remote CVS after 1.0),
   Garey Smiley (OS/2 port), Henry Spencer (author of the regex library).

Many 3rd-party modules, frequently used and recommended, are also
freely-available and linked from the related projects page:
<http://modules.apache.org/>, and their authors frequently
contribute ideas, patches, and testing.

Hundreds of people have made individual contributions to the Apache
project.  Patch contributors are listed in the CHANGES file.
Frequent contributors have included Petr Lampa, Tom Tromey, James H.
Cloos Jr., Ed Korthof, Nathan Neulinger, Jason S. Clary, Jason A. Dour,
Michael Douglass, Tony Sanders, Brian Tao, Michael Smith, Adam Sussman,
Nathan Schrenk, Matthew Gray, and John Heidemann.

 ============================================================================

How to become involved in the Apache project

There are several levels of contributing.  If you just want to send
in an occasional suggestion/fix, then you can just use the bug reporting
form at <http://httpd.apache.org/bug_report.html>.  You can also subscribe
to the announcements mailing list (announce-subscribe@httpd.apache.org) which
we use to broadcast information about new releases, bugfixes, and upcoming
events.  There's a lot of information about the development process (much of
it in serious need of updating) to be found at <http://httpd.apache.org/dev/>.

If you'd like to become an active contributor to the Apache project (the
group of volunteers who vote on changes to the distributed server), then
you need to start by subscribing to the dev@httpd.apache.org mailing list.
One warning though: traffic is high, 1000 to 1500 messages/month.
To subscribe to the list, send an email to dev-subscribe@httpd.apache.org.
We recommend reading the list for a while before trying to jump in to 
development.

   NOTE: The developer mailing list (dev@httpd.apache.org) is not
   a user support forum; it is for people actively working on development
   of the server code and documentation, and for planning future
   directions.  If you have user/configuration questions, send them
   to users list <http://httpd.apache.org/userslist> or to the USENET
   newsgroup "comp.infosystems.www.servers.unix".or for windows users,
   the newsgroup "comp.infosystems.www.servers.ms-windows".

There is a core group of contributors (informally called the "core")
which was formed from the project founders and is augmented from time
to time when core members nominate outstanding contributors and the
rest of the core members agree.  The core group focus is more on
"business" issues and limited-circulation things like security problems
than on mainstream code development.  The term "The Apache Group"
technically refers to this core of project contributors.

The Apache project is a meritocracy -- the more work you have done, the more
you are allowed to do.  The group founders set the original rules, but
they can be changed by vote of the active members.  There is a group
of people who have logins on our server (apache.org) and access to the
CVS repository.  Everyone has access to the CVS snapshots.  Changes to
the code are proposed on the mailing list and usually voted on by active
members -- three +1 (yes votes) and no -1 (no votes, or vetoes) are needed
to commit a code change during a release cycle; docs are usually committed
first and then changed as needed, with conflicts resolved by majority vote.

Our primary method of communication is our mailing list. Approximately 40
messages a day flow over the list, and are typically very conversational in
tone. We discuss new features to add, bug fixes, user problems, developments
in the web server community, release dates, etc.  The actual code development
takes place on the developers' local machines, with proposed changes
communicated using a patch (output of a unified "diff -u oldfile newfile"
command), and committed to the source repository by one of the core
developers using remote CVS.  Anyone on the mailing list can vote on a
particular issue, but we only count those made by active members or people
who are known to be experts on that part of the server.  Vetoes must be
accompanied by a convincing explanation.

New members of the Apache Group are added when a frequent contributor is
nominated by one member and unanimously approved by the voting members.
In most cases, this "new" member has been actively contributing to the
group's work for over six months, so it's usually an easy decision.

The above describes our past and current (as of July 2000) guidelines,
which will probably change over time as the membership of the group
changes and our development/coordination tools improve.

 ============================================================================

The Apache Software Foundation (www.apache.org)

The Apache Software Foundation exists to provide organizational, legal,
and financial support for the Apache open-source software projects.
Founded in June 1999 by the Apache Group, the Foundation has been
incorporated as a membership-based, not-for-profit corporation in order
to ensure that the Apache projects continue to exist beyond the participation
of individual volunteers, to enable contributions of intellectual property
and funds on a sound basis, and to provide a vehicle for limiting legal
exposure while participating in open-source software projects. 

You are invited to participate in The Apache Software Foundation. We welcome
contributions in many forms.  Our membership consists of those individuals
who have demonstrated a commitment to collaborative open-source software
development through sustained participation and contributions within the
Foundation's projects.  Many people and companies have contributed towards
the success of the Apache projects. 

 ============================================================================

Why Apache Is Free

Apache exists to provide a robust and commercial-grade reference
implementation of the HTTP protocol.  It must remain a platform upon which
individuals and institutions can build reliable systems, both for
experimental purposes and for mission-critical purposes.  We believe the
tools of online publishing should be in the hands of everyone, and
software companies should make their money providing value-added services
such as specialized modules and support, amongst other things.  We realize
that it is often seen as an economic advantage for one company to "own" a
market - in the software industry that means to control tightly a
particular conduit such that all others must pay.  This is typically done
by "owning" the protocols through which companies conduct business, at the
expense of all those other companies.  To the extent that the protocols of
the World Wide Web remain "unowned" by a single company, the Web will
remain a level playing field for companies large and small. Thus,
"ownership" of the protocol must be prevented, and the existence of a
robust reference implementation of the protocol, available absolutely for
free to all companies, is a tremendously good thing.  

Furthermore, Apache is an organic entity; those who benefit from it
by using it often contribute back to it by providing feature enhancements,
bug fixes, and support for others in public newsgroups.  The amount of
effort expended by any particular individual is usually fairly light, but
the resulting product is made very strong.  This kind of community can
only happen with freeware -- when someone pays for software, they usually
aren't willing to fix its bugs.  One can argue, then, that Apache's
strength comes from the fact that it's free, and if it were made "not
free" it would suffer tremendously, even if that money were spent on a
real development team.

We want to see Apache used very widely -- by large companies, small
companies, research institutions, schools, individuals, in the intranet
environment, everywhere -- even though this may mean that companies who
could afford commercial software, and would pay for it without blinking,
might get a "free ride" by using Apache.  We would even be happy if some
commercial software companies completely dropped their own HTTP server
development plans and used Apache as a base, with the proper attributions
as described in the LICENSE file.

Thanks for using Apache!

