配置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 协议中,为我们实现即时服务带来了两大好处:
- 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服务
systemctl restart nginx
在client上测试
Windows7网卡配置

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

本文链接:https://www.cnblogs.com/connect/p/nginx-proxy-websocket.html
配置Nginx反向代理WebSocket,以代理noVNC为例的更多相关文章
- CentOS 7 学习(二) 配置Nginx反向代理
CentOS 7 学习(二) 配置Nginx反向代理 Nginx可以通过php-fpm来运行PHP程序,也可以转向apache,让apache调用php程序来运行. 不过对于Nginx来说,其反向代理 ...
- 为docker私有registry配置nginx反向代理
公司的Docker私有registry已经搭建好了,用官方的registry image很容易就搭建好了.现在就是要用nginx的反向代理把它放出来,以便在外网可以访问. 我的上一篇blog 讲了如何 ...
- 使用SSL配置Nginx反向代理的简单指南
反向代理是一个服务器,它接收通过Web发出的请求,即http和https,然后将它们发送到后端服务器(或服务器).后端服务器可以是单个或一组应用服务器,如Tomcat,wildfly或Jenkins等 ...
- 配置LANMP环境(7)-- 配置nginx反向代理,与配置apache虚拟主机
一.配置nginx反向代理 1.修改配置文件 vim /etc/nginx/nginx.conf 在35行http下添加一下内容: include /data/nginx/vhosts/*.conf; ...
- Linux CentOS7部署ASP.NET Core应用程序,并配置Nginx反向代理服务器
前言: 本篇文章主要讲解的是如何在Linux CentOS7操作系统搭建.NET Core运行环境并发布ASP.NET Core应用程序,以及配置Nginx反向代理服务器.因为公司的项目一直都是托管在 ...
- 配置nginx反向代理服务器,解决浏览器跨域调用接口的限制问题
配置nginx反向代理服务器,解决浏览器跨域调用接口的限制问题 - 大venn的博客 - CSDN博客https://blog.csdn.net/u011135260/article/details/ ...
- 配置 Nginx 反向代理 WebSocket
用Nginx给网站做反向代理和负载均衡是广泛使用的一种Web服务器部署技术.不仅能够保证后端服务器的隐蔽性,还可以提高网站部署灵活性. 今天我们来讲一下,如何用Nginx给WebSocket服务器实现 ...
- 如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理
导读 Nginx 是最快和最强大的 Web 服务器之一,以其高性能和低资源占用率而闻名.它既可以被安装为一个独立的 Web 服务器,也可以安装成反向代理 Web 服务器.在这篇文章,我将讨论在安装了 ...
- [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问
前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...
随机推荐
- 【PHP调试篇】PHP高性能日志组件SeasLog
简述 什么是SeasLog SeasLog是一个C语言编写的PHP扩展,提供一组规范标准的功能函数,在PHP项目中方便.规范.高效地写日志,以及快速地读取和查询日志. 为什么使用SeasLog 无论在 ...
- linux设置自动更换壁纸
#!/bin/bash let n=0 files=($HOME/wallpapers/*.jpg) count=${#files[@]} while [ 1 ] do let "n=n%$ ...
- SQL Server 中的回滚
USE [TestDB] GO /****** 对象: Table [dbo].[Person] 脚本日期: 11/23/2008 13:37:48 ******/ SET ANSI_NULLS ON ...
- django模板语言之Template
当前端的一些数据需要后端传送过来并展示时,用到了django的模板语言,模板语言的作用就是,在后端把一些处理好的数据,通过模板语言所规定的格式,通过render渲染,放到前端页面固定的位置展示.这之间 ...
- C#语言————选择结构
int[] num = new int[] {23,76,54,87,51,12 }; //冒泡排序 for (int i = 0; i < num.Length - 1; i++) { for ...
- selenium+python自动化笔记之一
一.webdriver的API与定位元素 元素定位核心部分 元素名称 webdriver API 说明 id find_element_by_id() id定位 name find_element_b ...
- 【PAT】B1039 到底买不买(20)(20 分)
/* 琢磨了很久,当时还没做几道题,参考了柳婼的思路 */ #include<stdio.h> #include<string.h> char arr[1000]={'\0'} ...
- 3星|《创投42章经》:前VC投资人的商业评论文集
创投42章经:互联网商业逻辑与投资进阶指南 作者2014年入行VC做投资人,2016年退出改作自媒体.书中主要是作者的各类商业评论的文集,少部分是跟投资相关的内容. 投资相关的内容,有些作者自己的视角 ...
- npm包开发(whale-makelink)
whale-makelink是一个npm工具,是强业务的工具,可以将当前工程目录下的项目文件夹,在README中生成项目的链接地址.Demo. 一.npm init 使用npm init生成packa ...
- JQuery获取touchstart,touchmove,touchend坐标
$('#id').on('touchstart',function(e) { ].pageX; }); JQuery如上. document.getElementById("id" ...