====== Reverse_Proxy_with_apache_mod_proxy ====== So with public IPv4 addresses running out, when moving over to my new KVM hosting setup, I had to give a Private IP 192.168.1.x to some VPSs and then setup a reverse proxy. ====== Setup of mod_proxy ====== Assuming you have debian or ubuntu, its simple: a2enmod proxy a2enmod proxy_http /etc/init.d/apache2 restart ====== Config of mod_proxy with a vhost ====== The following vhost config forwards traffic over port 80 and 443 (https). Of course when a client goes to https://privatevps.website.com they will get the ssl cert of the public facing apache server which most likely will be a different domain. In any case they can choose to accept the ssl cert warning. **Features** - ProxyPreserveHost On means that on apache on the VPS they can setup vhosts as normal and it will work as normal. - ServerAlias *domain.net means that any subdomains the client creates, it will just work with the proxy and traffic will be sent to the private VPS. - https traffic can be sent. This requires ssl setup on apache first. See [[Apache2_SSL_PHP5_MySQL5]] vi /etc/apache2/sites-available/02-proxy-vps1 ProxyRequests Off ProxyPreserveHost On ProxyPass / http://192.168.1.3:80/ ProxyPassReverse / http://192.168.1.3:80/ ServerName www.domain.net ServerAlias *domain.net CustomLog /var/log/apache2/access_domain.log combined ErrorLog /var/log/apache2/error_domain.log ProxyRequests Off ProxyPreserveHost On ProxyPass / https://192.168.1.3:443/ ProxyPassReverse / https://192.168.1.3:443/ ServerName www.domain.net ServerAlias *domain.net CustomLog /var/log/apache2/access_domain.log combined ErrorLog /var/log/apache2/error_domain.log SSLProxyEngine On SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key BrowserMatch "MSIE [[2-6]]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 # MSIE 7 and newer should be able to use keepalive BrowserMatch "MSIE [[17-9]]" ssl-unclean-shutdown a2ensite 02-proxy-vps1 ====== Optional Config on Private VPS ====== One of the main issues with mod_proxy and apache is that in the apache logs on the Private VPS with the private 192.168.1.x IP address, the IP address of the proxy will appear and not (by default) the clients true IP Address. As a result when tailing access.log or error.log on the backend apache server, the ip of the proxy will appear (192.168.1.1). While most people use google analytics or a javascript web traffic method, using webalizer or similar on the backend server won't work. ** The Solution ** apt-get install libapache2-mod-rpaf a2enmod rpaf vi /etc/apache2/mods-enabled/rpaf.conf //Change the following to (where 192.168.1.1 is the proxy IP): RPAFenable On RPAFsethostname On RPAFproxy_ips 192.168.1.1 /etc/init.d/apache2 restart tail /var/log/apache2/access.log Now the true client IP address will show correctly in the access.log behind the proxy server. Conclusion: this method works very well. I have a single vhost for each Private VPS. By default I add a wildcard domain to send traffic to the private VPS. If the client gets a new domain name, I can add it as a ServerAlias. The ProxyPreserveHost makes this easy.