首页 文章

nginx反向代理websockets

提问于
浏览
18

nginx现在支持代理websockets,但是我没有找到任何关于如何执行此操作的信息,而没有一个单独的 location 块适用于使用websockets的URI .

我见过一些人推荐这种方法的一些变化:

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只转发原始的Upgrade / Connection标头?

我已经对此进行了实验,发现如果在没有两个proxy_set_header行的情况下运行,nginx不会代理Upgrade标头并将Connection标头从'upgrade'更改为'close' . 使用它们,Connection是非websocket请求的“升级”,这也很糟糕 .

谢谢 :)

1 回答

  • 15

    为什么nginx只转发原始的Upgrade / Connection标头?

    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 Headers 是什么意思吗?只需引用RFC:对于此字段中的每个连接令牌,从消息中删除任何与连接令牌同名的头字段 .

    怎么会这么糟糕?

相关问题