六、Squid 反向代理
6.1 反向代理工作机制
如果 Squid 反向代理服务器中缓存了该请求的资源,则将该请求的资源直接返回给客户端;否则反向代理服务器将向后台的 Web 服务器请求资源,然后将请求的应答返回给客户端,同时也将该应答缓存在本地,供下一个请求者使用。
静态内容/可缓存内容,如果已写入缓存,由缓存服务器提供。动态内容,由代理服务器转发给web服务器进行请求。
工作机制:
- 缓存网页对象,减少重复请求。
- 将互联网请求轮训或按权重分配到内网Web服务器。
- 代理用户请求,避免用户直接访问Web服务器,提高安全。
6.2 构建 Squid 反向代理服务器
实验环境:
squid服务器:192.168.72.70/24
web1服务器:192.168.72.60/24
web2服务器:192.168.72.40/24
客户机:192.168.72.10/24
1)缓存服务器配置
[root@yuji ~]# vim /etc/squid.conf ...... #--60行--修改,插入以下几行 http_port 192.168.72.70:80 accel vhost vport cache_peer 192.168.72.60 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web1 cache_peer 192.168.72.40 parent 80 0 no-query originserver round-robin max_conn=30 weight=1 name=web2 cache_peer_domain web1 web2 www.yuji.com #表示对www.yuji.com的请求,由squid向192.168.72.60和192.168.72.40的80端口发出请求 ---------------- 虚线内是注释 ---------------------------------------------------------------------------------------- http_port 80 accel vhost vport ##squid从一个缓存变成了一个Web服务器反向代理加速模式,这个时候squid在80端口监听请求,同时和web server的请求端口(vhost vport)绑定,这个时候请求到了squid,squid是不用转发请求的,而是直接要么从缓存中拿数据、要么向绑定的端口直接请求数据。 accel :反向代理加速模式。 vhost :支持域名或主机名来表示代理节点。 vport :支持IP和端口来表示代理节点。 parent :代表为父节点,上下关系,非平级关系。 80 :代理内部web服务器的80端口。 0 :没有使用icp(电信运营商),表示就一台squid服务器。 no-query :不做查询操作,直接获取数据。 originserver :指定是源服务器。 round-robin :指定 squid 通过轮询方式将请求分发到其中一台父节点。 max_conn :指定最大连接数。 weight : 指定权重。 name :设置别名。 ---------------------------------------------------------------------------------------------------------- #清空之前透明模式配置的 iptables 规则 [root@yuji ~]# iptables -F [root@yuji ~]# iptables -t nat -F [root@yuji ~]# netstat -natp | grep :80 #检查一下80端口是否被占用,如果被占用,需要关闭httpd [root@yuji ~]# systemctl stop httpd #防止 httpd 服务使用的 80 端口号和 squid 反向代理配置的监听端口冲突 [root@yuji ~]# systemctl restart squid #重启squid服务 复制代码
2)后端两台节点服务器配置
systemctl stop firewalld setenforce 0 yum install -y httpd systemctl start httpd #节点1: echo "tt is a girl" > /var/www/html/index.html #节点2: echo "nn is a boy" > /var/www/html/index.html echo "I am test02" > /var/www/html/test.html 复制代码
节点服务器1:
节点服务器2:
3)客户机的域名映射配置,进行访问验证
windows系统,修改 C:\Windows\System32\drivers\etc\hosts 文件 192.168.72.70 www.yuji.com Linux系统,修改/etc/hosts文件,添加映射关系 echo "192.168.72.70 www.yuji.com" >>/etc/hosts #squid服务器地址 浏览器不开启代理访问 http://www.yuji.com http://www.yuji.com/test.html squid服务器查看缓存命中情况: [root@yuji ~]# tailf /usr/local/squid/var/logs/access.log 1654596933.113 1 192.168.72.10 TCP_MISS/404 448 GET http://www.yuji.com/favicon.ico - ROUNDROBIN_PARENT/192.168.72.40 text/html 1654597006.164 0 192.168.72.10 TCP_MEM_HIT/200 339 GET http://www.yuji.com/ - HIER_NONE/- text/html 1654597006.257 2 192.168.72.10 TCP_MISS/404 448 GET http://www.yuji.com/favicon.ico - ROUNDROBIN_PARENT/192.168.72.60 text/html 1654597006.279 1 192.168.72.10 TCP_MISS/404 448 GET http://www.yuji.com/favicon.ico - ROUNDROBIN_PARENT/192.168.72.40 text/html #TCP_MEM_HIT/200 表示命中缓存 #ROUNDROBIN_PARENT/192.168.72.60 自动轮询,实现负载均衡 #ROUNDROBIN_PARENT/192.168.72.40 自动轮询,实现负载均衡 复制代码
浏览器不开启代理,访问 www.yuji.com
squid服务器查看访问日志中的缓存命中情况 :
tailf /usr/local/squid/var/logs/access.log
七、小贴士
1、squid服务器的缓存日志含义:
2、Squid、Varinsh和Nginx有什么区别, 工作中你怎么选择?
Squid、Varinsh和Nginx都是代理服务器。
2.1 什么是代理服务器:
代理服务器能代替用户去访问公网,并且能把访问到的数据缓存到服务器本地,等用户下次再访问相同的资源的时候,代理服务器直接从本地回应给用户。当本地没有的时候,我代替你去访问公网,我接收你的请求,我先在我自己的本地缓存找,如果我本地缓存有,我直接从我本地的缓存里回复你;如果我在我本地没有找到你要访问的缓存的数据,那么代理服务器就会代替你去访问公网。
2.2 Squid、Varinsh和Nginx的区别:
1)varnish和squid是专业的cache服务,而nginx是由第三方模块完成。
2) Nginx主要作web应用,以及反向代理。
nginx作为缓存代理服务器,轻量级,安装和配置方便,节约资源。但通过第三方模块来实现,功能较少,应用场景比较少。
3)Varnish是一款高性能的、开源的反向代理服务器和换成服务器。 (只支持反向代理)
优点:
- Vanish具有更好的稳定性、更快的访问速度、更多的并发连接支持数。
- 可以通过管理端口来管理缓存,使用正则表达式批量清除部分缓存,而Squid做不到。
缺点:
- 在高并发状态下,Vanish消耗更多的CPU、I/O和内存资源。
- 只能将缓存内容存在内存中,内存缓存限制了其容量。
- Vanish进程一旦挂起、崩溃或者重启,缓存的数据会从内存中释放,此时所有的请求都会转发到后端服务器上,给后端服务器造成很大压力。
4)Squid的优势在于完整的庞大的cache技术资料,和很多的应用生产环境。
Squid是比较传统的代理技术,可以将缓存数据持久化,即存储到硬盘中。支持正向代理和反向代理。模式众多(传统模式、透明模式、反向代理)。
工作中选择: 复杂场景需要选择专业的cache服务,优先选择squid或者varnish。