server {
listen 80 proxy_protocol;
listen 443 ssl proxy_protocol;
...
}
proxy protocal是什么?
代理协议是一种 Internet 协议,用于将连接信息从请求连接的源传递到请求连接到的目标。Elastic Load Balancing 使用代理协议版本 1,该版本使用用户可读的标头格式。默认情况下,当对前端和后端连接使用传输控制协议 (TCP) 或安全套接字层 (SSL) 时,您的负载均衡器会将请求转发到后端实例,而不修改请求标头。如果您启用代理协议,则会向请求标头添加一个用户可读的标头,其中包含连接信息(如源 IP 地址、目标 IP 地址和端口号)。该标头随后作为请求的一部分发送到后端实例。
为什么要使用proxy protocal呢?
我们知道nginx使用的最广泛的功能就是反向代理,如tomcat,node,django,tornado等,同时nginx也可以代理tcp流和websockets。
但是如果你的应用服务器本身就在一个负载均衡器(比如aws的ELB)的后端那么就会出现问题。ELB本身可以做http/https/tcp的负载均衡。如果你是用来代理http协议的话那么ELB就会注入X-Forwarded-For这个header,这里面会包含客户端的源地址。假如使用的TCP的负载均衡将不会获取到http header,那么自然就无法获取client ip,这样你的应用服务器也就无法知道连接到它的真是客户端是谁。也就无法正常的提供服务了。因此只有使用proxy protocal协议来传递真实的头信息。
背景
proxy protocal是由haproxy项目开发来解决上述问题的。亚马逊在2013年夏天也将proxy protocal加入到了ELB服务中。同时在nginx-1.5.12 release版本中也开始支持proxy protocal。