Merge pull request #23 from dsteinbrunner/patch-2
[perlbal.git] / README
blob4cfb116d0cf434964f4e673a376c0ef458d40255
1                                  Perlbal
3                   Copyright 2004, Danga Interactive, Inc.
4                    Copyright 2005-2010, Six Apart, Ltd.
6   You can use and redistribute Perlbal under the same terms as Perl itself.
8                       http://www.danga.com/perlbal/
11 INSTALLATION
12 ------------
14 If you have CPAN installed you can install Perlbal from the command line:
16     $ cpan Perlbal
18 See Perlbal::Manual::Install for further information on installing Perlbal,
19 including instructions for specific operating systems and some
20 troubleshooting (the file lives under lib/Perlbal/Manual/Install.pod, it is
21 recommended that you read it using perldoc).
24 DESCRIPTION
25 -----------
27 Perlbal is a Perl-based reverse proxy load balancer and web server.
29 It processes hundreds of millions of requests a day just for LiveJournal,
30 TypePad and dozens of other high-traffic websites.
32 Perlbal is a single-threaded event-based server supporting HTTP load
33 balancing, web serving, and a mix of the two (see below).
35 Almost everything in Perlbal can be configured or reconfigured on the fly
36 without needing to restart the software (see Perlbal::Manual::Management).
38 In this file you'll find:
40     * GENERAL FEATURES
41     * PERFORMANCE
42     * STATISTICS AND MONITORING
43     * PLUGINS (EXTENSIBILITY)
44     * FURTHER DOCUMENTATION
45     * SUPPORT
46     * CONTRIBUTING
49 GENERAL FEATURES
50 ----------------
52 Perlbal has many features; this is just a short list of some of them:
55 Role: Reverse Proxy
57     * Maintains pool of connected backend connections to reduce turnover
59     * Gets list of nodes either from asynchronously monitored node file, or
60         from in-server pool objects which you can add/remove nodes from
61         using the management interface
63     * Intelligent load balancing based on what backend connections are free
64         for a new request. No unreliable "weighting" numbers required
66     * Can verify (using a quick OPTIONS request) that a backend connection is
67         talking to a webserver and not just the kernel's listen queue before
68         sending client requests at it. Lower latency for the client
70     * Has a high priority queue for sending requests through to backends quickly
72           o Uses cookies to determine if a request should go to fast queue
73             (configurable)
75           o Highpri (high priority) plugin supports making requests high
76             priority by URI or Host
78           o Can specify a relief level to let low priority requests through to
79             prevent starvation
81     * Can allow X-Forwarded-For (and similar) headers from client based on
82         client IP
84     * Configurable header management before sending request to backend
86     * Internal redirection to file or URL(s)
88           o Big one for us; a backend can instruct Perlbal to fetch the user's
89             data from a completely separate server and port and URL, 100%
90             transparent to the user
92           o Can actually give Perlbal a list of URLs to try. Perlbal will find
93             one that's alive. Again, the end user sees no redirects happening
95           o Can also redirect to a local file, which Perlbal will serve
96             non-blocking. See webserver mode below
98     * Persistent client connections (configurable)
100     * Persistent backend connections (shared by multiple clients;
101         no "backend waste") 
104 Role: Web Server
106     * Listen on a port, share from a directory
108     * Directory indexing
110     * Byte range support (clients can resume downloads)
112     * Can have directory index requests fall back to index file list
114           o I.e., requests for /foo/ go to /foo/index.html instead
116           o Multiple index files supported, tries one at a time until it finds
117             one
119     * Persistent client connections (configurable)
121     * Almost all disk operations are done asynchronously as to not stall the
122     event loop
124     * Configurable support for storing files (PUT, DELETE support)
127 PERFORMANCE
128 -------------
130     * Great performance "out-of-the-box" (for both small and large sites)
132     * 100% asynchronous in all the recommended use cases
134     * Lightweight
136     * HTTP Header processing (optionally) done in C with
137         Perlbal::XS::HTTPHeaders for maximum performance
139     * Event-based using epoll or kqueue to avoid the scalability problems of
140         not-so-modern systems
143 STATISTICS AND MONITORING
144 -------------------------
146 Perlbal's management interface provides extremely detailed and powerful
147 statistics in addition to runtime configuration. For example:
149     * CPU usage (user, system)
151     * Total requests served across all services
153     * Requests service by individual backends
155     * Perlbal's uptime
157     * All connected sockets (and tons of info about each)
159     * Outstanding connections to backends
161     * Backends that have recently failed verification
163     * Pending backend connections by service
165     * Total of all socket states by socket type
167     * Size (in seconds and number of connections) of all queues
169     * State of reproxy engine (queued requests, outstanding requests,
170         backends)
172     * Loaded plugins per service
174 (All statistics are in machine readable form, easy to parse and write scripts
175 that check on the status of Perlbal)
178 PLUGINS (EXTENSIBILITY)
179 -----------------------
181 Perlbal supports the concept of having per-service (and global) plugins that
182 can add functionality or override many parts of request handling and behavior.
183 There are many custom plugins that send new headers to the backends, promote
184 requests to the fast queue, maintain more detailed statistics, do image
185 header manipulation, and more.
187 Writing your own plugins is also easy.
189 For more information on how plugins work, and a list of known plugins see Perlbal::Manual::Plugins. You may also find them easily on CPAN.
192 FURTHER DOCUMENTATION
193 ---------------------
195 Perlbal's documentation is split into several sections under
196 Perlbal::Manual::*.
198 Perlbal::Manual provides the index for the manual:
200     perldoc Perlbal::Manual
202 Individual sections can be viewed in the same manner:
204     perldoc Perlbal::Manual::Configuration
205     perldoc Perlbal::Manual::LoadBalancer
206     perldoc Perlbal::Manual::Plugins
208 If you're interested in the internals of the Perlbal:
210     perldoc Perlbal::Manual::Internals
212 The documentation is relatively new (December 2010) and was mostly written
213 or gathered by Bruno Martins and José Castro under a TPF grant. You can read
214 more about it at http://7eip.sl.pt and http://4hw3.sl.pt.
217 SUPPORT
218 -------------
220 Feel free to ask us questions on the mailing list:
222     http://groups.google.com/group/perlbal
224 There are also the old Perlbal List Archives for postings until June 2008:
226     http://lists.danga.com/pipermail/perlbal/
229 CONTRIBUTING
230 -------------
232 You may find information on how to contribute under
233 Perlbal::Manual::Contributing.
235 The source code currently resides in https://github.com/perlbal/Perlbal
238 AUTHOR
239 -------------
241 Perlbal was originally written by Brad Fitzpatrick and counts with the help
242 and contributions from many other people.
244 See Perlbal::Manual::Credits for details.
247 COPYRIGHT
248 -------------
250 Copyright 2004, Danga Interactive, Inc. Copyright 2005-2010, Six Apart, Ltd.
252 You can use and redistribute Perlbal under the same terms as Perl itself.