NiceLeeのBlog 用爱发电 bilibili~

备忘录 在headless服务器上运行GUI程序,并通过浏览器访问控制

2024-02-24
nIceLee

阅读:


实现这个目标需要四步。

  • Step 1. 创建虚拟屏幕
  • Step 2. 将指定屏幕交互转为VNC协议传输
  • Step 3. 将VNC协议传输转为浏览器交互
  • Step 4. 在虚拟屏幕运行GUI程序

Step 1~2

Step 1和Step 2之所以没有分开,是因为有很多工具把这两步合在一起的。
实现Step 1和2的工具有很多,可以参考ubuntu/VNC/Servers
这里不一一列出,主要讲一下xvfbtightvncservertigervnc的几种组合。

  • xvfb只能实现Step 1
  • tightvncserver支持Step 1和Step 2
  • tigervnc支持Step 1和Step 2,通过不同的程序实现对应功能

xvfb + tigervnc

本来经典的是 xvfb + x11vnc,但是x11vnc太老了,想要使用还需要些额外的操作,所以不提了。

# 安装 xvfb
sudo apt-get install xvfb

# 启动xvfb模拟虚拟屏幕2 下面的参数24指的是色彩深度
Xvfb :2 -screen 0 1280x720x24

# 安装 tigervnc
sudo apt-get install tigervnc-scraping-server

# 启动x0vncserver将虚拟屏幕2暴露给端口5902(VNC协议)
## 参数可以查看 https://tigervnc.org/doc/x0vncserver.html
x0vncserver -localhost no -rfbport=5902 -PasswordFile=/home/lijia/.vnc/passwd -display :2

# 密码文件可以有 vncpasswd生成,一般保存在~/.vnc/passwd
# 关闭可以直接 kill -2 [pid]

tigervnc

# 安装 tigervnc
sudo apt-get install tigervnc-standalone-server

# 启动Xvnc 新建虚拟屏幕2并暴露给端口5902(VNC协议)
## 参数可以查看 https://tigervnc.org/doc/Xvnc.html
Xvnc --localhost -rfbport=5902 -PasswordFile=/home/lijia/.vnc/passwd -geometry 1280x720 :2 

# 密码文件可以有 vncpasswd生成,一般保存在~/.vnc/passwd
# 关闭可以直接 kill -2 [pid]

tightvncserver

# 安装 tightvncserver
sudo apt-get install tightvncserver

# 启动tightvncserver 新建虚拟屏幕2并暴露给端口5902(默认端口为 5900 + 2)
tightvncserver -localhost -depth 16 -geometry 1280x720 :2 

# 关闭屏幕2
tightvncserver -kill :2

看具体的目的吧,以上需要注意是不是监听本地localhost,防止暴露

Step 3

使用noVNC。拷贝项目源码即可运行。
如果没有git环境的话,还需要将websockify的源码拷贝并解压到utils/websockify

# utils/novnc_proxy中,有这样一段代码,其中${HERE}指的是 novnc_proxy 所在目录
git clone https://github.com/novnc/websockify ${HERE}/websockify

接下来就是运行了。需要注意的是,如果不监听本地的话,必须开启ssl。

./noVNC-1.4.0/utils/novnc_proxy --vnc localhost:5902 --listen localhost:8787
./noVNC-1.4.0/utils/novnc_proxy --vnc localhost:5902 --listen 8787 --cert /home/lijia/cert.pem --key /home/lijia/cert.key --ssl-only

Step 4

主要是设置环境变量DISPLAY

export DISPLAY=":2"
java -jar gui_app.jar

内容
隐藏