配置文件开启proxy_protocal

server {
    listen 80   proxy_protocol;
    listen 443  ssl proxy_protocol;
    ...
}

Q&A
  1. proxy protocal是什么

代理协议是一种 Internet 协议,用于将连接信息从请求连接的源传递到请求连接到的目标。Elastic Load Balancing 使用代理协议版本 1,该版本使用用户可读的标头格式。默认情况下,当对前端和后端连接使用传输控制协议 (TCP) 或安全套接字层 (SSL) 时,您的负载均衡器会将请求转发到后端实例,而不修改请求标头。如果您启用代理协议,则会向请求标头添加一个用户可读的标头,其中包含连接信息(如源 IP 地址、目标 IP 地址和端口号)。该标头随后作为请求的一部分发送到后端实例。

  1. 为什么要使用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协议来传递真实的头信息

  1. 背景

proxy protocal是由haproxy项目开发来解决上述问题的。亚马逊在2013年夏天也将proxy protocal加入到了ELB服务中。同时在nginx-1.5.12 release版本中也开始支持proxy protocal