Ubuntu 22.04 安装 linux-dash 指南

Ubuntu 22.04 从零安装 linux-dash 2.0 的完整指南:Node.js 官方推荐路径与 PHP+Apache 备选路径双主线,含端口调整、Nginx/Apache HTTP Basic 认证、systemd 开机自启与 7 条排障实录,全部命令实测。

linux-dashUbuntuLinux系统监控2026/10/23

Ubuntu 22.04 安装 linux-dash 指南

目标:在 Ubuntu 22.04 服务器上从零安装 linux-dash 2.0 服务器监控面板,覆盖官方推荐的 Node.js 路径与备选的 PHP + Apache 路径两条完整安装主线,并完成端口调整、HTTP Basic 认证加固与 systemd 开机自启。全部命令与回显已在 Ubuntu 22.04 环境实测通过。

一、环境信息

本文所有命令均在以下环境实测,回显为真实输出:

项目值(实测)
操作系统Ubuntu 22.04.5 LTS(lsb_release -ds 实测输出 Ubuntu 22.04.5 LTS)
内核6.8.0-138-generic
linux-dash 版本2.0.0(master 分支,最后提交 186a802,2020-03-22)
Node.jsv20.20.2(NodeSource 20.x 源),npm 10.8.2
Apache2.4.52 (Ubuntu),PHP 8.1.2-1ubuntu2.28(方案 B)
Nginx1.18.0 (Ubuntu)(认证加固节)
安装目录/opt/linux-dash
端口规划Node 后端 80(默认)/ 8081(演示改参),Nginx 反代 8080,pm2 演示 2800

两台「服务器」的角色划分:一台安装方案 A(Node.js 路径 + Nginx 认证加固 + systemd),一台安装方案 B(PHP + Apache 路径),互不依赖。

二、前置条件

  1. 一台 Ubuntu 22.04 服务器,具备 root 或 sudo 权限(本文以 root 演示,示例管理账号 root / q1w2e3r4)。
  2. 服务器可访问 GitHub 与 npm 仓库(在线路径需要;纯内网可先在外网机完成克隆与 npm install 后打包拷贝,见常见问题 8.1)。
  3. 浏览器(Chrome/Firefox 均可)用于访问面板。
  4. 更新系统软件包索引:
apt-get update

输出节选(实测):

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Reading package lists... Done

三、版本选型说明

linux-dash 的版本选择非常简单,因为它只有一个「当前版本」:

版本发布日期说明
0.52014-06-26早期 PHP 单文件形态
1.02014-12-22首个带独立后端的形态
1.52015-02-08前端重写
2.02017-05-14AngularJS 前端 + 四后端架构,即当前 master 分支

截至 2026-10-23,仓库最后一次代码提交为 2020-03-22(提交号 186a802),项目已处于停滞维护状态,master 分支即最新可用版本,git clone 得到的就是 2.0.0。因此不存在「装哪个版本」的纠结,直接安装 master 即可;需要老版本仅在复现历史环境时才有意义(tags 页下载对应压缩包)。

关键差异提示:由于项目不再更新,安装时更应关注的是「运行时兼容性」——本文实测 Node.js v20.20.2 与 PHP 8.1 均可正常运行 linux-dash 2.0;个别模块对系统组件有额外要求(gawk、rsyslog、lm-sensors 等),在常见问题节逐一给出修复。

四、安装方案 A:Node.js 路径(官方推荐)

4.1 方案说明

Node.js 是官方 README 首推的后端("If Using Node.js (recommended)")。该方案以 node index.js 常驻运行,无外部依赖服务,启动最快、资源占用最低;进程托管(systemd/pm2)在第七章与《linux-dash 2.0 API 接口详解》篇展开。本方案监听 80 端口,需要 root 启动(或按 4.5 节改用非特权端口)。

4.2 安装 Node.js 运行时

Ubuntu 22.04 官方源的 nodejs 为 12.x 老版本,建议安装 NodeSource 的 Node.js 20.x(实测兼容 linux-dash 2.0):

curl -fsSL https://deb.nodesource.com/setup_20.x -o /tmp/nodesource_setup.sh
bash /tmp/nodesource_setup.sh
apt-get install -y nodejs

安装脚本输出节选(实测):

2026-10-23 06:41:20 - Repository configured successfully.
...
Unpacking nodejs (20.20.2-1nodesource1) ...
Setting up nodejs (20.20.2-1nodesource1) ...

验证版本:

node -v
npm -v

实测回显:

v20.20.2
10.8.2

4.3 获取 linux-dash 源码

克隆仓库到 /opt/linux-dash(浅克隆只取最新提交,体积极小):

cd /opt
git clone --depth 1 https://github.com/afaqurk/linux-dash.git linux-dash
git -C linux-dash log -1 --format='%h %ad %s' --date=short

实测回显:

Cloning into 'linux-dash'...
186a802 2020-03-22 Merge pull request #486 from AlexanderProd/master

💡 说明:仓库原地址 afaqurk/linux-dash 已转移至 tariqbuilds/linux-dash,旧地址会自动跳转,两种写法均可;本目录名取 linux-dash,与下文所有路径对应。

4.4 安装生产依赖

在 app/server 目录执行安装(npm 会向上解析到仓库根的 package.json,依赖落在仓库根的 node_modules):

cd /opt/linux-dash/app/server
npm install --production

输出节选(实测,末尾的 npm notice 为版本提示,可忽略):

npm notice
npm notice New major version of npm available! 10.8.2 -> 12.2.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v12.2.1
npm notice To update run: npm install -g npm@12.2.1

确认依赖目录生成:

ls /opt/linux-dash/node_modules | head

实测回显:

accepts
ansi-regex
array-flatten
body-parser
bufferutil
bytes
call-bind-apply-helpers
call-bound
camelcase
cliui

⚠️ 注意:不要用 npm start 来启动生产服务——package.json 的 start 脚本指向 gulp,那是前端构建工具链(属于 devDependencies),生产启动直接用下一节的 node index.js。

4.5 启动与端口配置

默认启动(监听 0.0.0.0:80,需 root):

cd /opt/linux-dash/app/server
node index.js

实测回显:

Linux Dash Server Started on 0.0.0.0:80!

另开终端验证监听:

netstat -ltnp | grep node

实测回显:

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3833/node

端口与监听地址有两种官方支持的调整方式(源码 app/server/index.js 的取值顺序:命令行参数 > 环境变量 > 默认值 80 / 0.0.0.0):

方式一:命令行参数。实测以非特权端口 8081 + 仅监听本机启动:

node index.js --port 8081 --host 127.0.0.1

实测回显:

Linux Dash Server Started on 127.0.0.1:8081!
netstat -ltn | grep -c '0.0.0.0:8081'

实测回显(计数为 0,说明未绑定所有网卡、仅 127.0.0.1 可访问):

0

方式二:环境变量:

LINUX_DASH_SERVER_PORT=80 nohup node index.js > /var/log/linux-dash.log 2>&1 &
cat /var/log/linux-dash.log

实测回显:

Linux Dash Server Started on 0.0.0.0:80!

4.6 验证

首页与探测接口:

curl -s http://127.0.0.1/ | head -3
curl -s http://127.0.0.1/websocket

实测回显:

<!DOCTYPE html>
<html lang="en" ng-app="linuxDash">
    <head>
{"websocket_support":true}

模块 API(REST 数据通道):

curl -s 'http://127.0.0.1/server/?module=general_info'
curl -s 'http://127.0.0.1/server/?module=current_ram'

实测回显:

{ "OS": "Ubuntu 22.04.5 LTS 6.8.0-138-generic", "Hostname": "linuxdash-node", "Uptime": " 3 days 15 hours 18 minutes and 12 seconds ", "Server Time": "Fri Oct 23 07:06:08 UTC 2026" }
{ "total": 32050.4, "used": 18232.2, "available": 13818.2 }

💡 说明:/server/?module=<模块名> 就是面板全部数据来源,模块名全集与逐项含义见《linux-dash 配置参数详解》。浏览器打开 http://<服务器IP>/(远程访问把 127.0.0.1 换成服务器实际 IP)即可看到仪表盘。

五、安装方案 B:PHP + Apache 路径

5.1 方案说明

若服务器已在跑 Apache,可以让 linux-dash 复用现有 Apache 而不新增常驻进程:把 Web 根目录指向源码的 app/ 目录即可。此路径下数据接口由 app/server/index.php 提供,它通过 shell_exec 调用同一份数据源脚本 linux_json_api.sh,因此要求 PHP 放开 exec、shell_exec、escapeshellarg 三个函数(Ubuntu 官方源 PHP 默认放开)。实测 PHP 8.1 + Apache 2.4 兼容。

5.2 安装 Apache 与 PHP

apt-get install -y git apache2 libapache2-mod-php php-cli lsb-release
php -v | head -1
apache2 -v | head -1

实测回显:

PHP 8.1.2-1ubuntu2.28 (cli) (built: Oct 19 2026 18:54:45) (NTS)
Server version: Apache/2.4.52 (Ubuntu)

⚠️ 注意:这里刻意把 lsb-release 一并装上——general_info 模块用它读取发行版名,缺失时面板「常规信息」卡片的 OS 字段只剩内核版本号(排障实录见 8.2 节)。

5.3 获取源码

cd /opt
git clone --depth 1 https://github.com/afaqurk/linux-dash.git linux-dash

实测回显:

Cloning into 'linux-dash'...

PHP 路径无需执行 npm install(不使用 Node 后端)。

5.4 配置虚拟主机

新建站点配置,把 DocumentRoot 指向 app/ 目录:

cat > /etc/apache2/sites-available/linux-dash.conf <<'EOF'
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /opt/linux-dash/app

    <Directory /opt/linux-dash/app>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
        DirectoryIndex index.html index.php
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/linux-dash_error.log
    CustomLog ${APACHE_LOG_DIR}/linux-dash_access.log combined
</VirtualHost>
EOF
a2dissite 000-default
a2ensite linux-dash
apache2ctl configtest

实测回显:

Site 000-default disabled.
Your MPM module may be wrong...
Enabling site linux-dash.
To activate the new configuration, you need to run:
  systemctl restart apache2
Syntax OK

启动 Apache:

systemctl start apache2

💡 说明:目录里同时有 index.html(面板前端)与 server/index.php(数据接口),前端会以 GET /server/?module=<模块名> 请求接口,Apache 的目录索引恰好把 /server/ 路径解析到 server/index.php,两者无缝衔接,无需任何重写规则。

5.5 启动与验证

curl -s http://127.0.0.1/ | head -3
curl -s 'http://127.0.0.1/server/?module=general_info'
curl -s 'http://127.0.0.1/server/?module=current_ram'
curl -s 'http://127.0.0.1/server/?module=bad_name'

实测回显:

<!DOCTYPE html>
<html lang="en" ng-app="linuxDash">
    <head>
{ "OS": "Ubuntu 22.04.5 LTS 6.8.0-138-generic", "Hostname": "linuxdash-php", "Uptime": " 3 days 14 hours 59 minutes and 56 seconds ", "Server Time": "Fri Oct 23 06:47:52 UTC 2026" }
{ "total": 32050.4, "used": 23456.7, "available": 8593.7 }
{"success":false,"status":"Invalid module"}

5.6 Apache 层 HTTP Basic 认证(必配)

linux-dash 本体无任何认证(官方 README 明确声明),PHP 路径的访问控制由 Apache 承担。生成口令文件并改造虚拟主机:

htpasswd -bc /etc/apache2/.htpasswd admin q1w2e3r4

实测回显:

Adding password for user admin

修改 /etc/apache2/sites-available/linux-dash.conf 的 <Directory> 段,把 Require all granted 一行删除并替换为认证指令:

    <Directory /opt/linux-dash/app>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        DirectoryIndex index.html index.php
        AuthType Basic
        AuthName "Linux Dash Admin"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
    </Directory>

重载并验证:

apache2ctl configtest
apache2ctl -k restart
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1/
curl -s -o /dev/null -w '%{http_code}\n' -u admin:nope http://127.0.0.1/
curl -s -o /dev/null -w '%{http_code}\n' -u admin:q1w2e3r4 http://127.0.0.1/
curl -s -u admin:q1w2e3r4 'http://127.0.0.1/server/?module=current_ram'

实测回显:

Syntax OK
401
401
200
{ "total": 32050.4, "used": 23747.1, "available": 8303.31 }

未带凭据与错误凭据的响应头(实测):

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Linux Dash Admin"

⚠️ 排障实录:认证「看似配了却不生效」的最常见原因是 Require all granted 与 Require valid-user 同时出现在同一个 <Directory> 块——Apache 2.4 的多条 Require 指令按「或」语义合并,all granted 永远放行,认证被整体旁路。实测中修正前无凭据访问返回 200,删除 Require all granted 后立即恢复 401/200 的预期行为。

六、多方案对比与选择建议

维度方案 A:Node.js 路径方案 B:PHP + Apache 路径
官方态度README 首推(recommended)支持路径之一(附 DigitalOcean 教程)
运行时依赖Node.js + npm(NodeSource 20.x 实测可用)Apache + libapache2-mod-php(PHP 8.1 实测可用)
额外要求需自行托管进程(systemd/pm2)复用 Apache,无需进程托管
监听端口80 默认,--port/环境变量可改Apache 的 80,随 vhost 配置
数据接口实现index.js 内置路由index.php 的 shell_exec
认证方案Nginx 反代 + auth_basic(7.2 节)Apache <Directory> + htpasswd(5.6 节)
适用场景裸机/已有 Node 环境,资源最省已有 Apache 站点的服务器复用

如何选型:服务器上已有 Apache 且有 PHP 运维习惯 → 方案 B 最省事;追求最小依赖、独立部署或打算用 systemd/pm2 精细管进程 → 方案 A。两方案的数据源是同一份 Bash 脚本,功能完全等价,切换成本仅在于 Web 层。

七、配置说明(两方案共用项)

7.1 端口与监听地址(方案 A)

见 4.5 节实测:--port/LINUX_DASH_SERVER_PORT、--host/LINUX_DASH_SERVER_HOST,默认 0.0.0.0:80。安全建议:Node 只绑 127.0.0.1,对外统一走 Nginx(7.2 节)。

7.2 Nginx 反向代理与 HTTP Basic 认证(方案 A 的对外入口)

安装 Nginx 与口令工具:

apt-get install -y nginx apache2-utils
nginx -v

实测回显:

nginx version: nginx/1.18.0 (Ubuntu)

生成口令文件(演示账号 admin / q1w2e3r4):

htpasswd -bc /etc/nginx/.htpasswd admin q1w2e3r4

实测回显:

Adding password for user admin

新建 /etc/nginx/sites-available/linux-dash:

server {
    listen 8080;
    server_name _;

    auth_basic "Linux Dash Admin";
    auth_basic_user_file /etc/nginx/.htpasswd;

    location / {
        proxy_pass http://127.0.0.1:80;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 300s;
    }
}

逐项说明:listen 8080 为对外端口;auth_basic/auth_basic_user_file 启用 Basic 认证;proxy_pass 指向本机 Node 监听地址;proxy_http_version 1.1 与 Upgrade/Connection 两个头用于透传 WebSocket 升级请求(linux-dash 前端优先走 WebSocket);proxy_read_timeout 300s 拉长长连接读超时。启用并启动:

rm -f /etc/nginx/sites-enabled/default
ln -sf /etc/nginx/sites-available/linux-dash /etc/nginx/sites-enabled/linux-dash
nginx -t
service nginx start
netstat -ltnp | grep nginx

实测回显:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
 * Starting nginx nginx
   ...done.
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      4830/nginx: master

💡 说明:systemd 服务器上等价命令为 systemctl start nginx 与 systemctl enable nginx(开机自启),本文回显取自 service 封装,二者行为一致。

验证认证(无凭据 → 401,错误密码 → 401,正确密码 → 200):

curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/
curl -sI http://127.0.0.1:8080/ | grep -iE 'HTTP/|WWW-Authen'
curl -s -o /dev/null -w '%{http_code}\n' -u admin:nope http://127.0.0.1:8080/
curl -s -o /dev/null -w '%{http_code}\n' -u admin:q1w2e3r4 http://127.0.0.1:8080/
curl -s -u admin:q1w2e3r4 'http://127.0.0.1:8080/server/?module=current_ram'

实测回显:

401
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Basic realm="Linux Dash Admin"
401
200
{ "total": 32050.4, "used": 18232.2, "available": 13818.2 }

7.3 开机自启(方案 A,systemd)

新建 /etc/systemd/system/linux-dash.service:

[Unit]
Description=Linux Dash server monitoring dashboard
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/linux-dash
Environment=LINUX_DASH_SERVER_PORT=80
Environment=LINUX_DASH_SERVER_HOST=0.0.0.0
ExecStart=/usr/bin/node /opt/linux-dash/app/server/index.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

逐项说明:WorkingDirectory 指向仓库根(依赖 node_modules 所在目录);两个 Environment 对应 7.1 节的端口/地址环境变量,每行只写一个;Restart=always 保证进程被杀后自动拉起(实测 on-failure 对手工 kill 主进程的场景不会重启,见 8.5 节);RestartSec=5 控制重启间隔。

启用并启动:

systemctl daemon-reload
systemctl enable linux-dash
systemctl start linux-dash
systemctl is-active linux-dash
systemctl status linux-dash --no-pager -n 5 | head -12

实测回显:

Created symlink /etc/systemd/system/multi-user.target.wants/linux-dash.service → /etc/systemd/system/linux-dash.service.
active
● linux-dash.service - Linux Dash server monitoring dashboard
     Loaded: loaded (/etc/systemd/system/linux-dash.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2026-10-23 06:55:57 UTC; 2s ago
   Main PID: 3640 (node)
      Tasks: 7 (limit: 94371)
     Memory: 18.3M
        CPU: 111ms
     CGroup: /system.slice/.../system.slice/linux-dash.service
             └─3640 /usr/bin/node /opt/linux-dash/app/server/index.js

Oct 23 06:55:57 linuxdash-sysd systemd[1]: Started Linux Dash server monitoring dashboard.
Oct 23 06:55:57 linuxdash-sysd node[3640]: Linux Dash Server Started on 0.0.0.0:80!

验证自动拉起(杀掉主进程,5 秒后应自动恢复):

kill $(systemctl show -p MainPID --value linux-dash)
sleep 6
systemctl is-active linux-dash
journalctl -u linux-dash --no-pager -n 4

实测回显:

active
Oct 23 06:56:48 linuxdash-sysd systemd[1]: linux-dash.service: Scheduled restart job, restart counter is at 1.
Oct 23 06:56:48 linuxdash-sysd systemd[1]: Stopped Linux Dash server monitoring dashboard.
Oct 23 06:56:48 linuxdash-sysd systemd[1]: Started Linux Dash server monitoring dashboard.
Oct 23 06:56:48 linuxdash-sysd node[3699]: Linux Dash Server Started on 0.0.0.0:80!

八、常见问题(FAQ)

Q1:git clone GitHub 超时或很慢? 浅克隆 --depth 1 已把传输量降到最低;若仍超时,可先在网络通畅的机器上 git clone --depth 1 后打包 tar czf linux-dash.tgz linux-dash/ 传到服务器解压;或改用官方 README 提供的 zip 方式:curl -LOk https://github.com/afaqurk/linux-dash/archive/master.zip && unzip master.zip。

Q2:面板「常规信息」卡片 OS 字段只显示内核版本号(如 6.8.0-138-generic),没有 Ubuntu 22.04.5 LTS? general_info 模块用 lsb_release -ds 取发行版名,最小化安装的系统没有这个命令。实测修复前后对比:

修复前:{ "OS": "6.8.0-138-generic", "Hostname": "linuxdash-php", ... }
apt-get install -y lsb-release
修复后:{ "OS": "Ubuntu 22.04.5 LTS 6.8.0-138-generic", "Hostname": "linuxdash-php", ... }

Q3:cron_history 模块报 function gensub never defined,scheduled_crons 输出空? Ubuntu 22.04 默认的 awk 是 mawk,而这两个模块用了 gawk 独有的 gensub 函数。实测安装 gawk 后 awk 切换为 /usr/bin/gawk,scheduled_crons 立即正常:

readlink -f $(which awk)
apt-get install -y gawk
readlink -f $(which awk)

实测回显:

/usr/bin/mawk
/usr/bin/gawk

另外 cron_history 读取 /var/log/syslog,需要 rsyslog 在运行且产生过 CRON 日志,否则该模块输出 []:apt-get install -y rsyslog 并确保 syslog 服务运行。

Q4:80 端口启动报权限错误? 监听 1024 以下端口需要 root;以普通用户运行时改用非特权端口 node index.js --port 8080(或环境变量 LINUX_DASH_SERVER_PORT=8080),再由 Nginx 监听 80/8080 反代(7.2 节)。

Q5:浏览器打开面板,部分模块一直转圈不出数? linux-dash 2.0 的 WebSocket 通道存在已知拼接缺陷:服务端把模块输出以未转义引号内嵌进 JSON(源码 index.js 的 wsResponse 拼接行),输出含引号的模块经 WS 返回后浏览器 JSON.parse 会失败(实测以 node 客户端复现:SyntaxError: Expected ',' or '}' after property value in JSON at position 42)。排查方法:先用 REST 接口确认数据源正常——curl -s 'http://127.0.0.1/server/?module=load_avg';经不支持 WebSocket 的反代访问时前端会自动降级为 REST 轮询,面板仍可用;该缺陷需自行修补 index.js 拼接行(转义输出或改 JSON.stringify),项目已停止维护,官方不会发布修复。

Q6:Apache 改完配置 systemctl restart apache2 失败,apache2ctl start 提示 httpd (pid xxx) already running 但 80 端口无人监听? 异常退出残留的 pid 文件会让 Apache 误判进程仍在。清掉 pid 文件再启动:

rm -f /var/run/apache2/apache2.pid
apache2ctl start

实测(清理后)启动成功,netstat -ltnp | grep :80 恢复 LISTEN .../apache2。

Q7:Apache 配了认证却无凭据也能访问? 见 5.6 节排障实录:Require all granted 与 Require valid-user 并存时前者放行一切,删除 Require all granted 即恢复。

Q8:npm install --production 慢或失败? 换用镜像源重试(实测可用):npm install --production --registry=https://registry.npmmirror.com。

九、卸载与清理

方案 A(含 systemd 与 Nginx 配置):

systemctl stop linux-dash
systemctl disable linux-dash
rm -f /etc/systemd/system/linux-dash.service
systemctl daemon-reload
rm -rf /opt/linux-dash
rm -f /etc/nginx/sites-enabled/linux-dash /etc/nginx/sites-available/linux-dash /etc/nginx/.htpasswd
service nginx restart

方案 B:

a2dissite linux-dash
rm -f /etc/apache2/sites-available/linux-dash.conf /etc/apache2/.htpasswd
systemctl reload apache2
rm -rf /opt/linux-dash

卸载运行时(如不再需要):

apt-get purge -y nodejs apache2 libapache2-mod-php
apt-get autoremove -y

十、参考链接

  1. 官方仓库与安装说明:https://github.com/tariqbuilds/linux-dash (原 afaqurk/linux-dash,查询日期 2026-10-23)
  2. 官方 Wiki(多后端说明):https://github.com/tariqbuilds/linux-dash/wiki (查询日期 2026-10-23)
  3. DigitalOcean 的 PHP + Apache 安装教程(官方 README 引用):https://www.digitalocean.com/community/tutorials/how-to-install-linux-dash-on-ubuntu-14-04 (查询日期 2026-10-23)
  4. NodeSource 安装脚本:https://deb.nodesource.com/setup_20.x (查询日期 2026-10-23)
  5. 本专栏姊妹篇:《linux-dash 介绍与选型指南》