模式切换
反向代理
反向代理的概念及应用场景
什么是反向代理?
反向代理(Reverse Proxy)是指代理服务器接收客户端的请求,并将请求转发给后端的服务器,后端服务器处理请求并将结果返回给代理服务器,再由代理服务器将结果返回给客户端。 与正向代理(Forward Proxy)不同,反向代理隐藏了后端服务器的实际地址,客户端并不知道真实的后端服务器。
反向代理的应用场景
- 隐藏服务器信息:反向代理能够隐藏后端服务器的 IP 和端口,增强安全性,防止直接攻击后端服务器。
- 负载均衡:反向代理可以将请求分发到多个后端服务器上,提升系统的并发能力。
- 缓存加速:反向代理可以缓存后端服务器的响应结果,提高访问速度,减轻后端服务器的压力。
- SSL 终结:反向代理可以为客户端提供 SSL 加密,后端服务器只处理解密后的请求,减少服务器负担。
- 统一入口:反向代理通常作为流量入口,简化后端系统的复杂度。
配置简单的反向代理服务
在 Nginx 中,配置反向代理非常简单,以下是一个基本的反向代理配置示例:
示例配置
假设有一个后端应用服务器运行在 http://127.0.0.1:8080
,Nginx 作为反向代理接收来自客户端的请求,并将请求转发到该后端服务器。
nginx
server {
listen 80; # Nginx 监听的端口
server_name example.com; # 你的域名或服务器的 IP
# 配置反向代理
location / {
proxy_pass http://127.0.0.1:8080; # 将请求代理到后端应用服务器
proxy_set_header Host $host; # 将请求中的 Host 头部传递给后端
proxy_set_header X-Real-IP $remote_addr; # 将客户端 IP 传递给后端
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 保留请求链路中的 IP 信息
proxy_set_header X-Forwarded-Proto $scheme; # 传递请求协议(HTTP/HTTPS)
}
}
配置解释
proxy_pass http://127.0.0.1:8080;
:将所有/
路径下的请求转发到http://127.0.0.1:8080
的后端服务器。proxy_set_header
:配置向后端服务器传递的请求头,保证后端服务器可以获取到客户端的原始信息。
使用步骤
- 编辑 Nginx 配置文件(如
/etc/nginx/nginx.conf
或/etc/nginx/sites-available/default
)。 - 将上述配置添加到对应的
server
块中。 - 测试 Nginx 配置:bash
sudo nginx -t
- 重启 Nginx 使配置生效:bash
sudo systemctl restart nginx
配置负载均衡
Nginx 不仅支持反向代理,还可以将请求分发到多个后端服务器,从而实现负载均衡。Nginx 提供了几种负载均衡算法,如轮询、权重轮询、IP 哈希等。
负载均衡示例配置
假设你有两个后端服务器:
http://192.168.0.101:8080
http://192.168.0.102:8080
Nginx 可以作为负载均衡器,将请求分发到这两个服务器上。
nginx
http {
upstream backend_servers {
server 192.168.0.101:8080; # 后端服务器1
server 192.168.0.102:8080; # 后端服务器2
}
server {
listen 80;
server_name example.com;
# 负载均衡代理
location / {
proxy_pass http://backend_servers; # 将请求代理到后端服务器组
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
配置解释
upstream backend_servers
:定义一个服务器组backend_servers
,包含多个后端服务器(如192.168.0.101:8080
和192.168.0.102:8080
)。Nginx 会将请求轮流发送到这些服务器。proxy_pass http://backend_servers;
:将请求转发到定义好的服务器组backend_servers
,实现负载均衡。
负载均衡策略
Nginx 支持多种负载均衡策略,默认使用轮询(Round Robin),即请求按顺序分发到每个服务器。可以通过修改 upstream
块来配置不同的负载均衡策略:
轮询(默认):请求按顺序轮流分发到各个服务器。
权重轮询(Weighted Round Robin):为服务器分配不同的权重,权重高的服务器会接收更多的请求。示例如下:
nginxupstream backend_servers { server 192.168.0.101:8080 weight=3; # 权重为3 server 192.168.0.102:8080 weight=1; # 权重为1 }
IP 哈希(IP Hash):将相同 IP 地址的请求始终分发到同一个服务器,适用于会话保持的场景。配置如下:
nginxupstream backend_servers { ip_hash; # 启用IP哈希 server 192.168.0.101:8080; server 192.168.0.102:8080; }
最少连接数(Least Connections):将请求分发到当前连接数最少的服务器,适用于后端服务器处理能力不均衡的场景。
nginxupstream backend_servers { least_conn; # 启用最少连接数算法 server 192.168.0.101:8080; server 192.168.0.102:8080; }
健康检查(可选)
为了保证负载均衡的高可用性,Nginx 可以检测后端服务器的健康状态,自动跳过不可用的服务器。Nginx Plus 支持内置的健康检查,开源版本的 Nginx 可以使用第三方模块来实现。
通过配置负载均衡和健康检查,可以进一步增强系统的稳定性和扩展性。