server {
listen 80 proxy_protocol;
listen 443 ssl proxy_protocol;
...
}前端
proxy protocal是什麼?node
代理協議是一種 Internet 協議,用於將鏈接信息從請求鏈接的源傳遞到請求鏈接到的目標。Elastic Load Balancing 使用代理協議版本 1,該版本使用用戶可讀的標頭格式。默認狀況下,當對前端和後端鏈接使用傳輸控制協議 (TCP) 或安全套接字層 (SSL) 時,您的負載均衡器會將請求轉發到後端實例,而不修改請求標頭。若是您啓用代理協議,則會向請求標頭添加一個用戶可讀的標頭,其中包含鏈接信息(如源 IP 地址、目標 IP 地址和端口號)。該標頭隨後做爲請求的一部分發送到後端實例。nginx
爲何要使用proxy protocal呢?web
咱們知道nginx使用的最普遍的功能就是反向代理,如tomcat,node,django,tornado等,同時nginx也能夠代理tcp流和websockets。django
可是若是你的應用服務器自己就在一個負載均衡器(好比aws的ELB)的後端那麼就會出現問題。ELB自己能夠作http/https/tcp的負載均衡。若是你是用來代理http協議的話那麼ELB就會注入X-Forwarded-For這個header,這裏面會包含客戶端的源地址。假如使用的TCP的負載均衡將不會獲取到http header,那麼天然就沒法獲取client ip,這樣你的應用服務器也就沒法知道鏈接到它的真是客戶端是誰。也就沒法正常的提供服務了。所以只有使用proxy protocal協議來傳遞真實的頭信息。後端
背景tomcat
proxy protocal是由haproxy項目開發來解決上述問題的。亞馬遜在2013年夏天也將proxy protocal加入到了ELB服務中。同時在nginx-1.5.12 release版本中也開始支持proxy protocal。安全