PROXY协议使Nginx接收客户端链接信息经过代理服务器和负载均衡器传入,例如HAproxy和亚马逊Elastic负载均衡器(SLB)。nginx
经过PROXY协议传入的是客户端IP地址,代理服务器IP地址和端口号。知道客户端原始IP地址可能对特定语言的网站、保存IP黑名单或只记录和统计目的是有用的。服务器
使用PROXY协议,Nginx能从SSL、HTTP/二、SPDY、WebSocket和TCP学习原始IP地址。app
为了使Nginx接收SSL、HTTP/二、SPDY和WebSocket的PROXY协议,在http级别上作如下改变:负载均衡
配置Nginx接收PROXY协议头。添加proxy_protocol参数到listen指令:学习
server {网站
listen 80 proxy_protocol;spa
listen 443 ssl proxy_protocol;代理
...orm
}server
server {
...
set_real_ip_from 192.168.1.0/24;
...
}
server {
...
real_ip_header proxy_protocol;
}
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
http {
...
log_format combined '$proxy_protocol_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
}
Nginx能为TCP流传入PROXY协议数据。
在Nginx配置文件中,在stream级别的server块中包括proxy_protocol指令:
stream {
server {
listen 12345;
proxy_pass example.com:12345;
proxy_protocol on;
}
}
http {
log_format combined '$proxy_protocol_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
...
server {
server_name localhost;
listen 80 proxy_protocol;
listen 443 ssl proxy_protocol;
ssl_certificate /etc/nginx/ssl/public.example.com.pem;
ssl_certificate_key /etc/nginx/ssl/public.example.com.key;
set_real_ip_from 192.168.1.0/24;
real_ip_header proxy_protocol;
location /app/ {
proxy_pass http://backend1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $proxy_protocol_addr;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
}
}
}
stream {
...
server {
listen 12345;
proxy_pass example.com:12345;
proxy_protocol on;
}
}