本文介绍了一种在 Ubuntu 环境下搭建远程桌面服务的方法。
主要环境:
- 操作系统环境:Ubuntu 24.04 LTS (GNOME 桌面系统)
- VNC 服务端:TigerVNC
- VNC 客户端:noVNC
其他环境和工具:
- 1panel
- openresty (nginx)
- supervisor (or systemd)
安装和配置 VNC 服务端
- 安装 TigerVNC
在 sourceforge 上下载 TigerVNC 的程序包。
https://sourceforge.net/projects/tigervnc/files/stable/1.13.1/
下载完成后,解压到指定目录。
我这里放在了/opt/目录下。
解压后的目录结构如下:
Collapse code block
Bash
Open full page code blockCopy code
wgxls@server:/opt$ tree tigervnc-1.13.0.x86_64/ tigervnc-1.13.0.x86_64/ ├── etc │ ├── pam.d │ │ └── tigervnc │ └── tigervnc │ ├── vncserver-config-defaults │ ├── vncserver-config-mandatory │ └── vncserver.users └── usr ├── bin │ ├── vncconfig │ ├── vncpasswd │ ├── vncviewer │ ├── x0vncserver │ └── Xvnc ├── lib │ └── systemd │ └── system │ └── vncserver@.service ├── lib64 │ ├── swrast_dri.so │ └── xorg │ └── protocol.txt ├── libexec │ ├── vncserver │ └── vncsession-start ├── sbin │ └── vncsession └── share ├── applications │ └── vncviewer.desktop ├── doc │ └── tigervnc │ ├── HOWTO.md │ ├── LICENCE.TXT │ └── README.rst ├── icons │ └── hicolor │ ├── 128x128 │ │ └── apps │ │ └── tigervnc.png │ ├── 16x16 │ │ └── apps │ │ └── tigervnc.png │ ├── 22x22 │ │ └── apps │ │ └── tigervnc.png │ ├── 24x24 │ │ └── apps │ │ └── tigervnc.png │ ├── 32x32 │ │ └── apps │ │ └── tigervnc.png │ ├── 48x48 │ │ └── apps │ │ └── tigervnc.png │ ├── 64x64 │ │ └── apps │ │ └── tigervnc.png │ └── scalable │ └── apps │ └── tigervnc.svg ├── locale │ ├── bg │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── cs │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── da │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── de │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── el │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── eo │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── es │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── fi │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── fr │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── fur │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── he │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── hu │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── id │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── it │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── ka │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── ko │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── nl │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── pl │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── pt_BR │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── ro │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── ru │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── sk │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── sr │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── sv │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── tr │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── uk │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── vi │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ ├── zh_CN │ │ └── LC_MESSAGES │ │ └── tigervnc.mo │ └── zh_TW │ └── LC_MESSAGES │ └── tigervnc.mo ├── man │ ├── man1 │ │ ├── vncconfig.1 │ │ ├── vncpasswd.1 │ │ ├── vncviewer.1 │ │ ├── x0vncserver.1 │ │ └── Xvnc.1 │ └── man8 │ ├── vncserver.8 │ └── vncsession.8 └── metainfo └── org.tigervnc.vncviewer.metainfo.xml 98 directories, 64 files |
展开剩余 145 行
- 配置 x0vncserver
首先给 VNC 服务生成密码。
Collapse code block
Bash
Open full page code blockCopy code
# 切换到 tigerVNC 的 bin 目录 cd /opt/tigervnc-1.13.0.x86_64/usr/bin # 执行 vncpasswd 命令 ./vncpasswd |
这里将会提示输入两次密码,这个密码用于远程登录的认证服务。
然后查看当前的显示器序号。
Collapse code block
Bash
Open full page code blockCopy code
printenv DISPLAY |
这里显示的是:0,表示当前显示器的序号是 0。
然后启动 x0vncserver 服务。
我这里使用的 x0vncserver,可以直接连接到当前桌面环境。
在效果上就和 Windows 的远程桌面服务,向日葵等工具类似。
如果使用 Xvnc,会新开一个桌面环境,远程访问的效果和本地不同。
Collapse code block
Bash
Open full page code blockCopy code
# 切换到 tigerVNC 的 bin 目录 cd /opt/tigervnc-1.13.0.x86_64/usr/bin # 启动 x0vncserver 服务 ./x0vncserver -display :0 -passwordfile ~/.vnc/passwd -NeverShared |
简单解释一下这三个参数:
-display :0:指定显示器序号。-passwordfile ~/.vnc/passwd:指定密码文件。-NeverShared:表示不共享,只允许一个用户连接。
全部支持的参数信息可以查看帮助文档。
⚠️ TigerVNC 的 vncpasswd 命令进行了更新,现在
passwd文件会生成在$HOME/.config/tigervnc/passwd,注意更新相关命令。
参考:vncpasswd
- 配置桌面环境
根据我的实验,如果使用 Wayland 桌面环境,x0vncserver 连上后就只能看到一个黑屏。
所以首先关闭 Wayland。
同时,为了能让电脑在一开机的时候就能够自动启动 x0vncserver 服务,我们需要开机桌面的自动登录,为了创建一个 X 会话。
Collapse code block
Bash
Open full page code blockCopy code
# 编辑 /etc/gdm3/custom.conf 文件 sudo vim /etc/gdm3/custom.conf # 找到 [daemon] 部分,添加如下内容 WaylandEnable=false AutomaticLoginEnable=true AutomaticLogin=<your_username> |
修改完之后,重启电脑。
安装和配置 noVNC
- 下载 noVNC
我这里在/opt/目录下存放 noVNC 的程序包。
Collapse code block
Bash
Open full page code blockCopy code
cd /opt git clone https://github.com/novnc/noVNC.git |
- 配置 noVNC
Collapse code block
Bash
Open full page code blockCopy code
cd /opt/noVNC ./utils/novnc_proxy --vnc localhost:5900 |
第一次执行这个命令的时候,会自动下载 websockify。
至此,核心部分的配置已经完成。
配置守护进程和反向代理
因为我的服务器上安装了 1panel,1panel 提供了图形界面去管理 supervisor 守护进程。
所以我这里使用 supervisor 来管理 noVNC 和 x0vncserver 服务。
登录 1panel 后点击工具箱->守护进程
如果服务器没有安装 supervisor,可以按照提示进行安装。
安装完成 supervisor 后, 在 1panel 的守护进程页面,点击初始化,然后点击创建守护进程。
首先添加 x0vncserver 的守护进程, 下图是我的例子,可以根据自己的实际情况进行配置。
启动命令我填写的是:/opt/tigervnc-1.13.0.x86_64/usr/bin/x0vncserver -display :0 -passwordfile /home/wgxls/.vnc/passwd -NeverShared
然后添加 noVNC 的守护进程,如图所示:
最后,添加网站并配置反向代理,这一步是常规操作,这里不再赘述。
我这里的反向代理配置如下:
Collapse code block
Nginx
Open full page code blockCopy code
location ^~ / { proxy_pass http://127.0.0.1:6080; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; add_header X-Cache $upstream_cache_status; add_header Strict-Transport-Security "max-age=31536000"; } |
如果你的网站域名是example.com,那么你可以通过https://example.com/vnc.html访问 noVNC。
设置 Dummy 显示器
如果你需要在没有物理显示器的服务器上使用 x0vncserver,可以设置一个 Dummy 显示器。
- 安装 Dummy 驱动
Collapse code block
Bash
Open full page code blockCopy code
sudo apt install xserver-xorg-video-dummy |
- 创建配置文件
Collapse code block
Bash
Open full page code blockCopy code
sudo vim /etc/X11/xorg.conf.d/10-dummy.conf |
在文件中添加以下内容:
Collapse code block
CONF
Open full page code blockCopy code
Section "Device" Identifier "DummyDevice" Driver "dummy" VideoRam 1024000 EndSection Section "Screen" Identifier "DummyScreen" Device "DummyDevice" Monitor "DummyMonitor" DefaultDepth 24 SubSection "Display" Depth 24 Modes "2560x1440_60.0" EndSubSection EndSection Section "Monitor" Identifier "DummyMonitor" HorizSync 30-200 VertRefresh 50-1000 Modeline "2560x1440_60.00" 312.25 2560 2752 3024 3488 1440 1443 1448 1493 -hsync +vsync EndSection |
展开剩余 3 行
- 重启 X 服务器或重启服务器
Collapse code block
Bash
Open full page code blockCopy code
sudo systemctl restart gdm3 |
然后就可以远程访问了。