At last night’s Burlington, Vermont PHP Users Group meeting I gave a presentation on Load Balancing with Apache:
I’ve posted the example configuration files for reference.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Create a load balancer named "web-nodes" | |
<Proxy balancer://web-nodes> | |
# Add three load balancer members | |
BalancerMember http://www1.example.com | |
BalancerMember http://www2.example.com | |
BalancerMember http://www3.example.com | |
</Proxy> | |
# Send all requests to the "web-nodes" balancer | |
ProxyPass / balancer://web-nodes |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Create a load balancer named "web-nodes" | |
<Proxy balancer://web-nodes> | |
# Add three load balancer members | |
BalancerMember http://www1.example.com | |
BalancerMember http://www2.example.com | |
BalancerMember http://www3.example.com | |
# Use the PHPSESSID for sticky sessions | |
ProxySet stickysession=PHPSESSID | |
</Proxy> | |
# Send all requests to the "web-nodes" balancer | |
ProxyPass / balancer://web-nodes |
Create your own sticky sessions:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Set a cookie | |
Header add Set-Cookie "NODE=%{BALANCER_WORKER_ROUTE}e; path=/" \ | |
env=BALANCER_ROUTE_CHANGED | |
# Create a load balancer named "web-nodes" | |
<Proxy balancer://web-nodes> | |
# Add three load balancer members | |
BalancerMember http://www1.example.com route=1 | |
BalancerMember http://www2.example.com route=2 | |
BalancerMember http://www3.example.com route=3 | |
# Use the NODE cookie for sticky sessions | |
ProxySet stickysession=NODE | |
</Proxy> | |
# Send all requests to the "web-nodes" balancer | |
ProxyPass / balancer://web-nodes |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Enable mod_rewrite | |
RewriteEngine On | |
# Send POST, PUT, and DELETEs to "write" balancer | |
RewriteCond %{REQUEST_METHOD} ^(POST|PUT|DELETE)$ | |
RewriteRule ^/(.*)$ balancer://write$1 [P] | |
# Send GET, HEAD, and OPTIONS to "read" balancer | |
RewriteCond %{REQUEST_METHOD} ^(GET|HEAD|OPTIONS)$ | |
RewriteRule ^/(.*)$ balancer://read$1 [P] | |
# Modify HTTP response headers (e.g. Location) | |
ProxyPassReverse / balancer://write | |
ProxyPassReverse / balancer://read |
Distributed load testing with Tsung:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0"?> | |
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd"> | |
<tsung loglevel="notice" version="1.0"> | |
<!-- Client side setup --> | |
<clients> | |
<client host="test-a" weight="1" maxusers="10000" cpu="4" /> | |
<client host="test-b" weight="1" maxusers="10000" cpu="4" /> | |
</clients> | |
<!-- Server side setup --> | |
<servers> | |
<server host="www" port="80" type="tcp" /> | |
</servers> | |
<!-- Load setup --> | |
<load> | |
<arrivalphase phase="1" duration="5" unit="minute"> | |
<users arrivalrate="200" unit="second" /> | |
</arrivalphase> | |
</load> | |
<!-- Session setup --> | |
<session name="default" probability="100" type="ts_http"> | |
<thinktime value="1" random="true" /> | |
<request> | |
<http method="GET" url="/" /> | |
</request> | |
</session> | |
<!-- Monitoring setup --> | |
<monitoring> | |
<monitor host="www" type="munin" /> | |
<monitor host="www1" type="munin" /> | |
<monitor host="www2" type="munin" /> | |
<monitor host="www3" type="munin" /> | |
</monitoring> | |
</tsung> |
I cover load balancing and distributed load testing in more detail in my upcoming book, Scaling CouchDB.
One Comment
Thats really great!
Thanks