一、反向代理概述
简单来说:就是让客户的请求通过代理服务器才能访问到服务端
复杂来说:反向代理是一种代理服务器的配置模式,它代表服务器向客户端提供服务。客户端发送请求到反向代理服务器,然后反向代理服务器将请求转发到后端的真实服务器上,并将响应返回给客户端。
二、为什么要用反向代理
(1)负载均衡 (Load Balancing):
- 智能分配请求至多台后端服务器
- 避免单点过载,提升系统吞吐量、响应速度和容灾能力
- 自动屏蔽故障节点(健康检查)
(2)提升安全性:
- 隐藏真实后端服务器,减少攻击面
- 内置防护机制(流量限制/IP过滤/请求过滤)
- 统一管理HTTPS加解密,降低后端压力
(3)提高性能和可伸缩性:
- 静态文件缓存:直接响应高频静态资源
- 响应压缩:减少网络传输体积
- 高效连接复用:优化后端通信效率
- 水平扩展:轻松添加后端服务器
三、反向代理该怎么使用
1.反向代理配置语法
proxy_pass:该指令用来设置被代理服务器地址,可以是主机名称、IP地址加端口号形式。
示例:
//代理服务器nginx配置
server {
listen 80;
server_name localhost;
location /{
#proxy_pass http://192.168.200.146;
proxy_pass http://192.168.200.146/;
}
}
例如:代理服务器地址是192.168.200.133,用户访问192.168.200.133,会自动转发到192.168.200.146,然后192.168.200.146返回响应。
2.配置实例:
(1)代理服务器nginx配置
server {
listen 8083;
server_name 139.129.50.249;
location / {
proxy_pass http://121.40.95.121/;
}
}
可以看出代理服务器监听8083的端口,当检测到请求时转发到121.40.46.121服务器
(2)服务器设置
服务器我没有配置。直接访问,原始80端口显示nginx欢迎页面
(3)成果展示
四、反向代理拓展
1.代理的的地址加不加/
server{
listen 80;
server_name localhost;
location /server{
#proxy_pass http://192.168.200.146;
#proxy_pass http://192.168.200.146/;
}
}
当客户端访问 http://localhost/server/index.html
这个时候,第一个proxy_pass就变成了http://localhost/server/index.html
第二个proxy_pass就变成了http://localhost/index.html效果就不一样了。
简而言之:就是如果不加/,就是拼接访问路径;加/就是替换访问路径。
2.proxy_set_header
该指令可以更改Nginx服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器
语法 |
proxy_set_header field value; |
默认值 |
proxy_set_header Host $proxy_host; proxy_set_header Connection close; |
位置 |
http、server、location |
需要注意的是,如果想要看到结果,必须在被代理的服务器上来获取添加的头信息。
被代理服务器: [192.168.200.146]
server {
listen 8080;
server_name localhost;
default_type text/plain;
return 200 $http_username;
}
代理服务器: [192.168.200.133]
server {
listen 8080;
server_name localhost;
location /server {
proxy_pass http://192.168.200.146:8080/;
proxy_set_header username TOM;
}
}
3.proxy_redirect
该指令是用来重置头信息中的"Location"和"Refresh"的值。
语法 |
proxy_redirect redirect replacement; proxy_redirect default; proxy_redirect off; |
默认值 |
proxy_redirect default; |
位置 |
http、server、location |
》为什么要用该指令?
服务端[192.168.200.146]
```
server {
listen 8081;
server_name localhost;
if (!-f $request_filename){
return 302 http://192.168.200.146;
}
}
```
代理服务端[192.168.200.133]
```
server {
listen 8081;
server_name localhost;
location / {
proxy_pass http://192.168.200.146:8081/;
proxy_redirect http://192.168.200.146 http://192.168.200.133;
}
}
```
》该指令的几组选项
proxy_redirect redirect replacement;
redirect:目标,Location的值
replacement:要替换的值
proxy_redirect default;
default;
将location块的uri变量作为replacement,
将proxy_pass变量作为redirect进行替换
proxy_redirect off;
关闭proxy_redirect的功能