
                     The Apache HTTP Server Project

                         http://www.apache.org/

                               June 1997

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.

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

Current Apache Group, 1 June 1997

   Brian Behlendorf       Organic Online, California 
   Ken Coar               Process Software Corporation, New England, USA 
   Mark J. Cox            UKWeb, UK 
   Roy T. Fielding        UC Irvine, California 
   Dean Gaudet            Steam Tunnel Operations, California 
   Rob Hartill            Internet Movie DB, UK 
   Jim Jagielski          jaguNET ISP, Maryland 
   Alexei Kosut           Stanford University, California 
   Ben Laurie             Freelance Consultant, UK 
   Chuck Murcko           The Topsail Group, Pennsylvania 
   Aram W. Mirzadeh       Qosina Corporation, New York 
   Sameer Parekh          C2Net, California 
   Paul Sutton            UKWeb, UK 
   Marc Slemko            Canada 
   Randy Terbush          Zyzzyva ISP, Nebraska 
   Dirk-Willem van Gulik  Freelance Consultant, Italy 
   Andrew Wilson          Freelance Consultant, UK 

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

   Robert S. Thau         MIT, Massachusetts
   David Robinson         Cambridge University, UK
   
Other major contributors

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

Many 3rd-party modules, frequently used and recommended, are also
freely-available and linked from the related projects page:
<http://www.zyzzyva.com/module_registry/>, and their authors frequently
contribute ideas, patches, and testing.  In particular, Doug MacEachern
(mod_perl) and Rasmus Lerdorf (mod_php).

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, Martin Kraemer,
Brian Tao, Michael Smith, Adam Sussman, Nathan Schrenk, Matthew Gray,
and John Heidemann.

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

How to join the Apache Group

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/bugdb.cgi>.  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.

If you'd like to become an active member of the Apache Group (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".

The Apache Group 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 core group
of people who have logins on our server (hyperreal.com) 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 context "diff -c3 oldfile newfile"
command), and committed to the source repository by one of the core
developers using remote CVS.

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.
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.

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

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

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!

 ============================================================================
Roy Fielding, June 1997

If you are interested in other WWW history, see <http://www.webhistory.org/>
