2013-03-04 263 views
15

nginx現在支持代理websocket,但我無法找到任何有關如何執行此操作的信息,而無需單獨使用位置塊,該塊適用於使用websockets的URI。nginx反向代理websocket

我見過一些人推薦這種方法的一些變化:

location/{ 
    proxy_http_version 1.1; 

    proxy_set_header Upgrade  $http_upgrade; 
    proxy_set_header Connection "upgrade"; 

    proxy_pass http://host:port; 
} 

請問這是正確的方式來代理標準的HTTP以及WebSockets的?我不希望升級頭或連接設置爲「升級」,除非瀏覽器發送了這些內容,但這些proxy_set_header行是websockets工作所必需的。爲什麼nginx不轉發原始的升級/連接頭?

我對此進行了實驗,發現如果沒有兩個proxy_set_header行運行,nginx不會代理Upgrade標頭,並將Connection標頭從'upgrade'更改爲'close'。在他們看來,Connection對於非websocket請求是「升級」的,這也是不好的。

謝謝:)

回答

12

爲什麼不nginx的只是轉發原始升級/連接頭?

official documentation因爲「升級」是一個逐跳的頭部,它不是從客戶端傳遞到代理服務器

RFC 2616


我不想升級頭或連接設置爲「升級」,除非這是瀏覽器發送的內容,

還有一個例子:

map $http_upgrade $connection_upgrade { 
    default upgrade; 
    ''  close; 
} 

server { 
    ... 

    location /chat/ { 
     proxy_pass http://backend; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection $connection_upgrade; 
    } 
} 

連接對於非websocket請求是'升級'這也是不好的。

您確實知道Connection表頭的含義是什麼?只需從RFC:中引用此字段中的每個連接標記,就可以從消息中刪除與連接標記具有相同名稱的任何標題字段。

它怎麼會壞?