Home Technical Articles Configure Squid as a Reverse Proxy to Serve Multiple Physical Web Servers from one Static IP
 
Configure Squid as a Reverse Proxy to Serve Multiple Physical Web Servers from one Static IP PDF Print E-mail
User Rating: / 1
PoorBest 
Tecnical Articles - Technical Articles
Written by James Raaymakers   
Monday, 18 January 2010 20:16
I had been looking for a solution to this issue for months. I have one static ip from my ISP. I have an IIS server running DotNetNuke and an Apache2 webserver running JOOMLA (The one serving this content). How could I serve multiple websites running on two or more different servers from one static IP. 
I have a hardware firewall appliance protecting my network.

 

Port 80 was forwarded to my IIS DotNetNuke server. I built a VM Ubuntu 9.04 linux server and installed Squid on it using apt-get. (Had it up and running with squid in less than 30 minutes. Try that with Windows Server 2003 and ISA Server 2004.) I performed the Squid config as outlined below. I have internal DNS running (Windows ActiveDirectory with DNS) so I created DNS zones for each of my web domains with www host records one with the IP of my JOOMLA box the rest to my IIS box. Configured my firewall to send all port 80 traffic to my Squid box.  It worked the 1st time. Cool! Read how I did it by clicking the "Read More..." link below.

Because it was very difficult for me to find this information I bet many others are trying to find this as well. So I copied the article as well as posted a link to it in case this artcle is no longer accessible. Here is the link to it. Please report if it is broken.

Introduction
If like me your ISP provides you with a single static IP address you may think that you are limited to running one web server. Or at the very best using NAT to ports other than port 80 on other servers. There are many reasons why you would wish to use more than one webserver. For example you may wish to have Apache serving one site and Microsoft IIS 6.0 serving another or even JBoss, Tomcat or some other application server.


Background
For my scenario I wished to run Apache and PHP on one server and IIS on another. For this HowTo I will be configuring squid on Ubuntu 9.0. The location of your configuration files may depend on your installation. However for this howto I will be assuming that your configuration files are under /etc/squid and the cache itself is under /var/squid.

Editing squid.conf

The supplied squid.conf is over 4000 lines long. Most of this is documentation added in the comments. For my purposes I created a new squid.conf from scratch.

By default Squid is configured to listen on TCP port 3128. As we wish to use Squid as a web server we need to tell it to listen on port 80 instead. So the first line of our new squid.conf is as follows:

http_port 80 accel defaultsite=www.sweetnam.eu vhost
forwarded_for on


The default site to be served is www.sweetnam.eu and we will use vhost directives to configure the other servers. In addition, the forwarded_for on is required for logging the original client address to the back end server. See below.

The next lines in the configuration are merely Squids default:

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320


The next lines are where we begin to configure the two seperate servers.

First we add a directive to tell Squid the IP address of the first server:

cache_peer 172.20.1.10 parent 80 0 no-query no-digest originserver name=apache login=PASS


You can see from above that I have given a name of apache. All sites that will be hosted on this server will be under this group. Appending login=PASS at the end tells Squid to pass authentication on to the back end server. For example if you have directories password protected using .htaccess.

Next we must tell Squid the domains that will be served under apache:

acl sites_apache dstdomain www.sample.com sample.com
acl our_sites dstdomain
www.sample.com sample.com
cache_peer_access apache allow sites_apache


To add more domain names simply add them after the sample ones above.

Now we will configure the second server:

cache_peer 172.20.1.4 parent 80 0 no-query no-digest originserver name=iis login=PASS
acl sites_iis dstdomain
www.sample2.com sample2.com
acl our_sites2 dstdomain
www.sample2.com sample2.com
cache_peer_access iis allow sites_iis


Next we must ensure that Squids default acl rules are in place. For this I simply copied the defaults:

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT


Next we add two entries to allow the acls that we created for the backend servers:

http_access allow our_sites2
http_access allow our_sites


And finally some more default configuration information:

http_access allow manager all
http_access allow manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all

access_log /var/log/squid/access.log
cache_mgr
This e-mail address is being protected from spambots. You need JavaScript enabled to view it

And that's it your reverse proxy should now be configured and is ready to start serving requests. So you may now start squid by entering the following at a console:

/etc/init.d/squid start

Notes


All the above assumes that you have DNS configured so that each domain name that you have is pointing to the IP address of the reverse proxy.

The reverse proxy must be facing the internet. Either directly or by port forwarding.


Complete squid.conf


http_port 80 accel defaultsite=www.sweetnam.eu vhost
forwarded_for on

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320

cache_peer 172.20.1.10 parent 80 0 no-query no-digest originserver name=apache login=PASS
acl sites_apache dstdomain www.sample.com sample.com
acl our_sites dstdomain www.sample.com sample.com
cache_peer_access apache allow sites_apache

cache_peer 172.20.1.4 parent 80 0 no-query no-digest originserver name=iis login=PASS
acl sites_iis dstdomain www.sample2.com sample2.com
acl our_sites2 dstdomain www.sample2.com sample2.com
cache_peer_access iis allow sites_iis

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

http_access allow our_sites2
http_access allow our_sites

http_access allow manager all
http_access allow manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all

access_log /var/log/squid/access.log
cache_mgr This e-mail address is being protected from spambots. You need JavaScript enabled to view it


Configuring Logging to the back end servers
When using a reverse proxy you may notice that the logs on the back end servers will show hits as coming from the proxy rather then the client. There is a feature in Squid as noted earlier called forwarded_for on. This will pass the original clients IP address to the back end server. However you need to configure a custom log format on the back end server for logging to occur.

For Apache, I edited the httpd.conf and added a new line in the logging section called cached. This line as it appears in my configuration file looks like this:

LogFormat "%{X-Forwarded-For}i %v %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\" cached
Now you need to configure your default sites or virtual hosts so that they will use the new log format. Simply locate the entry for your host and change the CustomLog entry so that it looks like this:

CustomLog /home/blog/logs/access_log cached
Once you have configured Apache you need to restart the service.

 

 

 

Only registered users can write comments!

!joomlacomment 4.0 Copyright (C) 2009 Compojoom.com . All rights reserved."

Last Updated on Tuesday, 13 April 2010 20:39
 

Login

Joomla Templates by Joomlashack