我们在做一个虚拟机管理平台,底层虚拟化使用KVM,我们希望在网页上操作虚拟机。

一开始用applet嵌在网页内实现webvnc,不过由于applet的在浏览器上运行安全性限制,我们需要一个新的方案。此时调研了guacamole和novnc。

guacamole在我之前的一个博文里有介绍,guacamole介绍

noVNC集成更加方便轻量,而且功能上完全满足一般的虚拟机管理平台的需求,OpenStack就是用noVNC,下面简单介绍下我们如何集成noVNC。

noVNC github链接

noVNC的工作原理:

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

我们的计算节点有 192.168.1.101 192.168.1.102 。。。

noVNC代理 放在 192.168.1.11  websockify代理通过内网带宽把qemu-kvm的vnc tcp转化成websockets 在6080上提供反向代理服务

在192.168.1.11写好所有虚拟机的配置文件,任意放在一个目录下比如:/srv/nfs4/vnc_tokens,这个目录下一台虚拟机提供一个配置文件,配置文件的内容

02f63e037a3c485c8fd5c0164c6ef67b: 192.168.1.101:

然后启动代理服务

nohup python /root/noVNC/utils/websockify --web /root/noVNC --target-config=/srv/nfs4/vnc_tokens  >> /root/noVNC/novnc.log &

这样在内网中,我们通过noVNC提供的vnc_auto.html写上

host=192.168.1.11

port=

path=02f63e037a3c485c8fd5c0164c6ef67b

然后通过192.168.1.11:6080/vnc_auto.html就可以访问192.168.1.101:5908的这台机器的界面了。

以上是一般的demo,下面讲如何在以上的基础上集成到已有的项目:

1.我在路由器上把公网的6080端口映射到192.168.1.11的6080端口上来。

2.把noVNC下面的vnc_auto.html以及一些对应的css,js和images拷到已有的项目中

3.在已有的项目中加一个action,每次点击远程桌面的时候,页面会传一个vm的标识到action中,action判断这个vm是否属于登录的这个用户,然后在数据库中取出这台vm的vnc服务的ip+port,写成一个配置文件target-config指定目录下,最后把websockets代理机器的ip+port以及vm vnc的password通过action传到vnc_auto.html中

4.此时就可以通过web访问vnc界面了, enjoy~

之后要做的:

1.novnc的加密传输

2.多台代理,集成nginx进行反向代理  nginx-module

3.vnc password前后端的加密握手

webvnc利器-noVNC集成实战的更多相关文章

  1. ASP.NET Core & Docker & Jenkins 零基础持续集成实战

    原文:ASP.NET Core & Docker & Jenkins 零基础持续集成实战 一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker ...

  2. Docker + Jenkins + Gitlab + Pytest + Allure 接口自动化测试之持续集成实战终极教程

    实战教程篇 前言 这边就不教大家怎么用 pytest 写项目了哦,下面有系列文章能帮助你快速入门 Pytest + Allure 这一篇教程主要是教如何从 0 到 1 搭建自动化测试的持续集成环境 后 ...

  3. K8S(16)集成实战-使用spinnaker进行自动化部署

    K8s集成实战-使用spinnaker进行自动化部署 1 spinnaker概述和选型 1.1 概述 1.1.1 主要功能 Spinnaker是一个开源的多云持续交付平台,提供快速.可靠.稳定的软件变 ...

  4. ext3文件系统反删除利器ext3grep应用实战

    推荐:10年技术力作:<高性能Linuxserver构建实战Ⅱ>全网发行,附试读章节和全书实例源代码下载! 一."rm –rf"带来的困惑 国外一份非常著名的Linux ...

  5. 自动化利器-YUM仓库搭建实战

    本地YUM仓库搭建实战 YUM主要用于自动安装.升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系.要成功的使用YUM工具安装更新软件或系统,就需要有一个包含各种rpm软件包的reposito ...

  6. iOS 之 HTTPS集成实战应用

    临时想起来忘记把项目中用到的https集成整理收藏起来,以备后续不时之需.新手一般了解如下步骤即可: 1. HTTP 和 HTTPS 基本知识和学习 http://www.cnblogs.com/xi ...

  7. Spring Boot日志集成实战

    Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用 ...

  8. 腾讯x5webview集成实战

    应用中许多网页由于优化的不够理想,出现加载慢,加载时间长等,而且因为碎片化导致兼容性问题,有一些网页有视频内容,产品还提出各种小窗需求,搞得心力憔悴.找到公开的有crosswalk和x5webview ...

  9. Jenkins持续集成实战总结

    原文:https://my.oschina.net/CandyDesire/blog/341331#comment-list 持续集成 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何 ...

随机推荐

  1. 浅析_tmain()与main()的区别

    转自http://www.jb51.net/article/34516.htm _tmain()是为了支持unicode所使用的main一个别名,既然是别名,应该有宏定义过的,在哪里定义的呢?就在那个 ...

  2. Git 、 Cocoapods常用命令

    Git常用命令 1.添加文件   git  add  xxx 2.提交更新到本地  git commit   -m  'local-repo' 3.提交更新    git  push master  ...

  3. PostgreSQL中COUNT的各条件下(1亿条数据)例子

    test=# insert into tbl_time1 select generate_series(1,100000000),clock_timestamp(),now(); INSERT 0 1 ...

  4. MySQL中varchar转int

    order by ... cast(sort as signed) 或 convert(sort,signed) (sort为待转化字段)

  5. Loadrunner之HTTP接口测试脚本实例

    接口测试的原理是通过测试程序模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做出处理然后再把应答报文发送给客户端,客户端接收应答报文结果与预期结果进行比对的过程,接口测试可以通过Jav ...

  6. 在帝都的Android面试感想

    #第一次面试赤子城Android开发实习生 关于面试的表现和感想 1.没有准备充分就去面试(这是大忌,也就直接决定了结果) 我去面试Android,但是却不知道很多关于Android的基础知识,就是明 ...

  7. 用#define来实现多份近似代码 - map,set中的应用

    在stl中map,set内部都是使用相同的红黑树实现,map对应模板参数key_type,mapped_type,而set对应模板参数没有mapped_type 两者都支持insert操作 pair& ...

  8. 跳跃表Skip List的原理和实现

    >>二分查找和AVL树查找 二分查找要求元素可以随机访问,所以决定了需要把元素存储在连续内存.这样查找确实很快,但是插入和删除元素的时候,为了保证元素的有序性,就需要大量的移动元素了.如果 ...

  9. WPA: 4-Way Handshake failed - pre-shared key may be incorrect

    生成psk网址: https://www.wireshark.org/tools/wpa-psk.html 相关 bug: 重点 关注 : https://en.community.sonos.com ...

  10. <转>FreeMarker内置函数

    一. Sequence的内置函数1. sequence?first 返回sequence的第一个值.2. sequence?last 返回sequence的最后一个值.3. sequence?reve ...