单IP代理多Web服务器的解决方案

黄曦

(武汉大学 测绘学院 湖北 武汉 430079)

    引言

WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 WWW 是 Internet 的多媒体信息查询工具,是 Internet 上近年才发展起来的服务,也是发展最快和目前用的最广泛的服务。

目前大多数的企事业单位都有自己的WEB服务器,来向公众展示公司信息或提供特定服务。随着WEB应用的增加,单台的WEB服务器已不能满足需要。拿笔者单位来说,除了单位有一个网站外,还有OA、WEB Mail服务,除此之外单位下属的每个研究所、实验中心都有各自的网站,另外还有就业网、本科生工作网、研究生工作网等大大小小的加起来有将近20个之多。如果将所有的这些web应用放到一台服务器上,这无疑增加了管理上的难度,同时又降低了服务器的安全性以及可靠性:如果某一个网站有漏洞,由于所有文件存放在同一服务器上,因此势必会影响到其它网站的安全性;另外如果服务器因为硬件故障而宕机,会造成所有的这些网站都不能访问。此外有些应用需要不同的系统环境,如有的需要Windows系统,有的则需要Linux系统。因此我将所有的这些应用单独或者几个一起放到了几台不同的服务器上,同时将网站的管理权下放,由用户管理各自的系统以及网站,这样也降低了系统管理上的难度。

但是这样却带来了一个问题:有这样多的网站服务器需要同时提供对外网的服务,大家知道对外网的服务,必须有公网的ip地址或通过具有公网ip的机器做映射。但是WEB服务器通常都使用80端口,这个端口映射到一台服务器没有问题,映射到多台服务器就行不通了。这样就需要有多个IP地址了。但是IP地址在国内普遍都比较紧缺,笔者单位租用的一条光纤专线只有5个ip可以使用。那么有没有一种办法使用少数的几个甚至一个IP地址来同时为多台Web服务器提供可供外部访问的能力?答案是肯定,它就是Squid反向代理。

1 代理与反向代理

1.1代理

所谓代理服务是指由一台拥有真实IP地址的机器,代替若干没有真实IP地址的机器与 Internet上的其他主机打交道,提供代理服务的这台机器称为代理服务器,其整个访问过程如下图。

代理过程

1.2反向代理

此种情况下,内部机器一般为Web服务器,也就是本文所介绍的内容。

2 Squid简介

3 配置举例

现在假设某单位(example.com)有2个WEB应用,所对应的域名地址分别为www1.example.com和www2.example.com,这两个应用分别部署在一台Linux服务器和一台Windows服务器之上,现在我们要使用一台squid代理服务器来代理这两个web服。

3.1网络拓扑结构

实验环境为Vmware workstation 8,各虚拟机的说明如下:

squid代理:

Ubuntu 12.04 Server + squid3

公网IP地址:100.100.100.1

内网IP地址:192.168.0.1

web服务器1:

Linux+Apache,运行www1.example.com所对应的web服务

web服务器2:

Windows+IIS,运行www2.example.com所对应的web服务

Internet用户:

windows xp

3.2 配置步骤

3.2.1 配置DNS

由于使用同一台代理服务器代理以上两个服务器,所以首先要做的是将www1.example.com 以及www2.example.com 所对应的DNS地址指向代理服务器即100.100.100.1。

3.2.2 Squid代理服务器的系统及网络配置

Ubuntu Server系统的安装可以参考以下网址:

https://help.ubuntu.com/12.04/installation-guide/index.html

网络配置可以参考一下网址:

https://help.ubuntu.com/12.04/serverguide/network-configuration.html

3.2.3 Squid的安装和配置

现在我们来具体看下Squid的安装和配置过程

安装:

 

#apt-get update #更新本地软件包源树

#apt-get install squid3 #安装squid3

 

配置:

 

$sudo mv /etc/squid3/squid.conf /etc/squid3/squid3.bak #备份默认配置文件

$sudo vi /etc/squid3/squid.conf #新建squid.conf

 

加入以下内容:

 

acl Servers dstdomain www1.example.com www2.example.com

http_access allow Servers

http_access deny all

http_port 80 accel vhost

cache_peer 192.168.0.11 parent 80 0 no-query originserver name=www1

cache_peer 192.168.0.12 parent 80 0 no-query originserver name=www2

cache_peer_domain www1 www1.example.com

cache_peer_domain www2 www2.example.com

 

下面就squid.conf的各项配置做说明:

acl Servers dstdomain www1.example.com www2.example.com 定义了一个访问控制列表(acl)对象,对象名称是Servers(可随意指定),该对象定义了所有目标域名(dstdomain)为www1.example.com和www2.example.com的http访问,如果需代理更多的服务器,需列在此处,例如www3.example.com。

http_access allow Servers 则表示为允许所有满足acl 对象为Servers(即为上面定义的对象名称)的访问通过squid

http_access deny all 表示拒绝所有其它的http访问

http_port 80 accel vhost

cache_peer 192.168.0.11 parent 80 0 no-query originserver name=www1 定义了一个名为www1(该名称可以随意指定)的缓存节点,节点IP为192.168.0.11,parent