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
and 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?