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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了配置Nginx反向代理WebSocket,以代理NoVNC为例相关的知识,希望对你有一定的参考价值。


什么是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 协议中,为我们实现即时服务带来了两大好处:

1. Header。互相沟通的Header是很小的-大概只有 2 Bytes。

2. 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为例


1)编辑Nginx的配置文件

vim /etc/nginx/nginx.conf


技术分享图片


2)重启Nginx服务

service nginx restart


3)测试


连接成功

技术分享图片









以上是关于配置Nginx反向代理WebSocket,以代理NoVNC为例的主要内容,如果未能解决你的问题,请参考以下文章

nginx反向代理websocket

Nginx反向代理websocket配置实例

Nginx websocket反向代理

Nginx实战之反向代理WebSocket的配置实例

nginx websocket反向代理配置

Nginx配置websocket的反向代理