2013-03-04 267 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:中引用此字段中的每个连接标记,就可以从消息中删除与连接标记具有相同名称的任何标题字段。

它怎么会坏?