"It's not friendly - it's like a reference book". Customer comment on yesterday's tailored training day, where we were load balancing a web application between a number of back end servers, using Apache httpd, with mod_proxy and mod_rewrite to do the clever bits.
Our customers are right - it IS tough for a newcomer to work out what to do from the mod_rewrite manual. So you might like, for starters, to read
my article on techniques for load balancing and clustering. Then you might like to look at some of the
sample configuration files that we used to have a single httpd instance share the load between multiple further httpds, or multiple Tomcats.
Yes, that's right, the solution works not only for Java applications, but also for Perl and PHP ones!
For newcomers to balancing the load, via mod_rewrite and mod_proxy, here's a commented version of the additions we made to httpd.conf at the end of the day, to share PHP applications in a directory called /demo on our backend servers via a URL called /booze on our front end.
# Set up a mapping of server names - see below
RewriteMap SERVERS rnd:/usr/local/apache2/conf/phpbal.conf
# Only make the following tests if the URL starts /booze
<Location /booze>
RewriteEngine On
# Look for a cookie called "what", which is the flag
# we use for a continuing session.
# If the cookie is there, it's been set up to include the
# server name as given in the phpbal file ... and if you
# find it, rewrite the URL to the appropriate server,
# in the demo directory. The [P,L] tells mod_rewrite to
# call mod_proxy for the new URL, and that this is the last
# rewrite in the chain - i.e. if it matches, don't look at
# any further instructions!
RewriteCond %{HTTP_COOKIE} "what=(\w+)-(\w+)"
RewriteRule /booze/(.*) http://${SERVERS:%1}/demo/$1 [P,L]
# If there was no cookie, however, this is the first request
# of a series and it should be forwarded to a server in the
# group at random. FIRST is defined in phpbal.conf
RewriteRule /booze/(.*) http://${SERVERS:FIRST}/demo/$1 [P]
</Location>
# Responses from the two servers may (will?) have been
# rewritten to point directly back at the back end server.
# Rewrite those returned URLs so that future requests will
# also be brokered via the front end server, and the back
# end system will be transparent to the user.
ProxyPassReverse /booze http://192.168.200.67:80/demo
ProxyPassReverse /booze http://www.wellho.net:80/demo
The phpbal.conf file is as follows:
local 192.168.200.67:80
live www.wellho.net:80
FIRST 192.168.200.67:80|www.wellho.net:80
and that instructs the server to randomly choose between our live web server and one of the servers in our training centre for first service ... then to revert to the same server if the cookie is set with a "live" or "local" value. The full source of the PHP application we tested with is in one of the links above, but the vital line to set the cookie is worth reproducing here:
setcookie("what","local-".$uniquekey);
with "local" changed to "live" on the second system in the cluster ...
I do enjoy days like yesterday, when we explored topics that are advanced and not quite the nor for our usual courses. My customer left really happy with what we had done, and I had the opportunity to push through and develop further practical knowledge and further my own understanding of some of the detail - a true win/win. And of course I'm all the better place not if YOU want to come and learn more about sharing the load across servers - whether you've a PHP or Java application. (written 2006-11-21, updated 2006-11-26)
Associated topics are indexed as below, or enter http://melksh.am/nnnn for individual articles
H114 - Sourcing, installing and configuring PHP [192] Current MySQL and PHP paths and upgrades - (2005-01-28)
[316] Development Environments - (2005-05-19)
[481] PHP upgrade - traps to watch - (2005-10-31)
[1667] Checking server performance for PHP generated pages - (2008-06-06)
[1688] cannot restore segment prot after reloc message - PHP / httpd - (2008-06-26)
[1731] Apache httpd, MySQL, PHP - installation procedure - (2008-08-01)
[1768] What is built in to this httpd and PHP? - (2008-08-23)
[1936] Quick Summary - PHP installation - (2008-12-12)
[2317] How to make a Risotto (PHP build style) - (2009-08-02)
[2433] Controlling, supressing, enabling PHP error messages - (2009-10-02)
[2589] Your PHP code does not work? Here is where to start looking. - (2010-01-18)
[2646] Compile but do not run PHP - syntax check only - (2010-02-22)
[3132] Virtual Hosting with Apache http server - an overall scheme, and avoiding common pitfalls - (2011-01-14)
[3635] Parse error: parse error, unexpected T_STRING on brand new web site - why? - (2012-03-03)
[3955] Building up from a small PHP setup to an enterprise one - (2012-12-16)
[4319] PHP - some quick fixes if scripts have issues, and how to use our support - (2014-11-19)
[4437] Adding a PHP build option, rotating an image based on camera data, and a new look at thumbnails in PHP - (2015-02-22)
A900 - Web Application Deployment - Tomcat - Extra Features [1006] Apache httpd and Apache Tomcat together tips - (2006-12-24)
[1121] Sharing the load with Apache httpd and perhaps Tomcat - (2007-03-29)
[1370] Apache Tomcat Performance Tuning - (2007-09-29)
[1376] Choosing between mod_proxy and mod_rewrite - (2007-10-02)
[1377] Load Balancing with Apache mod_jk (httpd/Tomcat) - (2007-10-02)
[1383] Monitoring mod_jk and how it is load balancing - (2007-10-07)
[1896] Virtual Hosts and Virtual Servers - (2008-11-20)
[1899] Virtual Hosting under Tomcat - an example - (2008-11-22)
[1939] mod_proxy_ajp and mod_proxy_balancer examples - (2008-12-13)
[3018] Tuning Apache httpd and Tomcat to work well together - (2010-10-27)
A690 - Web Application Deployment - Clustering and load balancing [1771] More HowTo diagrams - MySQL, Tomcat and Java - (2008-08-24)
[1993] Load Balancing - Hardware or Software? - (2009-01-15)
[1995] Automated server heartbeat and health check - (2009-01-16)
[2059] Sharing the load between servers - httpd and Tomcat - (2009-02-28)
[2482] Load balancing with sticky sessions (httpd / Tomcat) - (2009-10-29)
[2483] Clustering on Tomcat - (2009-10-30)
[3293] Distributing the server load - yet ensuring that each user return to the same system (Apache httpd and Tomcat) - (2011-05-18)
[3339] Simplest ever proxy configuration? - (2011-06-28)
[3892] Distributed, Balanced and Clustered Load Sharing - the difference - (2012-10-13)
[4432] Java web application for teaching - now with sessions and clustering / load balancing demonstrations - (2015-02-20)
A608 - Web Application Deployment - Apache httpd mod_proxy [631] Apache httpd to Tomcat - jk v proxy - (2006-03-03)
[1566] Strange behaviour of web directory requests without a trailing slash - (2008-03-06)
[1767] mod_proxy and mod_proxy_ajp - httpd - (2008-08-22)
[1944] Forwarding session and cookie requests from httpd to Tomcat - (2008-12-14)
[2062] Virtual hosting and mod_proxy forwarding of different domains (httpd) - (2009-03-01)
[2273] Three recent questions on Tomcat Convertors - (2009-07-07)
[2325] Apache, Tomcat, mod_proxy - (2009-08-06)
[3680] How can I run multiple web servers behind a single IP address? - (2012-04-02)
A607 - Web Application Deployment - Apache httpd mod_rewrite [755] Using different URLs to navigate around a single script - (2006-06-11)
[1009] Passing GET parameters through Apache mod_rewrite - (2006-12-27)
[1207] Simple but effective use of mod_rewrite (Apache httpd) - (2007-05-27)
[1381] Using a MySQL database to control mod_rewrite via PHP - (2007-10-06)
[1636] What to do if the Home Page is missing - (2008-05-08)
[1778] Pointing all the web pages in a directory at a database - (2008-08-30)
[1954] mod_rewrite for newcomers - (2008-12-20)
[2094] If you have a spelling mistake in your URL / page name - (2009-03-21)
[2555] Bookkeeping - (2009-12-29)
[2728] Redirecting a home page using mod_rewrite - (2010-04-17)
[2768] Carrying a long URL around - looking for memorable shorts - (2010-05-17)
[2773] Dynamically watching your web site via a PHP wrapper - (2010-05-21)
[2900] Redirecting a page - silent, temporary or permanent? - (2010-08-03)
[2981] How to set up short and meaningfull alternative URLs - (2010-10-02)
[3197] Finding and diverting image requests from rogue domains - (2011-03-08)
[3568] Telling which ServerAlias your visitor used - useful during merging domains - (2012-01-04)
[3753] Adding a passcode to a directory - (2012-06-05)
[3862] Forwarding a whole domain, except for a few directories - Apache http server - (2012-09-17)
A603 - Web Application Deployment - Further httpd Configuration [345] Spotting a denial of service attack - (2005-06-12)
[466] Separating 'per instance' data from binaries and web sites - (2005-10-16)
[526] Apache httpd - serving web documents from different directories - (2005-12-12)
[550] 2006 - Making business a pleasure - (2006-01-01)
[649] Denial of Service ''attack'' - (2006-03-17)
[662] An unhelpful error message from Apache httpd - (2006-03-30)
[853] To list a directory under httpd on a web server, or not? - (2006-09-02)
[1080] httpd.conf or .htaccess? - (2007-02-14)
[1351] Compressing web pages sent out from server. Is it worth it? - (2007-09-14)
[1355] .php or .html extension? Morally Static Pages - (2007-09-17)
[1551] Which modules are loaded in my Apache httpd - (2008-02-23)
[1554] Online hotel reservations - Melksham, Wiltshire (near Bath) - (2008-02-24)
[1564] Default file (MiMe types) for Apache httpd and Apache Tomcat - (2008-03-04)
[1619] User and Group settings for Apache httpd web server - (2008-04-22)
[1707] Configuring Apache httpd - (2008-07-12)
[1762] WEB-INF (Tomcat) and .htaccess (httpd) - (2008-08-20)
[1955] How to avoid duplicating web page maintainance - (2008-12-20)
[1974] Moving a directory on your web site - (2009-01-03)
[2060] Database connection Pooling, SSL, and command line deployment - httpd and Tomcat - (2009-03-01)
[2272] Monitoring and loading tools for testing Apache Tomcat - (2009-07-07)
[2478] How did I do THAT? - (2009-10-26)
[3133] An image from a website that occasionally comes out as hyroglyphics - (2011-01-14)
[3449] Apache Internal Dummy Connection - what is it and what should I do with it? - (2011-09-19)
[4001] Helping search engines with appropriate 400 error codes - (2013-02-11)
[4307] Identifying and clearing denial of service attacks on your Apache server - (2014-09-27)
Some other Articles
Bratton and Edington new town, WiltshireDisplay an image from a MySQL database in a web page via PHPGlobal, Superglobal, Session variables - scope and persistance in PHPAutumn leaves in Wiltshire - PotterneClustering, load balancing, mod_rewrite and mod_proxyCourse Joining package - updatedA tale of a wee wallBefore and After - Well House Manor-> , >= and => in PerlPresenting Melksham - for a weekend away in Wiltshire