使用NoMachine Enterprise Server构建多人共享的Linux开发桌面
NoMachine
版本说明
NoMachine在我们所谈论的这个生产环境中可以用到的有三个版本:
- Enterprise Terminal Server : 这是一个可以独立运行的版本,可以将一台Linux主机发布给多人共同使用
- Enterprise Terminal Server Cluster : 这是一个群集版本,它自己也可以实现Terminal Server的全部功能,也可以用它来搭建一个一主多从的可扩展架构。 由1-2台主节点(Master节点)负责接收客户端连接,然后把用户分配到后端的从节点(Node节点)上去。
- Enterprise Terminal Server Node :些版本无法单独使用,必须配合Server Cluster来使用
对于前两者的安装方法在单台服务器的时候几乎是一样的, 这款软件国内似乎没有很专业的代理存在,你可以通过它的在线商店订购。
在本例中, 我们采用2台Master服务器 + N台Node服务器的架构。无论Master还是Node节点,我们都推荐部署在物理机上, Master节点可以采用1U的服务器,物理核心16-32核, 128G内。
如果要用虚拟机,Master节点在多用户使用时,对内存需求比较大,我们的使用场景大约有200并发用户,最初使用16C/64G内存的两台虚拟机充当Master节点(最后也换成了物理机)
Node节点32物理核心(2代和3代至强)/512G内存可以流畅的承载50名用户。
基础安装配置
# 切换至root账户
# 下载并安装
rpm -ivh https://download.nomachine.com/packages/8.1-PRODUCTION/Linux/nomachine-enterprise-terminal-server-cluster_8.1.2_1_x86_64.rpm
# 配置远程连接默认启用xfce4, 修改各node节点上的配置文件 /usr/NX/etc/node.cfg 中的 DefaultDesktopCommand为startxfce4,本例中用Xfce,我们也推荐你用Xfce
...
DefaultDesktopCommand "/usr/bin/startxfce4"
...
# 用脚本自动处理是:
sed -i 's/^DefaultDesktopCommand.*/DefaultDesktopCommand \"\/usr\/bin\/startxfce4\"/' /usr/NX/etc/node.cfg
配置两个主管理节点
主管理节点要配置基本的认证不需要安装桌面以及工具,它们的作用仅用来接入客户访问,并把客户的访问转发到后面的Linux桌面节点服务器。 在此案例中,一共有4台主机,主机名与配置如下:
- owlnxmaster01 ~ 01 2C/4G , 10.12.6.100 为虚拟地址, 10.12.6.99和10.12.6.101分别为master01和02的地址
- owlnxnode01 ~ 02 16C/128G
# 在master01和master02上安装 Enterprise Terminal Server Cluster
# 在owlnxnode01和owlnxnode02 上安装 Enterprise Terminal Server Node
# 在owlnxmaster01 第一台主节点上
/usr/NX/bin/nxserver --clusteradd --local 10.12.6.99 --shared 10.12.6.100 --netmask 255.255.255.0 --interface ens192:0
/usr/NX/bin/nxserver --clusteradd 10.12.6.101 --netmask 255.255.255.0 --interface ens192:0
/usr/NX/bin/nxserver --restart
# 然后在owlnxmaster02 上也执行 nxserver --restart命令,依次重启两台主节点服务器上的服务
# 在owlnxmaster01主节点是执行 clusterupdate,这一步不做似乎自动的VIP切换不生效
/usr/NX/bin/nxserver --clusterupdate
# 查看集群配置
/usr/NX/bin/nxserver --clusterlist --configuration
添加两台节点服务器
/usr/NX/bin/nxserver --nodeadd owlnxnode01:4000 --node-name owlnxnode01
/usr/NX/bin/nxserver --nodeadd owlnxnode02:4000 --node-name owlnxnode02
/usr/NX/bin/nxserver --clusterupdate
禁止文件传出 在MASTER上执行
# 这条命令可以列出所有的"resource",然后你可以根据 class ,type和值 来配置规则
/usr/NX/bin/nxserver --resourcelist
# 从服务器上可以复制800字符的文本
/usr/NX/bin/nxserver --ruleadd --class feature --type server-clipboard-limit --value 800 --system
# 从客户机上可以复制800字符的文件,客户机这里也许可以调大一点
/usr/NX/bin/nxserver --ruleadd --class feature --type client-clipboard-limit --value 800 --system
# 不允许通NoMachine连接物理控制台
/usr/NX/bin/nxserver --ruleadd --class session --type physical-desktop --value no --system
# 以下是禁用一堆重定向的配置,看字面意思,就不解释了
/usr/NX/bin/nxserver --ruleadd --class service --type server-printer-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-network-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type audio --value no
/usr/NX/bin/nxserver --ruleadd --class service --type server-network-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-usb-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type server-disk-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type local-recording --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-smartcard-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type microphone --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-printer-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type client-disk-sharing --value no
/usr/NX/bin/nxserver --ruleadd --class service --type server-file-transfer --value no
/usr/NX/bin/nxserver --ruleadd --class service --type session-recording --value no
/usr/NX/bin/nxserver --ruleadd --class service --type server-usb-sharing --value no
# 允许从客户机上传文件到服务器
/usr/NX/bin/nxserver --ruleadd --class service --type client-file-transfer --value yes
# 以上配置是对全局生效,如果你要针对某个用户或者组单独设置策略,在命令后添加 --user USERNAME / --group GROUP 参数
NoMachine的性能调优
在节点服务器上的图形界面右上角“!M"图标点右键,Performance下有五个选项。
- User a specific display: VP8/H264 # 可能会对性能产生较大的不利影响,在自己的环境中测试一下开启的效果
- Use hardware encoding
- Use a specific frame rate
- Use acceleration for display processing
- Use X11 vector graphics mode in virtual sessions # 可能会对性能产生非常大的不利影响,在自己的环境中测试一下开启的效果
使用Custom Session
对于通过VPN或者专线远程访问的用户,使用默认的Virtual Session桌面会带来很大的开销,你可以通过在创建新桌面时选择"Create new custom session",然后指定启动xfce4-terminal + floating windows的方式来只启动一个Terminal。 这会极大的增加系统的流畅度。对于画版本、Layout和看波形的工具相当的友好,可以比较接近ETX的效果,当然,还是差得很远~ 画图的时候, 单个ETX桌面可以稳定的保持在数个Mbps的带宽消耗,而NoMachine是有可能会上到几十Mbps的,即使使用Custom Session,也有可能会奔到10Mbps。
在此种模式下,有时候应用程序 的GUI显示不正常,比如展示成绿方块。 你可以通过变更客户端显示选项中的Advcanced display seetings中的以下两个选项来解决此问题:禁用 client side image post-processing和disable client side hardware encoding。
对登录桌面节点进行分组
我们把上例中的两个登录节点分成两个组,hw-nodes和sw-nodes,分别给硬件和软件团队使用,未来我们还可以往这两个组中增加更多的登录节点。 对登录节点分组的目的是为了可以针对一批登录服务器进行策略的配置。
# 建两个组
/usr/NX/bin/nxserver --nodegroupadd hw-nodes
/usr/NX/bin/nxserver --nodegroupadd sw-nodes
# 把现存的两个节点放到两个组中
/usr/NX/bin/nxserver --nodeedit owlnxnode01 --comment "hardware team node" --node-group hw-nodes
/usr/NX/bin/nxserver --nodeedit owlnxnode02 --comment "software team node" --node-group sw-nodes
指定不同的用户访问不同的节点
把研发人员分成两个组,在AD中建安全组,hardware-node-users 和 software-node-users,然后制定策略,使硬件组的人只能登录hw-nodes中的节点。软件组亦然。
/usr/NX/bin/nxserver --ruleadd --class node --type hw-nodes --value yes --group hardware-node-users
/usr/NX/bin/nxserver --ruleadd --class node --type sw-nodes --value yes --group software-node-users
# 如果有些用户或者人需要能手动选择登录节点的权限时,比如IT管理人员,可以针对此人的账户添加手动选择节点的能力。
/usr/NX/bin/nxserver --ruleadd --class feature --type manual-node-selection --value yes --user owlhero
Troubleshooting
# 有时候执行 nxserver --nodelist 时显示节点unavailable ,在master上依次对所有节点执行一下这个命令
/usr/NX/bin/nxserver --nodeedit owlnxnode01:4000
# 在master上查看所有的session
/usr/NX/bin/nxserver --list
#断开指定用户的session
/usr/NX/bin/nxserver --kill $display
/usr/NX/bin/nxserver --kill $username
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统