当前位置:操作系统 > Unix/Linux >>

高性能、多线程的高速Web代理服务器--OOPS!

“代理”是指作为替代者代表别人执行任务的人。正如您可能猜到的一样,代理服务器是代表其客户机执行特定任务的程序,如果有必要,这种任务通常可以由代理本身完成。在 Web 世界中,Web 代理服务器是充当信使的程序,它从诸如 Netscape、Mozilla、Internet Explorer 或 Konqueror 等的 Web 浏览器接收 HTTP 请求。然后,Web 代理从 Web 获取适当的数据,并将其传递给客户机。通过使用 Web 代理,Web 客户机可以不必建立与本地网之外任何机器的实际连接而访问因特网;Web 代理处理所有外部的 Web 通信。Web 代理有很多用途。最常用的一个是为处于防火墙之后的局域网提供因特网访问。代理可以绕过防火墙,代表局域网内部的 Web 客户机建立因特网里连接。因此,可以将局域网与因特网完全隔断,而代理则充当“桥梁”并允许 Web 浏览继续进行。另外,Web 代理还可以在同意提供服务之前自己验证局域网用户(通常用用户名和密码认证)。几乎可以将每一种现代浏览器配置成使用 Web 代理,而不是直接连接到因特网。通常,配置需要指定代理服务器的 IP 地址和端口。然后,Web 浏览器将其请求转发到这个特定的主机,而不是试图自己与远程站点联系。除了提供基本的 HTTP 代理功能之外,很多 Web 代理还维护一个最近访问过的 Web 页面和图像的本地高速缓存。当请求的页面或图像已经在代理的高速缓存中时,代理将高速缓存的副本传递给客户机,而不再次从网站直接下载。这样做有两方面好处:首先,它通常会提高局域网装入 Web 页面的速度。其次,通过减少冗余页面和图像下载,可以减少 Web 浏览的带宽使用率。虽然大多数 Web 浏览器自己都有内置的高速缓存,但一般都很小 -- 通常不超过 10 MB。相比之下,高速缓存 Web 代理允许更大的基于磁盘的高速缓存 -- 通常有几百 MB,并且常常可达到几 GB。并且与简单的浏览器代理不同的是,高速缓存 Web 代理将为整个用户组提高访问 Web 的性能并减少网络带宽需求;这是相对弱小的浏览器高速缓存无法办到的。好了,我们已经讨论了 Web 代理和高速缓存 Web 代理,但什么是透明 Web 代理呢?很简单,它是以特殊方式配置的 Web 代理,在这种方式中,Web 客户机(浏览器)甚至不知道它们的 HTTP 请求是通过代理进行的。在它们看来,它们正在直接与实际的远程站点通信。透明代理特别有用,因为一经正确配置,代理将“立即工作”,并且无需配置 Web 浏览器。不仅如此,如果正确配置了透明 Web 代理,想绕过它要困难得多。----------------------------------------------------目前,最流行的开放源码、高性能 Web 代理高速缓存是 Squid,可从http://www.squid-cache.org ] [url=www.squid-cache.org]http://www.squid-cache.org[/url] [/url] 获得。Squid 是一个不错的 Web 高速缓存,但我个人更喜欢不太出名的 oops。oops 是质量极高、快速并且开放源码的高速缓存代理服务器,可从http://zipper.paco.net/~igor/oops.eng/ ] [url=zipper.paco.net/~igor/oops.eng/]http://zipper.paco.net/~igor/oops.eng/[/url] [/url] 获得。我喜欢 oops 是因为它的源码是开放的,并且设计得很好。oops 是多线程的,这可以改进单处理器机器的性能,并且可以极大地提高多处理器系统的性能。另外,oops 可以在后台执行耗时的任务(例如进行检查高速缓存完整性的检查),以便不影响其 Web 代理功能,这是 Squid 无法做到的。oops 还支持一些高级特性,包括带宽控制、连接限制、基于规则表达式的重定向以及其它一些吸引人的功能。我们来讨论一个Linux下基于oops和iptables的透明代理的案例。如果您的 Linux 机器为局域网提供因特网访问(作为网关),则透明配置特别有用,因为那时,局域网上的所有 Web 浏览器将自动使用 oops 作为代理。所要做的全部工作就是把所有的局域网机器配置成将那台 Linux 机器作为缺省网关。如果您的局域网不是这样配置的,您仍可以使局域网客户机使用 oops,但是可能需要配置每一个 Web 浏览器,使其使用在 Linux 机器端口 3128 上运行的代理服务器。您可以使用这种方法,也可以使用我稍后将提到的另一种方法。要安装 oops,请直接到 http://zipper.paco.net/~igor/oops.eng/,单击下载链接,然后下载最新的稳定版(当前是oops-1.5.22.tar.gz 文件)。下载之后,输入以下命令将 tar 文件从打包文件中解开:# tar xzvf oops-1.5.22.tar.gz无论何时运行网络服务,最好尽可能将该服务配置成以非“root”身份运行。当网络服务以非 root 用户运行并发现一处安全性漏洞时,可能会因为非 root 帐户的特权较低而防止安全性漏洞成为主要威胁。当然,oops 是一个设计出色、考虑到安全性问题的程序;然而,oops 的创建者还是决定添加此特性作为额外的安全性措施。它的工作原理是:oops 以 root 权限启动,但它机会立即“降低”到非特权帐户。在我的系统上,有一个 oops 所使用的特殊 "squid"(非登录)用户和组。Oops 在这个 UID 下运行,从而提供一个额外的安全层。另外,我还用特殊许可权设置了 oops /var/log 和 /var/run 目录,以便只有 root 和 "squid" 组成员可以读取其中的文件。我们将大致看一下如何这样做,但目前,您需要确定 oops 将使用哪个 UID。oops 应该使用非登录帐户的 UID;几个不错的选择是 "daemon"、"squid" 或 "oops"。如果有必要,用同一名称创建一个组(确保 UDI 的缺省组就是该组),然后,您就可以开始了。从现在起,每当我提到 "squid" 用户或组时,您都应该用自己选择使用的组名来替换它。我将用红色突出显示 squid,以便给您以提示。好了;现在该编译了。首先,进入 oops 源目录:# cd oops-1.5.22然后,输入带以下选项的配置脚本:# ./configure --prefix=/usr --libdir=/usr/lib/oops --enable-oops-user=squid --sysconfdir=/etc/oops --sbindir=/usr/sbin --localstatedir=/var/run/oops配置完成之后,输入:# make源代码将开始编译。现在,可以安装 oops 了。因为 make 文件是对 Solaris 而不是 Linux 系统准备的,所以这部分有一点棘手。继续进行并输入:# make install"make install" 进程将正确设置大多数事物,但现在,还需要进行一些其它调整。下面是您需要作的:# rm -rf /usr/oops# rm -rf /usr/lib/oops/modules这将除去 "make install" 所创建的两个无关目录。现在,我们需要正确配置 /etc/oops、/var/log/oops、/var/lib/oops 和 /var/run/oops 目录。只有 root、squid 和 squid 组成员能够读取 /etc/oops、/var/log/oops 和 /var/lib/oops 的内容;并且只有 root 和 squid 用户能够写入这些目录:# chmod o-rwx g=wxs /etc/oops# chown -R squid.squid /etc/oops# install -d -o squid -g squid -m0750 /var/log/oops# chmod g+s /var/log/oops# install -d -o squid -g squid -m0750 /var/lib/oops/storage# install -d -o squid -g squid -m0750 /var/lib/oops/db# install -d -o squid -g squid -m0755 /var/run/oops# chmod g+s /var/run/oops现在,所有文件和目录都已就位,但在可以启动 oops 之前还有一步要完成:需要为您的站点定制 oops.cfg 配置文件。oops.cfg 可能会令新用户困惑,因此,我创建了一个最小的 oops.cfg 文件,您应该将它复制到 /etc/oops 中。但首先,将原始 oops.cfg 备份成 oops.cfg.eg。原始文件包含很多有关 oops 更高级特性的有用注释,因此应该将其保留,供以后参考。现在,我将引导您浏览 oops.cfg 文件,并解释该文件的各部分如何工作,以及为使 oops 在您的环境中工作需要作哪些更改。我们首先看一下 oops.cfg 的前三行:nameserver 192.168.1.1http_port 3128userid squid在第一行,我们指定了 oops 将用来执行 DNS 查询的名称服务器。如果需要的话,也可以添加多个名称服务器行;oops 将循环查询每个名称服务器。在您的 oops.cfg 中指定名称服务器很重要,因为这样做将允许 oops 执行它自己的多线程直接 DNS 查询。如果省略nameserver 参数,则 oops 将不得不使用 gethostbyname_r() 函数来执行 DNS 查询。这不是理想的解决方案,因为 gethostbyname_r() 一次只会处理一个 DNS 查询,这就在象 oops 这样高度多线程化的程序中形成一个瓶颈。在 oops.cfg 中指定名称服务器的唯一缺点是:oops 在名称解析过程中不会参考您的 /etc/hosts 文件,而是执行一个简单的 DNS 查询。大多数情况下,这种解决方案都会很好地工作。在第二行,我们设置了 oops 将要侦听的端口:3128 是 Web 代理的标准端口。并且,我们在第三行指定了 oops 将要使用的用户标识。请根据需要修改这行。接下来,我们到达日志行:logfile /var/log/oops/oops.log { 3 1m }accesslog /var/log/oops/oops.access { 3 1m }statistics /var/log/oops/oops.statspidfile /var/run/oops/oops.pid这几行无需更改,但有必要理解其工作原理。第一行配置 oops,使其将常规日志存储在 /var/log/oops/oops.log,并且当该文件超过一兆 ("1m") 时自动翻转 (rotate) 日志。oops 使用 3 个日志进行翻转的机制。下一行指定访问日志的位置,该日志将记录所有 HTTP 请求;这个文件被配置成以与 oops.log 同样的方式自动翻转。接下来,我们指定 oops.stats 的位置。与其它日志文件不同,oops.stats 不会被 oops 定期覆盖(而是象普通日志那样在日志尾部附加内容),因此无需自动翻转。oops.stats 包含一些有用的统计信息,例如运行时间、自 oops 其启动以来的 HTTP 请求数量等。最后,我们指定 pidfile 的位置,该文件将包含 oops 主进程的数字进程标识。为保持与 FHS 2.1 (http://www.pathname.com/fhs/) 一致,将该文件放在 /var/run/oops 中。接下来,我们设置几个高速缓存调整参数:mem_max 128mlo_mark 80m前两个参数是 mem_mark 和 lo_mark,它们调整 oops 的内存高速缓存行为。mem-mark 设置内存高速缓存大小的硬性最大限制;如果 oops 的内存高速缓存大小超过 128 MB,则 oops 将开始丢弃对象。显然,用户应该努力避免这种行为的发生,而这正是 lo_ma
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,