本文介绍了一种在 Ubuntu 环境下搭建远程桌面服务的方法。

主要环境:

  • 操作系统环境:Ubuntu 24.04 LTS (GNOME 桌面系统)
  • VNC 服务端:TigerVNC
  • VNC 客户端:noVNC

其他环境和工具:

  • 1panel
  • openresty (nginx)
  • supervisor (or systemd)

安装和配置 VNC 服务端

  1. 安装 TigerVNC

在 sourceforge 上下载 TigerVNC 的程序包。

https://sourceforge.net/projects/tigervnc/files/stable/1.13.1/

下载完成后,解压到指定目录。

我这里放在了 /opt/ 目录下。

解压后的目录结构如下
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
  1. 配置 x0vncserver

首先给 VNC 服务生成密码。

# 切换到 tigerVNC 的 bin 目录
cd /opt/tigervnc-1.13.0.x86_64/usr/bin
# 执行 vncpasswd 命令
./vncpasswd

这里将会提示输入两次密码,这个密码用于远程登录的认证服务。

然后查看当前的显示器序号。

printenv DISPLAY

这里显示的是 :0,表示当前显示器的序号是 0。

然后启动 x0vncserver 服务。

我这里使用的 x0vncserver,可以直接连接到当前桌面环境。

在效果上就和 Windows 的远程桌面服务,向日葵等工具类似。

如果使用 Xvnc,会新开一个桌面环境,远程访问的效果和本地不同。

# 切换到 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:表示不共享,只允许一个用户连接。

全部支持的参数信息可以查看帮助文档

  1. 配置桌面环境

根据我的实验,如果使用 Wayland 桌面环境,x0vncserver 连上后就只能看到一个黑屏。
所以首先关闭 Wayland。

同时,为了能让电脑在一开机的时候就能够自动启动 x0vncserver 服务,我们需要开机桌面的自动登录,为了创建一个 X 会话。

# 编辑 /etc/gdm3/custom.conf 文件
sudo vim /etc/gdm3/custom.conf

# 找到 [daemon] 部分,添加如下内容
WaylandEnable=false

AutomaticLoginEnable=true
AutomaticLogin=<your_username>

修改完之后,重启电脑。

安装和配置 noVNC

  1. 下载 noVNC

我这里在 /opt/ 目录下存放 noVNC 的程序包。

cd /opt
git clone https://github.com/novnc/noVNC.git
  1. 配置 noVNC
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 的守护进程,如图所示:

最后,添加网站并配置反向代理,这一步是常规操作,这里不再赘述。

我这里的反向代理配置如下:

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。