阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

配置Nginx反向代理WebSocket,以代理noVNC为例

384次阅读
没有评论

共计 2709 个字符,预计需要花费 7 分钟才能阅读完成。

什么是 Nginx

Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 服务器。

Nginx 是一款轻量级的 Web 服务器 / 反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个 BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好。
什么是 WebSocket

WebSocket 协议是创建客户端和服务器端需要实时双向通讯的 webapp 提供了一个选择。其为 HTML5 的一部分,WebSocket 相较于原来开发这类 app 的方法来说,其能使开发更加地简单。

WebSocket 协议是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工 (full-duplex) 通信——允许服务器主动发送信息给客户端。

在实现 websocket 连线过程中,需要通过浏览器发出 websocket 连线请求,然后服务器发出回应,这个过程通常称为“握手”。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此 WebSocket 协议中,为我们实现即时服务带来了两大好处:

    Header。互相沟通的 Header 是很小的 - 大概只有 2 Bytes。
    Server Push。服务器的推送,服务器不再被动的接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。

什么是 noVNC

noVNC 提供一种在网页上通过 html5 的 Canvas,访问机器上 vncserver 提供的 vnc 服务,需要做 tcp 到 websocket 的转化,才能在 html5 中显示出来。网页就是一个客户端,类似 win 下面的 vncviewer,只是此时填的不是裸露的 vnc 服务的 ip+port,而是由 noVNC 提供的 websockets 的代理,在 noVNC 代理服务器上要配置每个 vnc 服务,noVNC 提供一个标识,去反向代理所配置的 vnc 服务。
WebSocket 代理

要将客户端和服务器之间的连接从 HTTP / 1.1 转换为 WebSocket,使用 HTTP / 1.1 中提供的协议切换机制。

然而有一个微妙之处:由于“Upgrade”是一个 逐跳的头,它不会从客户端传递到代理服务器。使用正向代理,客户可以使用该 CONNECT 方法来规避这个问题。但是,这不适用于反向代理,因为客户端不知道任何代理服务器,并且需要在代理服务器上进行特殊处理。

从版本 1.3.13 开始,nginx 实现了特殊的操作模式,如果代理服务器返回了代码 101(交换协议)的响应,客户端和代理服务器之间建立隧道,客户端通过请求中的“Upgrade”请求头。

如上所述,包括“Upgrade”和“Connection”的逐跳标题不会从客户端传递到代理服务器,因此为了让代理服务器知道客户端将协议切换到 WebSocket 的意图,这些标题必须明确地通过:

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ”      close;
    }

    server {
        listen 80; #修改监听的端口
        server_name _;
        location / {
            proxy_pass  #修改为需要被反向代理的 WebSocket 的 IP 和端口号
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }

默认情况下,如果代理服务器在 60 秒内没有传输任何数据,连接将被关闭。这个超时可以通过 proxy_read_timeout 指令来增加。或者,代理服务器可以配置为周期性地发送 WebSocket ping 帧来重置超时并检查连接是否仍然存在。

实例 – 以代理 noVNC 为例
实验环境

    已经安装好 noVNC 的 CentOS7 虚拟机[安装说明](叫它 vnc-server),IP 地址(NAT 模式)为 192.168.204.10
    最小化安装的 CentOS7 虚拟机(叫它 proxy-server),IP 地址(NAT 模式)为 192.168.204.133,IP 地址(仅主机模式)为 192.168.50.128
    Windows7 虚拟机(叫它 client),IP 地址(仅主机模式)为 192.168.50.129
    首先 vnc-server 和 client 的网络是隔离的,现在让 proxy-server 反向代理 vnc-server 的 noVNC 服务,达到的效果是 client 访问 proxy-server 就可以访问到 vnc-server 的 noNVC 服务。

配置 proxy-server

proxy-server 上关闭防火墙

setenforce 0
systemctl stop firewalld
systemctl disable firewalld

proxy-server 上安装 nginx

yum install -y epel*
yum install -y nginx
systemctl start nginx
systemctl enable nginx

proxy-server 上编辑 Nginx 的配置文件

vim /etc/nginx/nginx.conf

在 http 区块添加如下内容

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

server {
    listen 8080; #修改监听的端口
    server_name _;
    location / {
        proxy_pass http://192.168.204.10:6080/;  #修改为需要被反向代理的 WebSocket 的 IP 和端口号
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

配置 Nginx 反向代理 WebSocket,以代理 noVNC 为例

重启 nginx 服务

systemctl restart nginx

在 client 上测试

Windows7 网卡配置

配置 Nginx 反向代理 WebSocket,以代理 noVNC 为例

通过火狐浏览器访问 proxy-server 仅主机网卡的 web 服务 http://192.168.50.128:8080/vnc.html
可以看到,通过 nginx 已经成功代理了 WebSocket!

配置 Nginx 反向代理 WebSocket,以代理 noVNC 为例

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计2709字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中