nginx使用Proxy-protocal

配置文件開啓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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章