`

squid实现反向代理的原理

阅读更多

原文 http://www.opendigest.org/article.php/10

 

背景介绍

 

    代理服务器是使用非常普遍的一种将局域网主机联入互联网的一种方式,使用代理上网可以节约紧缺的IP 地址资源,而且可以阻断外部主机对内部主机的访问,使内部网主机免受外部网主机的攻击。但是,如果想让互联网上的主机访问内部网的主机资源(例如:Web 站点),又想使内部网主机免受外部网主机攻击,一般的代理服务是不能实现的,需要使用反向代理来实现。

    本文将详细介绍反向代理服务的概念以及如何利用反向代理服务器提高WEB 服务器的性能和安全性。

 

一.       反向代理的概念

 

什么是反向代理呢?其实,反向代理也就是通常所说的WEB 服务器加速,它是一种通过在繁忙的WEB 服务器和Internet 之间增加一个高速的WEB 缓冲服务器(即:WEB 反向代理服务器)来降低实际的WEB 服务器的负载。典型的结构如下图所示:

 

 

Web 服务器加速(反向代理)是针对Web 服务器提供加速功能的。它作为代理Cache ,但并不针对浏览器用户,而针对一台或多台特定Web 服务器(这也是反向代理名称的由来)。实施反向代理(如上图所示),只要将Reverse Proxy Cache 设备放置在一台或多台Web 服务器前端即可。当互联网用户访问某个WEB 服务器时,通过DNS 服务器解析后的IP 地址是Reverse Proxy ServerIP 地址, 而非原始Web 服务器的IP 地址, 这时Reverse Proxy Server 设备充当Web 服务器,浏览器可以与它连接,无需再直接与Web 服务器相连。因此,大量Web 服务工作量被卸载到反向代理服务上。不但能够防止外部网主机直接和web 服务器直接通信带来的安全隐患,而且能够很大程度上减轻web 服务器的负担,提高访问速度。

 

二.       反向代理和其它代理的比较

 

    下面将对几种典型的代理服务作一个简单的比较。 在网络上常见的代理服务器有三种:

1.  标准的代理缓冲服务器

    一个标准的代理缓冲服务被用于缓存静态的网页(例如:html 文件和图片文件等)到本地网络上的一台主机上(即代理服务器)。当被缓存的页面被第二次访问的时候,浏览器将直接从本地代理服务器那里获取请求数据而不再向原web 站点请求数据。这样就节省了宝贵的网络带宽,而且提高了访问速度。但是,要想实现这种方式,必须在每一个内部主机的浏览器上明确指明代理服务器的IP 地址和端口号。客户端上网时,每次都把请求送给代理服务器处理,代理服务器根据请求确定是否连接到远程web 服务器获取数据。如果在本地缓冲区有目标文件,则直接将文件传给用户即可。如果没有的话则先取回文件,先在本地保存一份缓冲,然后将文件发给客户端浏览器。

2.  透明代理缓冲服务器

    透明代理缓冲服务和标准代理服务器的功能完全相同。但是,代理操作对客户端的浏览器是透明的(即不需指明代理服务器的IP 和端口)。透明代理服务器阻断网络通信,并且过滤出访问外部的HTTP80 端口)流量。如果客户端的请求在本地有缓冲则将缓冲的数据直接发给用户,如果在本地没有缓冲则向远程web 服务器发出请求,其余操作和标准的代理服务器完全相同。对于Linux 操作系统来说,透明代理使用Iptables 或者Ipchains 实现。因为不需要对浏览器作任何设置,所以,透明代理对于ISPInternet 服务器提供商)特别有用。

3.  反向代理缓冲服务器

    反向代理是和前两种代理完全不同的一种代理服务。使用它可以降低原始WEB 服务器的负载。反向代理服务器承担了对原始WEB 服务器的静态页面的请求,防止原始服务器过载。它位于本地WEB 服务器和Internet 之间,处理所有对WEB 服务器的请求,组织了WEB 服务器和Internet 的直接通信。如果互联网用户请求的页面在代理服务器上有缓冲的话,代理服务器直接将缓冲内容发送给用户。如果没有缓冲则先向WEB 服务器发出请求,取回数据,本地缓存后再发送给用户。这种方式通过降低了向WEB 服务器的请求数从而降低了WEB 服务器的负载。

 

三.反向代理工作原理

    反向代理服务器位于本地WEB 服务器和Internet 之间, 如下图所示:

 

当用户浏览器发出一个HTTP 请求时,通过域名解析将请求定向到反向代理服务器(如果要实现多个WEB 服务器的反向代理,需要将多个WEB 服务器的域名都指向反向代理服务器)。由反向代理服务器处理器请求。反向代理一般只缓存可缓冲的数据(比如html 网页和图片等),而一些CGI 脚本程序或者ASP 之类的程序不缓存。它根据从WEB 服务器返回的HTTP 头标记来缓冲静态页面。有四个最重要HTTP 头标记:

  • Last-Modified: 告诉反向代理页面什么时间被修改
  • Expires: 告诉反向代理页面什么时间应该从缓冲区中删除
  • Cache-Control: 告诉反向代理页面是否应该被缓冲
  • Pragma: 告诉反向代理页面是否应该被缓冲.

例如:在默认情况下,ASP 页面返回” Cache-control: private.” ,所以ASP 页面时不会在反向代理服务器缓存的

四. 代理服务器软件squid 简介

Squid Internet Object Cache (Harvest Project 的后续版本) 是美国政府大力助的一项研究计划,其目的为解决网络带宽不足的问题,是现在Unix 系统上使用者最多功能也最完整的一套软体。ApacheNetscape 虽附有相关的Proxy 模块,但因其功能简单而不够普及。有关squid 的详细说明可到squid 网站(http://www.squid-cache.org) 查询。

Squid 最典型的应用是代理局域网的机器联入互联网,它支持现在流行的网络协议。 Squid 的另一项非常出色的功能就是实现反向代理功能。

 

五.使用Squid 配置反向代理(HTTP 加速器)

    通过squid 配置反向代理主要就是配置“squid.conf ”这个配置文件。下面以Linux 操作系统为例进行介绍,其它版本的在UNIX 也同样适用。在Linuxsquid 如果是以源代码方式安装的话,这个文件一般在“/usr/local/squid/etc/ ”目录下。如果是系统自带的squid ,一般配置文件在“/etc/squid/ ”目录下。

1.  Squid 反向代理单个后台WEB 服务器

如果WEB 服务器和反向代理服务器是两台单独的机器(一般的反向代理应该有两块网卡分别连接了内外部网络)。那么,应该修改下面的内容来设置反向代理服务。

http_port 80 # squid 监听的端口
httpd_accel_host 172.16.250.250 #
内部WEB 服务器的IP 地址
httpd_accel_port 80 # WEB
服务器的IP 地址
httpd_accel_single_host on #
转发为缓冲的请求到一台单独的机器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off

    如果WEB 服务器和反向代理服务器是同一台机器。那么,应该设置WEB 服务器的监听端口为非80 端口(比如:81 端口)。要修改的内容如下:

http_port 80 # squid 监听的端口
httpd_accel_host localhost #
内部WEB 服务器的IP 地址
httpd_accel_port 81 # WEB
服务器的IP 地址
httpd_accel_single_host on #
转发为缓冲的请求到一台单独的机器
httpd_accel_with_proxy on #
httpd_accel_uses_host_header off

下面解释一下配置指令。

http_port 80

选项 http_port 指定squid 监听HTTP 请求的端口,一般都设置成80 端口,这样使用户感觉不到反向代理的存在,就像访问真正的WEB 服务器一样。

httpd_accel_host 172.16.250.250 httpd_accel_port 80

选项httpd_accel_host httpd_accel_port 指定WEB 服务器的IP 地址和端口号,可以根据自己的WEB 服务器的实际情况而定。

httpd_accel_single_host on

选项 httpd_accel_single_host on 时,squid 被设置成仅对单一的web 服务器作反向代理。不考虑HTTP 头信息,Squid 转发所有的未被缓冲的页面请求到这个web 服务器。如果squid 需要做多个web 服务器反向代理,必须将此选项设置为off ,并且使用转向器或者DNS 去映射请求到合适的后台WEB 服务器。

httpd_accel_with_proxy on

如果希望squid 既作反向代理服务器又作本地机器的上网代理,需要将httpd_accel_with_proxy 改为 on ,默认情况下是off

httpd_accel_uses_host_header off

HTTP 协议1.1 中,HTTP 请求包括一个主机头信息,指定URL 的主机名或者主机的IP 地址。这个选项可以用来完成多个后台WEB 服务器的反向代理功能。

2 Squid 反向代理多个后台 WEB 服务器

我们可以用 Squid 反向代理多个后台 WEB 服务器。例如:我们可以配置 squid 同时反向代理 www.abc.com, www.xyz.com, www.lmn.com 三个后台 WEB 服务器,示意图如下:

   

Squid 的配置如下:

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_single_host off
httpd_accel_uses_host_header on

(注意: 编译Squid 时需激活Internal DNS 选项)

然后设置设置反响代理需要的域名解析(Internet 用户通过这里解析三个网站的域名)如下:

www.abc.com 202.102.240.74
www.xyz.com 202.102.240.74
www.lmn.com 202.102.240.74

使三个域名都指向反向代理服务器的IP 地址202.102.240.74

下面设置反向代理所需要的DNS 入口信息(即设置内部DNS ,仅仅是squid 在内部使用,Internet 用户不可见)。有两种方法可以设置内部DNS ,使用内部DNS 服务器来解析或者使用/etc/hosts 文件来实现。

使用内部DNS 服务器的资源记录如下:
www.abc.com IN A 172.16.1.2
www.xyz.com IN A 172.16.1.3
www.lmn.com IN A 172.16.1.4

如果使用/etc/hosts 文件来实现内部DNS (编译时应使用disable internal dns 选项), 编辑/etc/hosts 文件添加如下条目:
172.16.1.2 www.abc.com
172.16.1.3 www.xyz.com
172.16.1.4 www.lmn.com

 

结论

    通过本文中的论述和相关实例,可以看出,反向代理方式不单是一种WEB 服务器加速器,而且使也一种对外提供Web 发布时使用的有效的防火墙技术,使用它不但能节约紧缺的IP 地址资源,加速WEB 服务器的访问速度,而且能够保护WEB 主机,因此能够适应多种应用场合。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics