您的位置:首页 > 运维架构 > 反向代理

Nginx 反向代理 websocket

2017-12-12 15:21 429 查看
参考: [ Using multiple nodes ] [ Nginx 官网 WebSocket proxying ]

关于 websocket 的介绍可以看阮大大的这篇 [ WebSocket 教程 ]

关于 Upgrade 头部信息,可以查看 [ RFC 2616 ]

Nginx 反向代理 WebSocket

要将 client 和 server 之间的连接协议从 HTTP/1.1 转换为 WebSocket, HTTP/1.1 协议中提供了解决机制.

但是, Upgrade 是一个逐跳的头, 它不会从 client 传递到 proxy server. 如果使用 正向代理, client 可以使用 CONNECT 方法来规避这个问题. 然而, 对于反向代理而言这个是不适用的, 因为 clients 发现不了任何 proxy server.

从 nginx 1.3.13 版本开始, 当 proxy server 返回的状态码为 101 的时候, nginx 允许从 client 和 proxy server 之间建立一个通道. client 通过 Upgrade 发出协议转换的请求.

为了让 proxy server 知道 clients 想把通信协议转换为 WebSocket, 需要如下配置:

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


对于复杂的情况, 当 Connection 头部的值取决于 Upgrade 头部存在的情况, 需要如下配置:

http {
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: