如何配置Varnish向上游Nginx发送PROXY协议连接?
让Varnish向上游Nginx发送PROXY协议的配置方案
核心实现逻辑
要让Varnish在转发请求到上游Nginx时带上PROXY协议头,无需额外启动参数,直接通过VCL(Varnish配置语言)即可实现,核心是利用Varnish内置的std.send_proxy()函数发送协议头。
具体配置步骤
- 修改Varnish的VCL配置文件
在你的VCL文件中,添加vcl_backend_connect阶段的逻辑,用来向上游发送PROXY协议:
# 定义上游Nginx后端 backend nginx_backend { .host = "你的Nginx服务器IP"; .port = "80"; # 替换为Nginx实际监听的端口 } sub vcl_backend_connect { # 调用函数发送PROXY协议头,传递客户端和Varnish的IP/端口信息 std.send_proxy( bereq.backend, std.sockaddr(client.ip, client.port), std.sockaddr(server.ip, server.port) ); }
注:如果你的Varnish版本低于6.0,也可以给后端添加
.send-proxy = true参数实现,但该方式已被弃用,建议升级Varnish版本后使用上面的VCL函数写法。
- 配置Nginx接收PROXY协议
上游Nginx必须开启PROXY协议支持,否则会出现解析错误。在Nginx的监听配置中添加proxy_protocol参数,同时配置真实IP获取规则:
server { # 开启PROXY协议监听 listen 80 proxy_protocol; listen 443 ssl proxy_protocol; # 如果是HTTPS后端 # 仅信任来自Varnish的PROXY协议头 set_real_ip_from 你的Varnish服务器IP; real_ip_header proxy_protocol; # 其他Nginx配置(如PHP转发、SSL证书等) }
- 重载Varnish配置生效
修改完VCL后,执行以下命令重载配置:
varnishadm reload
验证方法
可以在Nginx的日志格式中添加$remote_addr字段,发起请求后查看日志,如果显示的是客户端真实IP而非Varnish的IP,说明配置成功。
内容的提问来源于stack exchange,提问作者HubertNNN
相关产品推荐
相关产品推荐

