Using Apache2’s mod_proxy to transition traffic
I was recently in the situation of wanting to transition traffic gradually from an old deployment to a new deployment. It’s a large production system, so rather than just switching the DNS entries to point at the new deployment, I wanted to be able to shift the traffic over in a couple of controlled steps.
It turns out, Apache’s mod_proxy makes this relatively straight forward. You can choose which resource for which you want to move traffic, and easily update the proportion of traffic for that resource which should go through to the new env. Might be old news to some, but not having needed this before, I was quite impressed by Apache2’s configurability:
# Pass any requests for specific-url through to the balancer (defined below) # to transition traffic from the old to new system. ProxyPass /myapp/specific-url/ balancer://transition-traffic/myapp/specific-url/ ProxyPassReverse /myapp/specific-url/ balancer://transition-traffic/myapp/specific-url/ # Send all other requests straight to the backend for the old system. ProxyPass /myapp/ http://old.backend.ip:1234/myapp/ ProxyPassReverse /myapp/ http://backend.ip:1234/myapp/ # Send 50% of the traffic to the old backend, and divide the rest between the # two new frontends. <Proxy balancer://transition-traffic> BalancerMember http://old.backend.ip:1234 timeout=60 loadfactor=2 BalancerMember http://new.frontend1.ip:80 timeout=60 loadfactor=1 BalancerMember http://new.frontend2.ip:80 timeout=60 loadfactor=1 ProxySet lbmethod=byrequests </Proxy>
Once the stats verify that the new env isn’t hitting any firewall or load issue, the loadfactor can be updated (only need to graceful apache) to ramp up traffic so that everything is hitting the new env. Of course, it adds one extra hop for serving requests, but it’s then much safer to switch the DNS entries when you *know* your new system is already handling the production traffic.