Nginx接收PROXY協議

1    介紹

PROXY協議使Nginx接收客戶端鏈接信息經過代理服務器和負載均衡器傳入,例如HAproxy和亞馬遜Elastic負載均衡器(SLB)。nginx

經過PROXY協議傳入的是客戶端IP地址,代理服務器IP地址和端口號。知道客戶端原始IP地址可能對特定語言的網站、保存IP黑名單或只記錄和統計目的是有用的。服務器

使用PROXY協議,Nginx能從SSL、HTTP/二、SPDY、WebSocket和TCP學習原始IP地址。app

2    使用SSL、HTTP/二、SPDY和WebSocket的PROXY協議

爲了使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

  • 在set_real_ip_from指令,指定IP地址或TCP代理或負載均衡器的CIDR方位地址:

server {

    ...

    set_real_ip_from 192.168.1.0/24;

    ...

}

  • 在real_ip_header指令,添加proxy_protocol參數保存客戶端IP地址和端口號: 

server {

    ...

    real_ip_header proxy_protocol;

}

  • 使用proxy_set_header指令和$proxy_protocol_addr變量從Nginx傳入客戶端IP地址到upstream服務器:

proxy_set_header X-Real-IP       $proxy_protocol_addr;

proxy_set_header X-Forwarded-For $proxy_protocol_addr;

  • 添加$proxy_protocol_addr變量到http級別的log_format指令 

 http {

    ...

    log_format combined '$proxy_protocol_addr - $remote_user [$time_local] '

                        '"$request" $status $body_bytes_sent '

                        '"$http_referer" "$http_user_agent"';

}

3    使用PROXY協議和TCP流

Nginx能爲TCP流傳入PROXY協議數據。

在Nginx配置文件中,在stream級別的server塊中包括proxy_protocol指令:

stream {

    server {

        listen 12345;

        proxy_pass example.com:12345;

        proxy_protocol on;

    }

}

4    完整例子

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;

    }

 

}

相關文章
相關標籤/搜索