一、代理概述
1、代理概念
1.1 正向代理(Forward Proxy)
-
概念:正向代理是位于客户端和目标服务器之间的代理服务器,代表客户端向目标服务器发送请求。客户端将请求发送给代理服务器,然后代理服务器将请求转发给目标服务器,并将响应返回给客户端
-
作用:隐藏客户端的真实 IP 地址,访问受限网站、保护客户端隐私、提高访问速度等。
-
示例:企业内部网络中的代理服务器、翻墙工具
1.2 反向代理(Reverse Proxy)
-
概念:反向代理是位于目标服务器和客户端之间的代理服务器,代表目标服务器向客户端返回响应。客户端发送请求给反向代理,反向代理根据配置将请求转发给相应的目标服务器,然后将目标服务器的响应返回给客户端。
-
作用:负载均衡、安全防护、缓存加速、隐藏服务器真实 IP 地址等。
-
示例:CDN(内容分发网络)、负载均衡器、应用服务器集群等
1.3 正向代理与反向代理的区别
区别 | 正向代理 | 反向代理 |
---|---|---|
位置 | 位于客户端和目标服务器之间 | 位于目标服务器和客户端之间 |
目的 | 代理客户端向外部服务器发送请求 | 代理服务器向客户端返回响应 |
隐藏对象 | 隐藏客户端的真实 IP 地址 | 隐藏服务器的真实 IP 地址 |
常见应用 | 翻墙、保护隐私等个人使用场景 | 负载均衡、安全防护等企业和网站运维场景 |
2、同构代理与异构代理
2.1 同构代理
- 概念:同构代理是一种代理服务器,它与目标服务器具有相同的协议和功能特性。简单来说,同构代理与目标服务器使用相同的协议进行通信
- 作用:通常是在客户端和服务器之间充当中间人,以提供增强的功能,如缓存、负载均衡或安全性增强。同构代理可以实现请求的拦截、处理和转发,但不会更改协议类型
- 示例:如果目标服务器是一个 HTTP 服务器,同构代理也是一个 HTTP 代理。同样,如果目标服务器是一个 SOCKS5 代理服务器,同构代理也是一个 SOCKS5 代理。
2.2 异构代理
- 概念:异构代理是一种代理服务器,它与目标服务器使用不同的协议进行通信。简单来说,异构代理与目标服务器使用不同的协议
- 作用:异构代理通常用于在不同协议之间进行桥接和转换,从而允许连接和通信的两端使用不同的协议。这可以在多个网络环境中提供灵活性和互操作性
- 示例:如果目标服务器使用 HTTP 协议,但异构代理使用 SOCKS5 协议与目标服务器通信,那么它是一个异构代理。异构代理在协议转换和协议适配上起到了关键作用。
2.3 同构代理与异构代理的区别
在于代理服务器与目标服务器之间使用的协议是否相同
同构代理与目标服务器具有相同的协议,而异构代理则使用与目标服务器不同的协议
二、反向代理基础配置
1、反向代理模块
官方文档: https://nginx.org/en/docs/http/ngx_http_proxy_module.html
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能
模块 | 功能 |
---|---|
ngx_http_proxy_module | 将客户端的请求以http协议转发至指定服务器进行处理 |
ngx_http_upstream_module | 用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组 |
ngx_stream_proxy_module | 将客户端的请求以tcp协议转发至指定服务器处理 |
ngx_http_fastcgi_module | 将客户端对php的请求以fastcgi协议转发至指定服务器助理 |
ngx_http_uwsgi_module | 将客户端对Python的请求以uwsgi协议转发至指定服务器处理 |
2、反向代理配置指令
proxy_pass;
#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP
地址:端口的方式
#也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
3、实现单台反向代理(基于ip)
反向代理服务器配置:
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server{listen 80;server_name www.dh.com;root /mnt;location / {proxy_pass http://172.16.12.12; #访问本机的根等于访问指定目的服务器的根}
}
[root@localhost ~]#nginx -s reload
[root@localhost ~]#echo "welcome to proxy_server" > /mnt/index.html
目的服务器配置:
[root@localhost ~]#yum install -y httpd
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#cd /var/www/html/
[root@localhost html]#vim index.html
<html>
<body>
<h1>welcome to destination_server </h1>
</body>
客户端测试:
4、实现单机反向代理(基于端口)
反向代理服务器配置:
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server{listen 80;server_name www.dh.com;root /mnt;location / {proxy_pass http://172.16.12.12:9527;}
}
[root@localhost ~]#nginx -s reload
目的服务器配置:
[root@localhost ~]#vim /etc/httpd/conf/httpd.conf
Listen 9527
[root@localhost ~]#systemctl restart httpd
客户端测试:
5、反向代理的常见错误状态码
5.1 502(Bad Gateway)
表示服务器作为网关或代理,收到目的服务器的无效响应。当请求通过代理服务器转发到目的服务器时,如果代理服务器收到目的服务器的响应无效(例如无响应,格式错误等),就会返回502错误给客户端。通常,这种错误表明目的服务器无法正常工作或响应异常
模拟一:给目的服务器作防火墙规则
[root@localhost ~]#iptables -A INPUT -s 172.16.12.10 -j REJECT
#客户端再次访问,会出现502,一般出现502代表目的服务器挂了
[root@localhost ~]#iptables -vnL --line-numbers
客户端测试:
模拟二:直接关闭目的服务器
[root@localhost ~]#systemctl stop httpd
客户端测试:
5.2 504(Gateway Timeout)
表示服务器作为网关或代理,但在完成请求时等待响应超时。当客户端向代理服务器发送请求后,代理服务器将请求转发给目的服务器,但在规定的时间内未能从目的服务器获取到响应,就会返回504错误给客户端。这可能是由于目的服务器过载、响应时间过长或网络连接问题导致
模拟一:给目的服务器作防火墙规则
[root@localhost ~]#iptables -R INPUT 1 -s 172.16.12.10 -j DROP
#客户端再次访问会出现504网关超时(有可能只是处理时间久,服务器不一定挂了),时间较长1分钟,没有定义代理超时时间
[root@localhost ~]#iptables -vnL --line-numbers
客户端测试:
6、反向代理服务器配置文件不加/与加/
情况一:当代理服务器配置文件不加/
反向代理服务器配置:
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server{listen 80;server_name www.dh.com;root /mnt;location /api {proxy_pass http://172.16.12.12;}
}
[root@localhost ~]#nginx -s reload
[root@localhost ~]#mkdir /mnt/api
[root@localhost ~]#echo "api api api api" > /mnt/api/index.html
目的服务器配置:
[root@localhost ~]#mkdir /var/www/html/api/
[root@localhost ~]#echo "api api api api" > /var/www/html/api/index.html
情况二:当代理服务器配置文件加/
反向代理服务器配置:
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server{listen 80;server_name www.dh.com;root /mnt;location /api {proxy_pass http://172.16.12.12/;}
}
[root@localhost ~]#nginx -s reload
总结:
- 是否在代理目标后面添加斜杠
/
主要取决于后端服务器对请求 URI 的要求- 不使用
/
作为代理目标,Nginx 会将匹配到的 URI 去除掉,然后将剩余部分添加到代理目标中如果后端服务器只需要请求 URI 的一部分,就不需要添加斜杠
/
- 使用
/
作为代理目标时,Nginx 会将请求的 URI 原封不动地发送到代理服务器如果后端服务器期望接收完整的请求 URI,就需要在代理目标后面加上斜杠
/
注:
/api能匹配的可能性太多,一般不加/,不允许替换,只能追加
三、实现反向代理的动静分离
1、动态资源和静态资源
静态资源:静态资源是指在服务器上事先准备好的,内容不会随着用户请求的变化而变化的资源。它们在服务器上存储为静态文件,并通过 HTTP 协议直接提供给用户。常见的静态资源包括 HTML 文件、CSS 样式文件、JavaScript 文件、图像文件、字体文件等。这些文件的内容不会随请求的变化而改变。
动态资源:动态资源是指在服务器端根据用户请求的参数或其他信息生成的,内容可能会随着请求的变化而变化的资源。它们需要服务器端的处理逻辑来生成最终的响应。常见的动态资源包括动态网页、动态图片生成、个性化内容等。这些资源的内容是根据用户的请求和服务器端的处理逻辑动态生成的
2、反向代理的动静分离操作过程
反向代理服务器进行动静分离是为了提高网站性能和用户体验。动静分离指的是将动态内容和静态内容分开处理,以便更有效地管理和优化它们
目的服务器1(静态资源处理)配置:
[root@localhost ~]#yum install -y httpd
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#cd /var/www/html
[root@localhost ~]#echo "static resources" > index.html
[root@localhost html]#ls #再放入一张图片
1.jpg index.html
目的服务器2(动态资源处理)配置:
[root@localhost ~]#yum install -y httpd
[root@localhost ~]#systemctl start httpd
[root@localhost ~]#mkdir /var/www/html/api/
[root@localhost ~]#echo "dynamic resources" > /var/www/html/api/index.html
反向代理服务器配置:
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name www.dh.com;root /mnt/;location ~* \.(jpg|jpeg|png|gif|bmp|html|mp4|txt)$ {proxy_pass http://172.16.12.12;}location ~* /api {proxy_pass http://172.16.12.13; }
}
[root@localhost ~]#nginx -s reload
客户端测试:
当访问静态资源时,代理服务器分析并将请求转送到目的服务器1进行处理
当访问动态资源时,代理服务器分析并将请求转送到目的服务器2进行处理
四、开启反向代理服务器的缓存功能
1、开启缓存功能的作用
- 性能优化:当代理服务器缓存请求的响应时,它可以直接返回缓存的内容,而不必每次都请求源服务器,从而节省了带宽和服务器资源
- 提高可用性:当目的服务器出现故障或不可用,反向代理服务器仍然可以提供已缓存的内容,确保用户仍然能够访问网站并减少服务中断的可能性
- 降低延迟:由于缓存服务器通常位于更接近用户的位置,因此可以减少数据传输的时间和网络延迟。这可以加快网站的加载速度,提高用户体验
- 降低延迟:通过缓存经常请求的内容,可以减少对源服务器的请求次数,从而减少服务器的带宽使用量,降低运营成本
2、缓存功能配置指令
proxy_cache zone_name | off; 默认off
#指明调用的缓存,或关闭缓存机制;Context:http, server, location
#zone_name 表示缓存的名称.需要由proxy_cache_path事先定义
3、反向代理服务器开启缓存功能的过程
反向代理服务器配置:
主配置文件配置:
[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
proxy_cache_path /opt/nginx/proyxcache levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
#开启缓存 缓存路径 生成文件夹比例是3级 从内存中借调20M专门存放缓存 有效期120秒 最大存储空间为1g
[root@localhost ~]# nginx -s reload
[root@localhost ~]# mkdir /opt/nginx/
[root@localhost opt]#mkdir /opt/nginx #还要新建存放缓存对应的目录
子配置文件配置:
[root@localhost ~]#vim /apps/nginx/conf.d/dh.conf
server {listen 80;server_name www.dh.com;root /mnt/;proxy_cache proxycache;proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key#proxy_cache_key $host$uri$is_args$args; proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间proxy_cache_valid any 5m; #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存location ~* \.(jpg|jpeg|png|gif|bmp|html|mp4|txt)$ {proxy_pass http://172.16.12.12;}location ~* /api {proxy_pass http://172.16.12.13; }
}
[root@localhost ~]#nginx -s reload
测试:客户端访问代理服务器
查看代理服务器的缓存内容
测试:关闭目的服务器1和目的服务器2的apache服务
[root@localhost ~]#systemctl stop httpd
客户端还能访问到请求的资源