
                     The Apache HTTP Server Project

                       http://www.apache.org/httpd

                               July 2000

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 27 July 2000:

   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        CyberSolutions, Munich, Germany 
   Ralf S. Engelschall    Munich, Germany.
   Roy T. Fielding        eBuilt, California 
   Tony Finch             Covalent Technologies, California
   Dean Gaudet            Transmeta Corporation, California 
   Dirk-Willem van Gulik  Covalent Technologies, California 
   Brian Havard           Australia
   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 
   Sameer Parekh          California 
   David Reid             UK
   William A. Rowe, Jr.   Covalent, Illinois
   Wilfredo Sanchez       Apple Computer, California
   Cliff Skolnick         California
   Marc Slemko            Canada 
   Greg Stein             California
   Bill Stoddard          IBM Corporation, Research Triangle Park, NC
   Paul Sutton            Seattle
   Randy Terbush          Covalent Technologies, California 

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 src/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://www.apache.org/bug_report.html>.  You can also subscribe
to the announcements mailing list (apache-announce@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://dev.apache.org/>.

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 new-httpd@apache.org mailing list.
One warning though: traffic is high, 1000 to 1500 messages/month.
To subscribe to the list, send "subscribe new-httpd" in the body of
a message to <majordomo@apache.org>.  We recommend reading the list for
a while before trying to jump in to development.

   NOTE: The developer mailing list (new-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 the USENET newsgroup "comp.infosystems.www.servers.unix".

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!

