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;
}
}