OpenResty实现反向代理与负载均衡
当后端服务运行在本机 8080 端口,或者需要由多台服务器共同提供服务时,可以使用 OpenResty 作为统一入口,负责请求转发和负载均衡。
1. 单服务反向代理
如果后端服务运行在本机 8080 端口,可以在 OpenResty 的 server 配置中加入以下内容:
location /api/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
配置完成后,访问:
https://your-domain.com/api/
请求就会被转发到本机的 8080 服务。
这些请求头可以把原始域名、客户端IP和代理链信息传递给后端程序,方便日志记录和业务判断。
2. 多节点负载均衡
当后端服务部署在多台服务器上时,可以先在 http 配置块中定义后端服务器组:
upstream backend_app {
server 10.0.0.11:8080;
server 10.0.0.12:8080;
}
然后在站点配置中使用这个后端组:
location /api/ {
proxy_pass http://backend_app/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
默认情况下,OpenResty会按照轮询方式将请求分配到不同后端节点。
3. 配置失败重试
可以为每个后端节点设置失败次数和故障恢复时间:
upstream backend_app {
server 10.0.0.11:8080 max_fails=3 fail_timeout=30s;
server 10.0.0.12:8080 max_fails=3 fail_timeout=30s;
}
其中:
max_fails=3表示在指定时间内连续失败达到3次后,暂时认为节点不可用;fail_timeout=30s表示节点进入失败状态后,30秒内暂时停止向其转发请求。
这项配置适合减少请求持续发送到故障节点的情况。
4. 设置代理超时
可以根据后端接口的响应速度配置超时时间:
proxy_connect_timeout 3s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
参数含义如下:
proxy_connect_timeout:与后端建立连接的超时时间;proxy_send_timeout:向后端发送请求的超时时间;proxy_read_timeout:等待后端返回数据的超时时间。
接口响应时间较长时,可以适当增加 proxy_read_timeout,避免请求过早中断。
5. 检查配置并验证接口
修改配置后,建议先检查语法:
openresty -t
确认没有错误后,再重新加载配置:
openresty -s reload
接着使用 curl 测试接口:
curl -i http://127.0.0.1/api/health
如果需要观察请求是否正常转发,可以实时查看访问日志:
tail -f /usr/local/openresty/nginx/logs/access.log
如果后端服务有独立日志,也建议同时查看后端日志,确认请求是否已经到达对应节点。
6. 注意 proxy_pass末尾的斜杠
proxy_pass后面是否带 /,会影响请求路径的转发结果。
例如:
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
访问 /api/health 时,后端通常收到的是:
/health
如果写成:
location /api/ {
proxy_pass http://127.0.0.1:8080;
}
后端通常会收到:
/api/health
因此,上线前应使用真实接口路径进行测试,确认后端最终收到的URI符合程序要求,避免因为路径变化导致接口返回404或路由错误。