mod_proxy
Clustering and load balancingwith Apache 2.2 mod_proxy
Agenda
Proxy architecture Proxy protocols Load balancing Dynamic runtime management
Proxy architecture
Worker conceptForward workerReverse workerNamed reverse workersBalancer workers
Forward worker
Standard mod_proxy forward proxying Enabled globally or per vhost withProxyRequests On
Fixed connection pool sizeSingle on prefork_mpmThreadsPerChild on worker_mpm
Reverse worker
Single global worker Enabled by default Fixed connection pool size
Single on prefork_mpmThreadsPerChild on worker_mpm
Used for unknown reverse proxy requestsfrom mod_rewrite
Named reverse workers
Created for each uniquehostname:port ProxyPass directive
Created for each uniquehostname:port BalancerMember directive
Dynamic connection pool size forthreaded mpm’s.Defaults to ThreadsPerChild
Balancer workers
Virtual worker Contain 1…n real protocol workers
LoadModule balancer_module modules/mod_proxy_balancer.so
<Proxy balancer://cluster> BalancerMember http://remote:port …</Proxy>
Proxy architecture
Shared memory runtime data
Parent process
Listener Socket
Worker #1
Worker #2
Worker #n
Child process
Worker #1
Worker #2
Worker #n
Child process
Worker #1• status• elected• read• transferred• …
Worker #2
Worker #n
Scoreboard
User
Proxy architecture Session affinity
ajp://host1:8009 route=ATomcat/host1jvmRoute=“A”
AJP
13
AJP
/1.3
ajp://host1:8009 route=BTomcat/host2jvmRoute=“B”
AJP
13
AJP
/1.3
<Proxy balancer://cluster> BalancerMember ajp://host1:8009 route=A BalancerMember ajp://host2:8009 route=B</Proxy>
JSESSIONID=XXX.A
Proxy architecture
Sticky sessions
Proxy Protocols
http/https connect ftp ajp balancer
AJP Protocol
Apache Java Protocol Current version 1.3 (AJP13) Binary http protocol No need to marshal/unmarshal http request Reusable connections Supported by most Java app servers
Tomcat Jetty
http://jakarta.apache.org/tomcat/connectors-doc/common/ajpv13a.html
AJP 1.4 Protocol
Next generation AJP protocolEncryptionCompressionFeedback from remote node
Too busy Going to shutdown Change dynamic config Update load balancer factor
Q4 2005
Load Balancing
mod_proxy_balancer.so Protocol independent Multiple strategy
RequestTraffic
Session affinity Failover
Load Balancing
BalancerMemberProtocol worker to remoteMultiple protocolsSession affinity (Sticky sessions)Preferred failover node
Balancer Parameters
<Proxy balancer://cluster param=value .. >
</Proxy>
..
ProxySet balancer://cluster param=value
stickysession
Check for session mark at the end of session identifier.
Configurable session identifier namestickysession=JSESSIONIDstickysession=PHPSESSIONID
JSESSIONID=827BFE8CB4E01BCEAE41D02042485F05.SESSIONMARK
nofailover
Failover by defaultnofailover=On
Disables failover
Bound to remote until expiredEnables removing nodes from cluster
lbmethod
Defines balancer strategylbmethod=Request
Default strategy Counts number of requests to remote
lbmethod=Traffic Default strategy Counts number of bytes read/transferred
timeout
Maximum time to wait for a free connection in secondsAll workers are in error stateAll workers are busyOnly for threaded mpm’s.Limiting the number of opened connection to
remote
maxattempts
Maximum number of failover attemptsDefaults to number of membersmaxattempts=1
No failover
Worker Parameters
ProxyPass http://host param=value ..
BalancerMember ajp://host param=value ..
..
ProxySet http://cluster param=value
loadfactor
loadfactor=1Normalized load factorUsed with BalancerMember loadfactor=1 loadfactor=2Same as: loadfactor=3 loadfactor=6
retry
Number of seconds to retry the worker Default is 60 seconds.
Connection pool tuning
min Initial number of connections to remote
max Maximum number of connections to remote
smax connections to remote that will not be destroyed
ttl destroy all the connections that exceed the smax
keepalive
keepalive=OnSend SO_KEEPALIVEUseful if remote is behind firewall
timeout
Connection timeout in secondsDefaults to ServerTimeout
route
Session route nameMatch with jvmRoute in Tomcat
route=someName
..
<Engine .. jvmRoute=“someName” />
redirect
Preferred failover If session route worker is in error state
BalancerMember .. route=A redirect=B
..
BalancerMember .. route=B
Dynamic runtime management
Runtime statusHook for status_module
Balancer managerWeb page management
Runtime status
LoadModule status_module ....<Location /server-status>
SetHandler server-statusOrder deny,allowDeny from allAllow from localhost
</Location>..
ProxyStatus On
Runtimestatus
Balancer Manager
Dynamic management of balancer Management of balancer members
Balancer Manager
LoadModule proxy_balancer_module ..
..
<Location /manager>
SetHandler balancer-manager
Order deny,allow
Deny from all
Allow from localhost
</Location>
Q&A
Thank you
Mladen [email protected]