Apache reverse proxy
could do with filling out more detail
A reverse proxy allows you to front multiple websites from a single public IP address, act as a load balancer and potentially defuse otherwise dangerous cyber attacks. There are different solutions, the instructions here are for an Apache server-based solution. Basic requirements are Apache, mod_ssl and mod_proxy installed and enabled.
Installation
Install apache2
apt-get install apache2
File /etc/apache2/mods-available/proxy.conf should look like this:
<IfModule mod_proxy.c> # If you want to use apache2 as a forward proxy, uncomment the # 'ProxyRequests On' line and the <Proxy *> block below. # WARNING: Be careful to restrict access inside the <Proxy *> block. # Open proxy servers are dangerous both to your network and to the # Internet at large. # # If you only want to use apache2 as a reverse proxy/gateway in # front of some web application server, you DON'T need # 'ProxyRequests On'. ProxyRequests Off <Proxy *> AddDefaultCharset off Order deny,allow Deny from all </Proxy> # Enable/disable the handling of HTTP/1.1 "Via:" headers. # ("Full" adds the server version; "Block" removes all outgoing Via: headers) # Set to one of: Off | On | Full | Block #ProxyVia Off ProxyVia On ProxyPreserveHost On ProxyRequests Off ProxyTimeout 600 </IfModule>
Create file /etc/apache2/mods-available/proxy_http.conf and put this inside:
ProxyVia On ProxyPreserveHost On ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy>
Enable modules proxy and proxy_http
a2enmod proxy a2enmod proxy_http
And restart apache2
service apache2 restart
Adding an entry
In Apache we use vhost declarations to define each reverse proxy FQDN. In Ubuntu/Debian systems these are found in /etc/apache2/sites-available, typically one per vhost using a suitably descriptive name. They can also be wrapped into a single file, or of course into the main apache conf file. As they are effectively (includes) of the Apache conf, every change requires an Apache restart to apply:
apache2ctl restart
In the Debian/Ubuntu model you also need to enable a site one it's been defined, which is done with a link to the /etc/apache2/sites-available/ file newly created:
cd /etc/apache2/sites-enabled ln -s ../sites-available/yournewvhost
This approach allows you to quickly and easily take a specific site offline if there's a problem, just by deleting the link in /etc/apache2/sites-enabled and restarting Apache.
Assuming your sites will be https from the proxy outwards, start with a 301 to force https:
<VirtualHost *:80> ServerName my.domain.name ServerAlias my.alias.domain Redirect 301 / https://my.domain.name ProxyPass / http://my.realserver.nameorIP/ ProxyPassReverse / http://my.realserve.nameorIP/ CustomLog /var/log/apache2/my.domain.name.access.log combined ErrorLog /var/log/apache2/my.domain.name.error.log </VirtualHost>
And then add an SSL entry
<VirtualHost *:443> ServerName my.domain.name SSLEngine on SSLCertificateFile /etc/apache2/ssl/mycertificate.crt SSLCertificateKeyFile /etc/apache2/ssl/mykey.key SSLCertificateChainFile /etc/apache2/ssl/myintermediatecertificateifneeded.crt ProxyPass / http://myrealserver.nameorIP/ ProxyPassReverse / http://my.domain.name/ ProxyPassReverse / http://myrealserver.nameorIP/ CustomLog /var/log/apache2/my.domain.name.access.log combined ErrorLog /var/log/apache2/my.domain.name.error.log </VirtualHost>
If you want the SSL proxy to also connect to the target as SSL, change the ProxyPass URLs appropriately and add to the vhost
SSLProxyEngine On</ssl>