I have a production, testing, and development server for a site that I maintain. All three servers are running Apache 2.2.16 on Debian 6 GNU/Linux. I have set up a new version of our company site on the testing server, and my team determined it to be stable enough to move to production. However, I want to make this transition as seamless as possible. I would like to be able to forward requests at production server so they are handled by the testing server. This way, I can test out this new implementation without making any complex configuration changes on the production server.
Ideally, I can use Apache's
mod_proxy module to set up a reverse proxy so that I can serve pages directly from the testing server to production clients. I read the documentation at http://httpd.apache.org/docs/2.0/mod/mod_proxy.html, which was very helpful to me. I enabled
mod_proxy_http, then I set the following rules on my development server.
<VirtualHost *:80> ServerName dev.example.com # ... other <VirtualHost>-specific settings ... ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://test.example.com/ ProxyPassReverse / http://test.example.com # ... various <Directory> directives ... </VirtualHost>
This worked very well. When I accessed the development server, the site served all pages directly from the testing server, and it appeared as if these responses came directly from the server I had connected to. Moreover, these requests were rather snappy, and I was able to make both GET and POST requests as if I was talking directly to the testing server.
Unfortunately, this does not fit all of my needs. Since the testing server only runs Apache with a new version of the site, I cannot host webmail or userdirs from the testing server. These requests must be handled by the production server.
I want my production server to be able to use the reverse proxy for all pages except
/webmail and the user directories (any directory starting with a tilde). In theory this is possible with
<ProxyMatch> directive. However, I do not have sufficient regex-fu to do this. Is there a single rule capable of excluding both of these types of requests from being sent to the proxy server?
Bonus points: I am looking for a good introductory guide to PCRE's, so that I can write my own rules. Does anyone have a recommendation for a regex newbie?