利用 squid 反向代理提高网站性能

简介: 本文在介绍 squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下,利用 DNS 轮询和 Squid 反向代理技术,实现了网站的负载均衡,从而提高了网站的可用性和可靠性。

 

本文在介绍 squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性、安全性方面有很好的用途。作者在具体的实验环境下,利用 DNS 轮询和 Squid 反向代理技术,实现了网站的负载均衡,从而提高了网站的可用性和可靠性。

现在有许多大型的门户网站如 SINA 都采用 squid 反向代理技术来加速网站的访问速度,可将不同的 URL 请求分发到后台不同的 WEB 服务器上,同时互联网用户只能看到反向代理服务器的地址,加强了网站的访问安全。

反向代理的概念

反向代理服务器又称为 WEB 加速服务器,它位于 WEB 服务器的前端,充当 WEB 服

务器的内容缓存器。其系统结构如图 1


图 1. 系统结构

反向代理服务器是针对 WEB 服务器设置的,后台 WEB 服务器对互联网用户是透明的,用户只能看到反向代理服务器的地址,不清楚后台  WEB 服务器是如何组织架构的。当互联网用户请求 WEB 服务时,DNS 将请求的域名解析为反向代理服务器的 IP 地址,这样 URL  请求将被发送到反向代理服务器,由反向代理服务器负责处理用户的请求与应答、与后台 WEB 服务器交互。利用反向代理服务器减轻了后台 WEB  服务器的负载,提高了访问速度,同时避免了因用户直接与 WEB 服务器通信带来的安全隐患。

回页首

Squid 反向代理的实现原理

目前有许多反向代理软件,比较有名的有 Nginx 和 Squid 。 Nginx 是由  Igor Sysoev   为俄罗斯访问量第二的  Rambler.ru 站点开发的,是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP  代理服务器。

Squid是由美国政府大力资助的一项研究计划,其目的为解决网络带宽不足的问题,支持HTTP,HTTPS,FTP 等多种协议,是现在 Unix 系统上使用、最多功能也最完整的一套软体。下面将重点介绍 Squid 反向代理的实现原理和在提高网站性能方面的应用。

Squid反向代理服务器位于本地 WEB 服务器和 Internet 之间 , 组织架构如图 2:


图 2. 组织架构

客户端请求访问 WEB 服务时,DNS 将访问的域名解析为 Squid 反向代理服务器的 IP 地址,这样客户端的 URL  请求将被发送到反向代理服务器。如果 Squid  反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端,否则反向代理服务器将向后台的 WEB  服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。

Squid 反向代理一般只缓存可缓冲的数据(比如 html 网页和图片等),而一些 CGI 脚本程序或者 ASP、JSP 之类的动态程序默认不缓存。它根据从 WEB 服务器返回的 HTTP 头标记来缓冲静态页面。有四个最重要 HTTP 头标记:

  • Last-Modified: 告诉反向代理页面什么时间被修改

  • Expires: 告诉反向代理页面什么时间应该从缓冲区中删除

  • Cache-Control: 告诉反向代理页面是否应该被缓冲

  • Pragma: 用来包含实现特定的指令,最常用的是 Pragma:no-cache

回页首

利用 Squid 反向代理加速网站实例

本实例的域名是 wenjin.cache.ibm.com.cn,通过DNS的轮询 技术,将客户端的请求分发给其中一台 Squid 反向代理服务器处理,如果这台 Squid  缓存了用户的请求资源,则将请求的资源直接返回给用户,否则这台 Squid 将没有缓存的请求根据配置的规则发送给邻居 Squid 和后台的 WEB  服务器处理,这样既减轻后台 WEB 服务器的负载,又提高整个网站的性能和安全性。该系统结构图 3 如下:


图 3. 系统结构

配置的系统环境:

  • 一台 DNS 服务器:操作系统 Freebsd,软件 BIND 9.5,IP 192.168.76.222 ;

  • 三台 Squid 服务器:操作系统 Linux AS 4,软件 Squid 3.0,相应的 IP 如下:

Squid1:192.168.76.223 Squid2:192.168.76.224 Squid3:192.168.76.225

 

  • 三台 WEB 服务器:操作系统 Linux AS 4,应用软件 Tomcat 5.0+Mysql,相应的 IP 地址如下:

webServer1:210.82.118.195 webServer2:192.168.76.226 webServer1:192.168.76.227

 

应用软件的安装和配置

配置 DNS 服务器

软件利用 Freebsd 自带的 bind 9.5 。然后针对该系统配置 bind,首先修改 bind 的配置文件 /etc/namedb/named.conf,在文件中添加

zone "cache.ibm.com.cn"{ type master; file "master/ cache.ibm.com.cn "; };

 

再在 /etc/namedb/master 目录下添加 cache.ibm.com.cn 文件,该文件的内容如下:

$TTL    3600 @       IN      SOA     search. ibm.com.cn. root. ibm.com.cn.  ( 20080807        ; Serial 3600    ; Refresh 900     ; Retry 3600000 ; Expire 3600 )  ; Minimum IN      NS      search.ibm.com.cn. 1       IN      PTR     localhost.ibm.com.cn. wenjin  IN      A       192.168.76.223 wenjin  IN      A       192.168.76.224 wenjin  IN      A       192.168.76.225

 

这样当用户请求的时候,DNS 通过轮询机制将 wenjin.cache.ibm.com.cn 的域名解析为 192.168.76.223、192.168.76.224 和 192.168.76.225 其中之一。

配置完成后,运行 rndc star t 启动 bind 服务。可在 /etc/rc.conf 中设置 named_enable="YES" 使得开机自启动。

用 ps – A |grep named  查看 bind 服务是否起来;

用 nslookup wenjin.cache.ibm.com.cn  测试 bind 服务是否正常运行。

配置 Squid1 服务器

  1. 下载 squid-3.0.STABLE8.tar.gz 源码包,将其放在 /home 目录下

  2. 解压缩tar – zxvf squid-3.0.STABLE8.tar.gz
    设置配置参数:cd squid-3.0.STABLE10
    ./configure – prefix=/usr/local/squid
    将 squid 安装在 /usr/local 目录下

  3. 编译安装:make&make install安装完以后会在 /usr/local 目录下看见 squid 目录。

  4. 配置 squid 配置文件

    编辑 squid.conf  文件,vi /usr/local/squid/etc/squid.conf

    cache_effective_user squid   cache_effective_group squid   ######### 设定 squid 的主机名 , 如无此项 squid 将无法启动  visible_hostname squid1.nlc.gov.cn   ############# 配置 squid 为加速模式 #################   http_port 80 accel vhost vport   icp_port 3130   ##### 配置 squid2、squid3 为其邻居,当 squid1 在其缓存中没有找到请求的资源时,           通过 ICP 查询去其邻居中取得缓存  cache_peer squid2.ibm.com.cn sibling 80 3130   cache_peer squid3.ibm.com.cn sibling 80 3130   ##### squid1 的三个父节点,originserver 参数指明是源服务器,  round-robin  参数指明 squid 通过轮询方式将请求分发到其中一台父节点;  squid 同时会对这些父节点的健康状态进行检查,如果父节点 down 了, 那么 squid 会从剩余的 origin 服务器中抓取数据  cache_peer 210.82.118.195 parent 8080 0 no-query originserver round-robin \                                                name=webServer1   cache_peer 192.168.76.226 parent 8080 0 no-query originserver round-robin \                                                name=webServer2   cache_peer 192.168.76.227 parent 8080 0 no-query originserver round-robin \                                              name=webServer3   #### 将 wenjin.cache.ibm.com.cn 域的请求通过 RR 轮询方式转发到三个父节点中的一个  cache_peer_domain webServer1 webServer2 webServer3 wenjin.cache.ibm.com.cn   ##### 下面是一些访问控制、日志和缓存目录的设置  acl localnet src 192.168.76.223 192.168.76.224 192.168.76.225   acl all src 0.0.0.0/0.0.0.0   http_access allow all   icp_access allow localnet   cache_log /usr/local/squid/var/logs/cache.log   access_log /usr/local/squid/var/logs/access.log squid   cache_dir ufs /usr/local/squid/var/cache/ 1000 16 256   ####### 对 squid 的一些优化 ###############   maximum_object_size 10240 KB  ### 能缓存的最大对象为 10M   maximum_object_size_in_memory 512 KB ### 内存中缓存的最大对象 512K   cache_mem 256 MB  ###squid 用于缓存的内存量

    保存后 :wq 退出。

    在 /etc/hosts 文件中添加

    192.168.76.223  squid1.ibm.com.cn   192.168.76.224  squid2.ibm.com.cn   192.168.76.225  squid3.ibm.com.cn

    保存后 : wq 退出。

    检查 squid 配置文件正确与否:/usr/local/squid/bin/squid – k parse

    生成缓存目录/usr/local/squid/bin/squid – z

    启动squid:/usr/local/squid/bin/squid

    配置 squid2 和 squid3 服务器

    squid2 和 squid3 服务器的配置方法和配置参数和 squid1 一样,配置完成后,分别启动这两个服务器上的 squid 服务。

    在 squid 的日志文件 cache.log 中,出现如下日志信息则说明三台 squid 之间成功配置为 sibling,且配置了三个父代理。

    2008/11/17 10:08:47| Configuring Sibling squid1.ibm.com.cn/80/3130   2008/11/17 10:08:47| Configuring Sibling squid3.ibm.com.cn/80/3130   2008/11/17 10:08:47| Configuring Parent 210.82.118.195/8080/0   2008/11/17 10:08:47| Configuring Parent 192.168.76.226/8080/0   2008/11/17 10:08:47| Configuring Parent 192.168.76.227/8080/0   2008/11/17 10:08:47| Ready to serve requests.

测试

测试之前,保证 DNS 服务、三台 squid 服务和三台 web 服务都正常起来。在客户端输入http://wenjin.cache.ibm.com.cn,则正确的显示该网页。服务器端的响应对客户端是透明的,客户端不知道请求是由哪台 WEB 服务器处理的;而且其中某台 Squid 服务器或 WEB 服务器发生故障,也不影响服务的正常运行。

回页首

总结

Squid 是一个开源的软件,利用它的反向代理技术可以提高网站系统的访问速度。本文在真实的网络环境下,利用三台 squid  反向代理服务器加速了网站的性能,同时结合 DNS  轮询技术实现了网站的负载均衡。经过一段时间的测试和试运行,该网站的访问速度和可用性方面都有很大的提高,从未出现过网站服务中断情况。

 

参考资料 

squid 3.0  反向代理加速模式配置 :http://www.hiadmin.com/squid-3%E5%8A%A0%E9%80%9F%E6%A8%A1%E5%BC%8F%E9%85%8D%E7%BD%AE/

转载于:https://www.cnblogs.com/seanxyh/archive/2013/04/03/2998632.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSP432P401R TI Drivers 库函数学习笔记(六)UART 串口

目录API (机翻)上机实战配置初始化和实验实验结果整体代码myUart.cmyUart.hmyTask.cmyTask.hmain.cmain.h平台:Code Composer Studio 10.4.0 MSP432P401R SimpleLink™ 微控制器 LaunchPad™ 开发套件 (MSP-EXP432P401R) API (机翻) 官方UART API 手册 void UA…

Linux 批量杀死进程(详细版本)

🚀 优质资源分享 🚀 学习路线指引(点击解锁)知识定位人群定位🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一…

orapwd创建密码文件

在CMD里输入命令如下&#xff1a;C:\Documents and Settings\Administrator>orapwd Usage: orapwd file<fname> password<password> entries<users> where file - name of password file (mand), password - password for SYS (mand), entries - maximum …

MSP432 库函数实现 PID 电机调角度、调速

目录引脚配置PWM引脚外部中断测量编码器引脚配置代码部分初始化编码器解读Encoder.cEncoder.h测速和控制部分卡尔曼滤波器&#xff0c;用于对所测速度进行滤波kalman.ckalman.h实验效果速度滤波效果控速效果控角效果平台&#xff1a;Code Composer Studio 10.4.0 MSP432P401R …

CSS基本知识点——带你走进CSS的新世界

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

JS 三级联动 下拉列表

<!-- 我的思路&#xff1a; 1.页面加载时便进入后台获得第一级的值&#xff1b; 2.当第一级的值改变时&#xff0c;清空第二级和第三级的值&#xff0c;并加载第二级的值 3.当第二级的值改变时&#xff0c;清空第三级的值&#xff0c;并加载第三级的值 --><table> …

20.网页卷去的距离与偏移量

我们先来看看下面的图&#xff1a; scrollLeft:设置或获取位于给定对象左边界与窗口中目前可见内容的最左端之间的距离 &#xff0c;即左边灰色的内容。 scrollTop:设置或获取位于对象最顶端与窗口中可见内容的最顶端之间的距离 &#xff0c;即上边灰色的内容。 offsetLeft:获取…

【电赛】一阶卡尔曼滤波器 滤波效果良好

目录代码kalman.ckalman.h滤波效果很久以前抄的&#xff0c;忘了是从哪弄的了 我把它改成了这种结构体指针传参的形式&#xff0c;方便在比赛中应用。应用举例见MSP432 PID 电机调角度、调速。 它曾助力笔者获2020年电赛省一等奖。 代码 Q:过程噪声协方差 Q参数调滤波后的曲线…

130. Surrounded Regions

题目&#xff1a; Given a 2D board containing X and O, capture all regions surrounded by X. A region is captured by flipping all Os into Xs in that surrounded region. For example, X X X X X O O X X X O X X O X XAfter running your function, the board should …

计算机是如何启动的?

从打开电源到开始操作&#xff0c;计算机的启动是一个非常复杂的过程。 我一直搞不清楚&#xff0c;这个过程到底是怎么回事&#xff0c;只看见屏幕快速滚动各种提示......这几天&#xff0c;我查了一些资料&#xff0c;试图搞懂它。下面就是我整理的笔记。 零、boot的含义 先问…

hdu 1536(博弈)

传送门&#xff1a;S-Nim 题意&#xff1a;给n个数的集合s&#xff0c; 再给m 组数据&#xff0c;每组表示 k 堆石子&#xff0c;每次可以取的个数只能是集合s中的数量。问先手胜还是输&#xff1f; 分析&#xff1a;sg函数的经典运用&#xff0c;先预处理出所有数量为0~10000的…

写了个 Markdown 命令行小工具,希望能提高园友们发文的效率!

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

MSP432P401R TI Drivers 库函数学习笔记(七)I2C驱动OLED屏幕

目录API (机翻)上机实战引脚配置I2C引脚配置工作指示灯LED1引脚配置文件结构I2C 初始化、读写函数myI2C.cmyI2C.hOLED初始化和测试代码main.cmain.hOLED 驱动程序OLED.cOLED.hOLED_Font.h任务管理myTask.cmyTask.h显示效果平台&#xff1a;Code Composer Studio 10.4.0 MSP432…

xcode5. 安装cocos2d-x 学习中。。。

xcode5. 安装cocos2d&#xff0d;x 学习中。。。 找了一些帖子 没搞出来&#xff0c;后来找到原因了 如今的cocos2d版本号在xcode.5上 没右模版了。用命令行 来运行。看了官方的文档。最终攻克了&#xff5e;&#xff5e;&#xff5e; 对于自己解决的问题都会感到点兴奋。。…

在WPF中实现玻璃模糊效果

在WPF中实现玻璃模糊效果还是比较简单的&#xff0c;主要方式如下&#xff1a; 添加一个Rectangle或其它控件作为玻璃放到顶部图层 将底部图像作为Brush&#xff08;大多数的时候用VisualBrush&#xff09;填充到Rectangle中 对该Rectangle添加高斯模糊效果 在该Rectangle上叠加…

【2013.4.6】微软暑期实习生答案(zz)

这套题难度评价&#xff1a;与去年相比技术上更多考得是语言细节而非算法&#xff0c;很多常规的智力题都是以前老题了&#xff0c;所以总体感觉难度不是很大&#xff0c;但是想拿高分也比较困难。最后吐槽下出题&#xff0c;居然有两道题不严谨&#xff0c;确实让很多同学在做…

【cartographer_ros】五: 发布和订阅陀螺仪Imu信息

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

css reset

最近在想把自己写的demo写成一个完整的项目&#xff0c;在写css reset的时候想参考别人的css reset是怎么来写的&#xff0c;也有想直接下载normalize.css这样的css reset直接用。但是看了张神写的对css reset的重新审视受益匪浅&#xff0c;文章发布的比较早原文地址http://ww…

MSP432P401R TI Drivers 库函数学习笔记(八)ADC

目录API (机翻)上机实战引脚配置ADC引脚配置串口引脚配置指示工作状态的LED1引脚配置代码部分ADC初始化和读取函数myADC.cmyADC.h获取数据并通过串口发送main.cmain.h任务管理函数myTask.cmyTask.h串口代码myUart.cmyUart.h实验结果平台&#xff1a;Code Composer Studio 10.4.…

PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

介绍承接上文的PHP 杂谈《重构-改善既有代码的设计》之 重新组织你的函数继续重构方面的内容。这章主要针对数据的重构。1、争论的声音——直接访问Field还是通过函数&#xff08;Accessor&#xff09;访问Field2.修改Array为Object&#xff1a;当你看到一个Array很像一个数据结…