驯服 AI 给服务器配置代理

ChatGPT

32 条消息 · 2026/10/28 20:00:52

我

我用了一台国内的 ubuntu 服务器,想下载 fnm,因为是 *.vercel.app 所以打不开,怎么办

AI 助手

你这种情况,最简单的办法是绕过 fnm.vercel.app 安装脚本,直接从 GitHub Releases 下载 fnm 的 Linux 二进制文件。这样不需要访问 Vercel,也不需要配置代理。

fnm 官方提供了预编译的 Linux 安装包,可以手动安装。

image

GitHub+1

方案一:直接从 GitHub 下载(推荐)

如果你的 Ubuntu 是常见的 x86_64 架构,可以直接执行下面的命令。

1. 安装依赖

sudo apt update
sudo apt install -y curl unzip

2. 下载并安装 fnm

mkdir -p ~/.local/bin

curl -fL \
  https://github.com/Schniz/fnm/releases/latest/download/fnm-linux.zip \
  -o /tmp/fnm-linux.zip

unzip -o /tmp/fnm-linux.zip -d ~/.local/bin
chmod +x ~/.local/bin/fnm

如果你当前使用的是 root 账号,~/.local/bin 就是 /root/.local/bin;如果是普通的 ubuntu 账号,则安装在该用户自己的目录下。

3. 配置 PATH

先执行:

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

验证安装:

fnm --version

如果输出类似 fnm 1.x.x,说明安装成功。

4. 配置 fnm 自动加载 Node.js

安装 fnm 后,还需要让 Bash 加载它:

echo 'eval "$(fnm env --use-on-cd)"' >> ~/.bashrc
source ~/.bashrc

然后安装 Node.js LTS:

fnm install --lts
fnm default lts-latest
node -v
npm -v

如果你需要安装国内服务器,建议同时配置 Node.js 下载镜像,避免下一步下载 Node.js 时再次遇到网络问题:

echo 'export FNM_NODE_DIST_MIRROR="https://npmmirror.com/mirrors/node"' >> ~/.bashrc
source ~/.bashrc

注意:如果你使用 root 安装 fnm,之后也用 root 管理 Node.js;不要指望其他用户能直接使用 root 的 fnm 环境。

如果 GitHub 也无法访问

可以在自己的电脑上下载压缩包,再通过 WinSCP 上传到服务器,后续解压、配置即可。

先确认服务器架构:

uname -m
  • x86_64:下载 fnm-linux.zip
  • aarch64:下载 fnm-arm64.zip

官方发布页:fnm Releases。

image

GitHub+1

建议先试方案一。 如果 github.com 也无法访问,你可以把 curl 报错或 uname -m 的输出发给我,我再给你一套适合这台国内 Ubuntu 服务器的安装方法。

我

能不能配置个 clash 什么的给他用,这实在是要命,以后装什么东西都很不方便

AI 助手

完全可以,而且我觉得对于你这种经常部署 Node.js、PHP、Docker、各种开发工具的 Ubuntu 服务器,长期配置一个代理比每次找下载镜像省事得多。

我建议直接部署 Mihomo(Clash Meta 的后续项目),不用装桌面版 Clash。它可以在没有图形界面的 Ubuntu 服务器上作为后台服务运行,并通过 systemd 开机自启。

image

mihomo docs+1

推荐的架构

Ubuntu 服务器上的各种程序

curl · Git · npm · pnpm · Docker · Composer

HTTP_PROXY / HTTPS_PROXY

Mihomo 代理服务

127.0.0.1:7890

后台运行 · 开机自启 · 本机访问

你自己的代理节点

使用你已有的 Clash 订阅或节点配置

这样配置后,日常安装软件时就不必再到处寻找 GitHub 镜像。不过要注意:Mihomo 只是代理客户端,不自带可用的代理节点,你还需要已有的订阅或服务器节点。

第一步:安装 Mihomo

先检查服务器架构:

uname -m
  • x86_64:下载 Linux AMD64 版本。
  • aarch64:下载 Linux ARM64 版本。

官方发布页:Mihomo Releases。

如果这台国内服务器连 GitHub 下载也不稳定,直接在你自己的电脑上下载对应的 .gz 文件,再通过 WinSCP 上传到服务器。Mihomo 是独立二进制程序,不需要先在服务器上安装 Go 或编译源码。

image

mihomo docs+1

假设你已经把文件上传到了 /tmp/,以下是安装步骤。请将文件名替换成实际上传的文件名:

# 解压(替换为实际文件名)
gzip -d /tmp/mihomo-linux-amd64-版本号.gz

# 安装到系统命令目录
install -m 755 /tmp/mihomo-linux-amd64-版本号 /usr/local/bin/mihomo

# 验证
mihomo -v

如果上传的是 ARM64 版本,相应地替换文件名即可。

第二步:配置代理节点

先创建配置目录:

mkdir -p /etc/mihomo

你有两种方式提供配置:

  • 已有 Clash 订阅链接: 在本地下载订阅生成的 YAML 配置,再通过 WinSCP 上传到 /etc/mihomo/config.yaml。
  • 已有完整的 Clash 配置文件: 直接上传即可。

注意,订阅链接可能包含账号凭据,不要把它公开,也不要把配置文件权限设置为所有用户可读。

确认配置中有类似下面的代理监听设置;如果订阅已有这些配置,不要重复添加,而应按需修改原配置:

mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info

这里的 mixed-port 同时提供 HTTP 和 SOCKS 代理入口,后面我们就用它。

第三步:设置 systemd 后台服务

创建服务文件:

nano /etc/systemd/system/mihomo.service

写入:

[Unit]
Description=Mihomo Proxy Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

保存后执行:

systemctl daemon-reload
systemctl enable --now mihomo
systemctl status mihomo --no-pager

查看运行日志:

journalctl -u mihomo -n 50 --no-pager

如果配置加载成功,Mihomo 就会在后台运行,并在系统重启后自动启动。

第四步:让终端里的工具自动使用代理

这是最关键的一步。安装 Mihomo 不代表所有程序都会自动走代理,我们先用环境变量解决绝大多数命令行工具的下载问题。

将下面内容追加到你实际使用的账号的 ~/.bashrc:

cat >> ~/.bashrc <<'EOF'

# Mihomo proxy
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export all_proxy="socks5h://127.0.0.1:7890"

export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$https_proxy"
export ALL_PROXY="$all_proxy"
EOF

source ~/.bashrc

其中 socks5h 会让域名解析也通过代理完成;HTTP 和 HTTPS 则使用本地 HTTP 代理入口。

测试代理是否生效:

curl -I -x http://127.0.0.1:7890 https://github.com

如果返回 HTTP/2 200、HTTP/2 301 等 HTTP 响应,说明请求已经通过代理成功访问目标站点。若出现 Connection refused,检查 Mihomo 是否启动、端口是否正确;若是超时或 TLS 错误,则继续排查节点与配置。

然后测试:

curl -I https://github.com
curl -I https://fnm.vercel.app

这两个命令没有显式指定代理,但会使用刚才配置的环境变量。

第五步:常见开发工具能否使用?

工具配置好环境变量后
curl、wget通常可以
Git通常可以
npm、pnpm通常可以,个别情况需单独配置
Composer通常可以
Docker 拉取镜像需要额外配置 Docker daemon 代理
apt建议单独配置代理,不能只依赖 Shell 环境变量
systemd 启动的其他服务通常不会继承你的交互式 Shell 环境变量

例如,Git 如果没有正确使用环境变量,可以显式配置:

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

取消时:

git config --global --unset http.proxy
git config --global --unset https.proxy

我建议你先别急着启用 TUN 模式

你这台是远程国内 Ubuntu 服务器,初期只需要让开发工具走本地代理端口就够了。TUN 会涉及路由和防火墙规则,配置不当可能影响 SSH 连接。

image

Clash 中文网+1

还有一个关键问题:你现在手里有没有现成的 Clash 订阅链接,或者本地 Clash 客户端正在使用的配置文件?

如果有,我们就可以继续把 Mihomo 配置完整,做到开机自启、命令行自动代理,并进一步处理 apt、Docker 等不完全受 Shell 代理控制的工具。

我

mihomo-linux-amd64-compatible-v1.19.33.gz sha256:386508bfb1c72c43b6a0eda73708ecdce82546581b0ebcb16366c53757c622b6 21.8 MB last week mihomo-linux-amd64-v1-go120-v1.19.33.gz sha256:6dfc8ad7ded705bd22f3b6fbb9b6ec9fe99c0b397c7de57229f73708ad017e4d 24.5 MB last week mihomo-linux-amd64-v1-go123-v1.19.33.gz sha256:d7dca500d0e6d6ec5ed5cbe2f0d25b40ba45657eb8c81f12f41b34043441f31f 21.7 MB last week mihomo-linux-amd64-v1-v1.19.33.deb sha256:46e1f3f34da91d3cf858c72e58558a9f463cd04837fab77584e56be121a0b8ab 21.7 MB last week mihomo-linux-amd64-v1-v1.19.33.gz sha256:8ec92e7b2fdc6b853ba00156bab7e4e965c8b0d843b8c4ac8ab98795f02ad524 21.8 MB last week mihomo-linux-amd64-v1-v1.19.33.pkg.tar.zst sha256:015895fd74bd4e255ad9631819ef54a41862f85bd9d23c0a243ee69ffdd892f6 21.1 MB last week mihomo-linux-amd64-v1-v1.19.33.rpm sha256:31b634ea29e6dedfa8cad7c4ebd38d0705c78250e7b9778f201717a9e6afade0 21.7 MB last week mihomo-linux-amd64-v1.19.33.deb sha256:3f6f31f325a392b87702241a763e124f3e684f31c2c1004cb581538eb04baf68 21.7 MB last week mihomo-linux-amd64-v1.19.33.gz sha256:132f6f3edf9a65e62f04853aed3358472e0b2b7666daa8419edfa2ddf5bb6323 21.8 MB last week mihomo-linux-amd64-v1.19.33.pkg.tar.zst sha256:82003a924402e74b4bf158d9a43fd7158ac63dd2ab6e373b0061a1dd0fd719bf 21.1 MB last week mihomo-linux-amd64-v1.19.33.rpm sha256:ad12fc233b026d12d019a477e836a86194b7164cfd0e3ffd02e969558226f24b 21.6 MB last week mihomo-linux-amd64-v2-go120-v1.19.33.gz sha256:a7f5d876fe1e92dd35b86bc18aca0f4194a315116a3b947deab531a3656525c1 24.5 MB last week mihomo-linux-amd64-v2-go123-v1.19.33.gz sha256:42132f49b8a1d214a7ff77241209e34ff85c34ae279b506c495db897a835cf12 21.6 MB last week mihomo-linux-amd64-v2-v1.19.33.deb sha256:5cc79924fc6cb43adf24b6ef0b4dddf5dba08771d8a7e337ae524f19e5f386c6 21.7 MB last week mihomo-linux-amd64-v2-v1.19.33.gz sha256:0abc5c0d5c3ec2e638d3c220c7226a094258d2e6a1713a650399db1bc5d2283b 21.8 MB last week mihomo-linux-amd64-v2-v1.19.33.pkg.tar.zst sha256:f448059303e1b704e3669082b86ec48b5a405a5564ad8ef86f591ff0ecfccfd3 21.1 MB last week mihomo-linux-amd64-v2-v1.19.33.rpm sha256:41b94a309f16867931a3adcf9bc58a76555f8be000db5597e2b198713f2fbf68 21.6 MB last week mihomo-linux-amd64-v3-go120-v1.19.33.gz sha256:30ab9f601a92bbcdce0edf4c3cad18233a8b57ca35b47db793df5ba6c024187b 24.5 MB last week mihomo-linux-amd64-v3-go123-v1.19.33.gz sha256:be965878c0f62da39bbc6eda1fa02749d203a525d02138ee5cb90610b55f243d 21.6 MB last week mihomo-linux-amd64-v3-v1.19.33.deb sha256:80ad0b345592b91fd0b470583239d9b9eb3443dd5e2a8d100efaa2b53c97b0fd 21.7 MB last week mihomo-linux-amd64-v3-v1.19.33.gz sha256:c051c5fbaedd2c091de51aef236a1a958c453417a347102074bedc38c719f9cf 21.8 MB last week mihomo-linux-amd64-v3-v1.19.33.pkg.tar.zst sha256:da97aab288ab322328efb4eea4335d12d9463ddb3bbe356b056d0bb300437cb4 21.1 MB last week mihomo-linux-amd64-v3-v1.19.33.rpm

他给了这么多,我都不知道选谁

AI 助手

你这台是 Ubuntu 服务器,优先选 mihomo-linux-amd64-v1-v1.19.33.deb,前提是服务器为常见的 x86_64 架构。.deb 是 Debian/Ubuntu 的软件包格式,安装和卸载都比较方便。

不过,你列出的版本有 v1、v2、v3,它们是针对不同 CPU 指令集优化的构建,不能仅凭 Ubuntu 版本判断该选哪一个。

怎么选?

文件建议
mihomo-linux-amd64-v1-v1.19.33.deb推荐默认选它,兼容性优先
mihomo-linux-amd64-v1-v1.19.33.gz与上面类似,但需要手动安装
mihomo-linux-amd64-v1.19.33.deb不带 v1 后缀的标准构建,也是可考虑的选择
...-compatible...gz兼容性导向的压缩包,可作为备用
v2、v3需要确认 CPU 支持对应指令集后再选
v1-go120、v1-go123针对特定 Go 版本构建的变体,一般无需优先考虑
.rpm、.pkg.tar.zst不是 Ubuntu 的首选格式

安装前,先执行这条命令

uname -m

如果输出 x86_64,再执行:

lscpu | grep -E 'Architecture|Model name|Flags'

把结果发给我,我可以帮你判断是否适合使用 v2 或 v3。如果你不想折腾指令集兼容性,直接用 mihomo-linux-amd64-v1-v1.19.33.deb 就可以作为默认选择。

下载完成后,可以先校验文件 SHA-256,确保与发布页提供的校验值一致,再安装:

sha256sum mihomo-linux-amd64-v1-v1.19.33.deb
sudo apt install ./mihomo-linux-amd64-v1-v1.19.33.deb

注意:安装 .deb 只会安装程序,不会自动帮你配置代理订阅、监听端口或开机自启服务,这些还需要继续配置。

我

Architecture: x86_64 Model name: Intel(R) Xeon(R) Platinum 8255C CPU @ 2.50GHz Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch pti fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 arat avx512_vnni

AI 助手

你的服务器配置很不错,是 Intel Xeon Platinum 8255C,支持 AVX2 和 AVX-512。不过,不能仅凭支持 AVX-512 就断定应该选 Mihomo 的 v3 构建,因为它们对应的具体指令集要求需要以项目的构建说明为准。

我建议你这样选:

  • 首选: mihomo-linux-amd64-v1-v1.19.33.deb,兼容性优先。
  • 备选: mihomo-linux-amd64-v1.19.33.deb,标准 AMD64 构建。
  • 暂时不必选 v2、v3 或 Go 特定版本,代理服务的性能通常也不值得为此冒兼容风险。

直接安装

假设你已经把 .deb 上传到当前目录:

sudo apt install ./mihomo-linux-amd64-v1-v1.19.33.deb

安装后检查:

mihomo -v
command -v mihomo
systemctl status mihomo --no-pager

注意,安装包不一定会自动创建并启用 systemd 服务。如果最后一条显示找不到服务,也不代表安装失败。

接下来建议先确认安装包的实际行为,再配置订阅和后台服务,避免重复创建服务或覆盖安装包自带的配置。你把这三条命令的输出发给我,我就能继续带你配置。

我

Mihomo Meta v1.19.33 linux amd64 with go1.26.10 Wed Oct 21 16:39:55 UTC 2026 Use tags: with_gvisor /usr/bin/mihomo ○ mihomo.service - mihomo Daemon, Another Clash Kernel. Loaded: loaded (/usr/lib/systemd/system/mihomo.service; disabled; preset: enabled) Active: inactive (dead) Docs: https://wiki.metacubex.one

AI 助手

很好,Mihomo 已经安装成功了,而且安装包自带了 systemd 服务,所以不需要再手动创建 /etc/systemd/system/mihomo.service。

你现在的状态是:

  • Mihomo Meta v1.19.33:程序正常安装。
  • /usr/bin/mihomo:系统安装路径正确。
  • mihomo.service:服务已注册,但尚未启动(inactive (dead))。
  • disabled:尚未设置开机自启。

接下来先别急着启动服务,我们需要先确认它默认从哪里读取配置,以及服务使用什么账号运行,避免配置文件路径不对导致启动失败。

先执行这 3 条命令

# 1. 查看安装包自带的服务配置
systemctl cat mihomo

# 2. 查看安装包安装了哪些配置文件
dpkg -L mihomo | grep -E 'config|systemd|yaml|yml'

# 3. 查看是否已有配置文件
ls -lah /etc/mihomo /etc/mihomo* 2>/dev/null

把输出贴给我。

接下来我们会按实际安装情况配置,而不是盲目套用网上的教程。目标是:

  1. 把你的 Clash 订阅配置放到正确的位置。
  2. 启动 Mihomo,并设置开机自启。
  3. 只监听 127.0.0.1,不把代理端口暴露到公网。
  4. 让 curl、Git、npm、pnpm 等命令默认使用代理。
  5. 再单独处理 Docker 和 apt,让服务器后续安装软件方便得多。
我

dpkg -L mihomo | grep -E 'config|systemd|yaml|yml' /usr/lib/systemd /usr/lib/systemd/system /usr/lib/systemd/system/mihomo.service /usr/lib/systemd/system/[email protected] /etc/mihomo/config.yaml ubuntu@VM-0-15-ubuntu:~$ ls -lah /etc/mihomo /etc/mihomo* 2>/dev/null /etc/mihomo: total 20K drwxr-xr-x 2 root root 4.0K Oct 28 22:34 . drwxr-xr-x 117 root root 12K Oct 28 22:34 .. -rw-r--r-- 1 root root 185 Oct 22 00:39 config.yaml

/etc/mihomo: total 20K drwxr-xr-x 2 root root 4.0K Oct 28 22:34 . drwxr-xr-x 117 root root 12K Oct 28 22:34 .. -rw-r--r-- 1 root root 185 Oct 22 00:39 config.yaml

AI 助手

很好,已经确认安装包默认配置文件是 /etc/mihomo/config.yaml,而且自带了普通服务和模板服务。我们就沿用它自带的服务,不需要自己创建 service 文件。

目前这个配置文件只有 185 字节,很可能是默认示例配置,还不是你的订阅配置。

第一步:查看现有配置和服务参数

请执行:

sudo cat /etc/mihomo/config.yaml

再执行:

systemctl cat mihomo

以及:

systemctl cat [email protected]

这几条命令不会启动服务。如果配置文件中有订阅链接、密码、UUID 或节点密钥,请先打码再发给我。

第二步:准备你的 Clash 配置

你需要提供一份可用的 Mihomo/Clash 配置,通常有两种来源:

  • 订阅链接:在你现有的代理客户端或服务商后台获取,然后在电脑上下载生成的 YAML 配置文件。
  • 现有配置文件:如果你电脑上已经有 Clash 配置,可以直接使用它。

建议先在电脑上准备好配置文件,再通过 WinSCP 上传到服务器,覆盖 /etc/mihomo/config.yaml。上传前先备份原文件:

sudo cp /etc/mihomo/config.yaml \
  /etc/mihomo/config.yaml.bak

不要把订阅链接直接公开发出来,它可能包含你的账户凭据。

第三步:接下来要实现的效果

配置完成后,我们会启动服务:

sudo systemctl enable --now mihomo

然后验证服务是否正常:

sudo systemctl status mihomo --no-pager
sudo journalctl -u mihomo -n 50 --no-pager

等服务正常运行后,再设置命令行代理环境变量,并测试 GitHub、Vercel、npm 等网站的访问情况。

你先把前面三条命令的输出发来即可。 我们先确认服务实际使用的配置路径和运行用户,再进行下一步,避免权限或配置路径不一致导致启动失败。

我

sudo cat /etc/mihomo/config.yaml mixed-port: 7890

dns: enable: true ipv6: true enhanced-mode: fake-ip fake-ip-filter: - "*" - "+.lan" - "+.local" nameserver: - system

rules:

  • MATCH,DIRECTubuntu@VM-0-15-ubuntu:~$ systemctl cat mihomo

/usr/lib/systemd/system/mihomo.service

[Unit] Description=mihomo Daemon, Another Clash Kernel. Documentation=https://wiki.metacubex.one After=network.target nss-lookup.target network-online.target

[Service] Type=simple CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE ExecStart=/usr/bin/mihomo -d /etc/mihomo ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=10 LimitNOFILE=infinity

[Install] WantedBy=multi-user.target ubuntu@VM-0-15-ubuntu:~$ systemctl cat [email protected]

/usr/lib/systemd/system/[email protected]

[Unit] Description=mihomo Daemon, Another Clash Kernel. Documentation=https://wiki.metacubex.one After=network.target nss-lookup.target network-online.target

[Service] Type=simple CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SYS_TIME CAP_SYS_PTRACE CAP_DAC_READ_SEARCH CAP_DAC_OVERRIDE ExecStart=/usr/bin/mihomo -d /etc/mihomo ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=10 LimitNOFILE=infinity

[Install] WantedBy=multi-user.target

AI 助手

你现在的 Mihomo 已经安装好了,systemd 服务也有了。问题在于:当前配置文件还没有代理节点,所以即使启动成功,也无法真正代理访问 GitHub 或 *.vercel.app。

你目前的配置里有:

mixed-port: 7890

这表示 HTTP 和 SOCKS5 代理共用 7890 端口。但末尾的:

rules:
  - MATCH,DIRECT

意味着所有流量都直接连接,不经过代理。

我们按步骤处理,暂时不用修改 systemd 服务文件。

第一步:准备可用的节点配置

你需要一份 Mihomo 能识别的 Clash YAML 配置,其中包含 proxies(代理节点)或订阅转换后生成的节点列表。

推荐做法:

  1. 在自己的电脑上,用你已有的代理客户端导入订阅。
  2. 找到导出配置的功能,导出为 Clash/Mihomo YAML 格式。
  3. 通过 WinSCP 将文件上传到服务器,例如先放到你的 Ubuntu 用户家目录下,命名为 mihomo.yaml。

注意:普通订阅链接不一定能直接作为 Mihomo 配置文件使用;如果导出的 YAML 中只有节点而没有规则,也没关系,后面可以补充。

订阅链接、节点密码和 UUID 都是敏感信息,不要直接发出来。

第二步:上传后再替换配置

假设你把文件上传到了 /home/ubuntu/mihomo.yaml。先确认文件存在:

ls -lh ~/mihomo.yaml

然后备份当前配置,再替换:

sudo cp /etc/mihomo/config.yaml /etc/mihomo/config.yaml.bak
sudo install -o root -g root -m 600 ~/mihomo.yaml /etc/mihomo/config.yaml

这里先保留备份,方便配置出错时恢复。替换后还需要检查配置是否包含正确的监听端口和节点规则。

第三步:确保代理端口只对本机开放

检查新配置中是否有下面几项:

mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1

如果已经存在对应配置,就修改原有项,不要重复添加。这样只有服务器本机能访问代理端口,不会把代理直接暴露到公网。

第四步:检查配置并启动服务

先检查 YAML 配置能否通过 Mihomo 的校验:

sudo mihomo -t -d /etc/mihomo

如果提示配置有效,再启动服务:

sudo systemctl enable --now mihomo

查看运行状态:

sudo systemctl status mihomo --no-pager

如果启动失败,查看最近的日志:

sudo journalctl -u mihomo -n 80 --no-pager

第五步:测试代理是否真的可用

确认服务正常后,执行:

curl -I -x http://127.0.0.1:7890 https://github.com

如果返回 HTTP 状态码,例如 200、301 或 302,说明这次请求已成功通过代理访问目标站点。若出现连接拒绝、超时或代理错误,就根据错误信息继续排查。

先完成第一步即可。 上传 YAML 后,先把下面命令的输出发给我,我可以帮你检查配置结构,再决定是否需要调整:

grep -nE '^(mixed-port|port|socks-port|bind-address|allow-lan|mode|proxy-groups|proxies|rules|dns):|^[[:space:]]+- name:' ~/mihomo.yaml | head -80

这条命令只显示配置中的关键字段和节点名称,不会直接打印订阅密钥;如果节点名称里包含个人信息,发送前也可以自行打码。

我
sudo install -o root -g root -m 600 ~/mihomo.yaml /etc/mihomo/config.yaml

这是啥意思,为啥是 install?

AI 助手

这里的 install 不是指安装软件,而是 Linux 自带的一个文件操作命令。它可以复制文件,同时设置目标文件的所有者、所属组和权限。

sudo install -o root -g root -m 600 ~/mihomo.yaml /etc/mihomo/config.yaml

拆开解释:

参数含义
sudo以管理员权限执行
install复制文件并设置属性
-o root设置文件所有者为 root
-g root设置文件所属组为 root
-m 600设置文件权限为 600
~/mihomo.yaml源文件,即你上传的配置
/etc/mihomo/config.yaml目标文件,即 Mihomo 实际读取的配置

为什么用 install,而不是 cp?

其实用 cp 也可以,只是需要分开执行:

sudo cp ~/mihomo.yaml /etc/mihomo/config.yaml
sudo chown root:root /etc/mihomo/config.yaml
sudo chmod 600 /etc/mihomo/config.yaml

这三条命令的效果基本等同于前面的 install 命令。

为什么权限设置为 600?

Linux 文件权限可以这样理解:

  • 6:读写权限(rw-)
  • 0:没有任何权限(---)

因此 600 表示:

-rw-------  root root  config.yaml

只有 root 用户能读取和修改该文件,其他用户不能访问。

这么设置是为了保护配置中的代理节点信息、密码和订阅相关凭据。 不过,前提是 Mihomo 服务以 root 身份运行;你当前的 systemd 配置没有指定 User=,通常会以 root 运行,因此这种权限设置适用。

另外,install 会直接覆盖目标文件,不会自动备份。所以执行前先运行:

sudo cp /etc/mihomo/config.yaml /etc/mihomo/config.yaml.bak

就比较稳妥了。

我

sudo mihomo -t -d /etc/mihomo INFO[2026-10-28T22:43:57.467441373+08:00] Start initial configuration in progress INFO[2026-10-28T22:43:57.469215111+08:00] Geodata Loader mode: memconservative INFO[2026-10-28T22:43:57.469246618+08:00] Geosite Matcher implementation: succinct INFO[2026-10-28T22:43:57.469640277+08:00] Can't find MMDB, start download

AI 助手

这几行暂时看不出配置错误。关键是最后一行:

Can't find MMDB, start download

意思是:Mihomo 没找到本地的 MMDB 地理位置数据库,正在尝试下载。

MMDB 是用于 IP 地址地理位置查询的数据文件,某些规则或功能会用到它。首次启动时尝试下载属于正常现象,但你的服务器之前访问部分国外站点受限,所以这里可能会下载失败。

现在先做什么?

先等几秒钟,看看命令是否结束,以及有没有出现后续报错。

  • 如果最终显示 configuration file ... test is successful 之类的成功信息,就可以继续启动服务。
  • 如果卡住很久或出现下载失败的报错,把后续完整输出发给我。

也可以按 Ctrl+C 结束当前测试,再查看目录内容:

ls -lah /etc/mihomo

暂时不要急着启动服务,也不要手动下载不明来源的 MMDB 文件。 我们先确认配置校验是否通过。如果确实是数据库下载失败,再根据具体报错处理。

我

ERRO[2026-10-28T22:45:27.470894526+08:00] can't initial GeoIP: can't download MMDB: context deadline exceeded ERRO[2026-10-28T22:45:27.470940894+08:00] rules[513] [GEOIP,CN,DIRECT] error: can't download MMDB: context deadline exceeded

AI 助手

这次报错的原因已经明确:Mihomo 在初始化配置时,需要下载 GeoIP 数据库(MMDB),但下载超时了。

can't initial GeoIP: can't download MMDB: context deadline exceeded
rules[513] [GEOIP,CN,DIRECT] error: can't download MMDB: context deadline exceeded

其中:

  • GeoIP / MMDB:用于判断 IP 地址所属的国家或地区。
  • rules[513] [GEOIP,CN,DIRECT]:第 514 条规则要求将中国 IP 的流量直接连接,因此需要 GeoIP 数据库。
  • context deadline exceeded:下载操作超过了等待时限。

这很可能正好碰上了你最初遇到的问题:服务器无法顺利访问某些国外资源,而 Mihomo 初始化时又需要先下载数据,导致代理尚未启动就卡住了。

推荐解决方案:让 Mihomo 使用国内可访问的 Geo 数据源

Mihomo 官方文档支持通过 geox-url 自定义地理数据库下载地址。

image

mihomo docs+1

你可以先尝试修改配置,不需要重新安装 Mihomo。

1. 编辑配置文件

sudo nano /etc/mihomo/config.yaml

在文件现有内容的顶层添加下面几项,注意不要放进 dns: 或 rules: 内部:

geodata-mode: true
geo-auto-update: true
geo-update-interval: 72

geox-url:
  geoip: "https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
  geosite: "https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
  mmdb: "https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/country.mmdb"

这里:

  • geodata-mode: true:使用 .dat 格式的 Geo 数据。
  • geo-auto-update: true:允许自动更新。
  • geo-update-interval: 72:每 72 小时更新一次。
  • geox-url:指定 Geo 数据下载地址。

这些地址来自 Mihomo 生态使用的 MetaCubeX 规则数据仓库,通过 jsDelivr CDN 分发。

image

mihomo docs+1

保存方法:按 Ctrl+O,回车,再按 Ctrl+X。

2. 重新测试配置

sudo mihomo -t -d /etc/mihomo

如果成功,应该不再因为下载 MMDB 超时而报错。

3. 如果还是下载失败

不要反复尝试启动服务。先检查 CDN 是否可访问:

curl -IL --max-time 15 \
  https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/country.mmdb

如果返回 200 OK,说明该地址大概率可访问;如果超时或连接失败,可以改为在自己的电脑上下载这些数据文件,再通过 WinSCP 上传到服务器。

提醒: 如果你上传的完整配置本身已经定义了 geodata-mode 或 geox-url,应修改原有配置,而不是重复添加。先按上面操作测试,之后把新的测试输出发给我,我们再继续启动服务。

我

sudo mihomo -t -d /etc/mihomo INFO[2026-10-28T22:47:34.487831509+08:00] Start initial configuration in progress INFO[2026-10-28T22:47:34.489511036+08:00] Geodata Loader mode: memconservative INFO[2026-10-28T22:47:34.489530995+08:00] Geosite Matcher implementation: succinct INFO[2026-10-28T22:47:34.489980300+08:00] Can't find GeoIP.dat, start download

INFO[2026-10-28T22:48:21.560880741+08:00] Download GeoIP.dat finish INFO[2026-10-28T22:48:21.560947441+08:00] Load GeoIP rule: cn INFO[2026-10-28T22:48:21.571063726+08:00] Finished initial GeoIP rule cn => DIRECT, records: 10011 INFO[2026-10-28T22:48:21.571321395+08:00] Finished initial GeoIP rule cn => dns.fallback-filter.geoip, records: 10011 INFO[2026-10-28T22:48:21.571356604+08:00] Initial configuration complete, total time: 47083ms configuration file /etc/mihomo/config.yaml test is successful

AI 助手

很好,配置校验已经通过了! 最关键的是最后两行:

Initial configuration complete, total time: 47083ms
configuration file /etc/mihomo/config.yaml test is successful

而且 GeoIP.dat 已经成功下载,说明你设置的 Geo 数据源可以正常访问。

接下来启动 Mihomo 服务。

1. 启动并设置开机自启

sudo systemctl enable --now mihomo

这条命令会同时完成两件事:

  • enable:设置服务器重启后自动启动 Mihomo。
  • --now:立即启动 Mihomo,不用等下次重启。

2. 检查服务状态

sudo systemctl status mihomo --no-pager

正常情况下应该看到:

Active: active (running)

然后确认代理端口正在监听:

sudo ss -lntp | grep 7890

注意,理想情况下应该监听 127.0.0.1:7890,而不是 0.0.0.0:7890,避免代理端口暴露到公网。

如果启动失败,执行:

sudo journalctl -u mihomo -n 50 --no-pager

把报错发给我即可。

3. 测试代理能否访问 GitHub

确认服务正常后执行:

curl -I --max-time 20 \
  -x http://127.0.0.1:7890 \
  https://github.com

不过这里还有一个关键点:你的配置必须有可用的代理节点,并且规则要把目标流量交给代理节点或代理组。 如果仍然是 MATCH,DIRECT,即使 Mihomo 服务运行正常,请求也不会通过代理节点。

先完成启动和端口检查,再把这两条命令的输出发给我:

sudo systemctl status mihomo --no-pager
sudo ss -lntp | grep 7890

我们确认服务真正运行后,再验证代理链路。

我

ubuntu@VM-0-15-ubuntu:~$ sudo systemctl status mihomo --no-pager ● mihomo.service - mihomo Daemon, Another Clash Kernel. Loaded: loaded (/usr/lib/systemd/system/mihomo.service; enabled; preset: enabled) Active: active (running) since Wed 2026-10-28 22:56:22 CST; 8s ago Invocation: 6defda40e4bc4f9a9d72becbfc53d412 Docs: https://wiki.metacubex.one Main PID: 813265 (mihomo) Tasks: 9 (limit: 2876) Memory: 16.9M (peak: 17M) CPU: 575ms CGroup: /system.slice/mihomo.service └─813265 /usr/bin/mihomo -d /etc/mihomo

Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.931811229+08:00" level=info msg="Finished initial GeoIP rule cn => dns.fallback-f…ords: 10011" Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.931841973+08:00" level=info msg="Initial configuration complete, total time: 14ms" Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.932137204+08:00" level=info msg="RESTful API listening at: 127.0.0.1:9090" Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.947303398+08:00" level=info msg="Sniffer is closed" Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.947479891+08:00" level=info msg="Mixed(http+socks) proxy listening at: 127.0.0.1:7890" Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.947575968+08:00" level=info msg="Start initial compatible provider TapFog" Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.947594761+08:00" level=info msg="Start initial compatible provider 故障转移" Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.947626920+08:00" level=info msg="Start initial compatible provider default" Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.947601364+08:00" level=info msg="Start initial compatible provider 自动选择" Oct 28 22:56:22 VM-0-15-ubuntu mihomo[813265]: time="2026-10-28T22:56:22.952469256+08:00" level=info msg="[GEO] last update time 2026-10-28 22:48:21.56030…7 +0800 CST" Hint: Some lines were ellipsized, use -l to show in full. ubuntu@VM-0-15-ubuntu:~$ sudo ss -lntp | grep 7890 LISTEN 0 4096 127.0.0.1:7890 0.0.0.0:* users:(("mihomo",pid=813265,fd=3))

AI 助手

很好,Mihomo 已经正常运行,而且目前的监听方式符合我们的安全预期。

从输出看:

  • Active: active (running):服务已经启动。
  • enabled:已设置开机自启。
  • 127.0.0.1:7890:HTTP 和 SOCKS 代理仅监听服务器本机,没有直接暴露到公网。
  • 127.0.0.1:9090:RESTful API 也只监听本机,比较安全。
  • TapFog、故障转移、自动选择 等代理提供者已经开始初始化。

接下来需要确认的是:代理节点能否真正连通,以及请求是否确实经过代理。

第一步:测试 GitHub

请执行:

curl -I --max-time 20 \
  -x http://127.0.0.1:7890 \
  https://github.com

如果返回 HTTP/2 200、HTTP/2 301 等 HTTP 状态码,说明请求成功了。若出现 timeout、connection refused 或 503,则需要进一步排查。

第二步:测试你最初遇到的问题

再执行:

curl -I --max-time 20 \
  -x http://127.0.0.1:7890 \
  https://fnm.vercel.app

这次直接测试 fnm.vercel.app,比只测试 GitHub 更有针对性。

第三步:让命令行工具默认走代理

等上面测试成功后,可以把代理环境变量写入 Ubuntu 用户的 ~/.bashrc,让 Git、npm、pnpm、Composer 等支持环境变量的工具默认使用代理。

先不要急着配置,先把上面两条 curl 命令的结果发给我。如果代理链路没问题,我们再统一配置环境变量,并区分普通用户与 sudo、apt 等场景。

AI 助手

成功了!🎉 你的 Mihomo 代理已经能够正常访问最初受限的 fnm.vercel.app。

这两行是关键证据:

HTTP/1.1 200 Connection established
HTTP/2 308
  • 200 Connection established:curl 已经通过本地代理建立了 HTTPS 隧道。
  • HTTP/2 308:目标网站返回永久重定向,指向 https://github.com/Schniz/fnm。这是正常响应,不是错误。

现在可以配置命令行工具默认使用代理了。

1. 为 Ubuntu 用户配置代理环境变量

执行:

cat >> ~/.bashrc <<'EOF'

# Mihomo local proxy
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export all_proxy="socks5h://127.0.0.1:7890"
export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$https_proxy"
export ALL_PROXY="$all_proxy"
EOF

立即让配置生效:

source ~/.bashrc

这会让当前 Ubuntu 用户后续打开的 Bash 终端默认使用代理。HTTP、HTTPS 请求走 HTTP 代理,支持 SOCKS5 的工具也可以使用 all_proxy。

2. 验证环境变量是否生效

env | grep -i proxy

然后直接访问,不再手动指定 -x:

curl -I --max-time 20 https://fnm.vercel.app

如果仍然返回 HTTP/2 308,说明环境变量生效了。

3. 使用时需要注意

  • Git、npm、pnpm、Composer:通常可以识别这些环境变量。
  • sudo 命令:默认可能清除代理环境变量。例如 sudo curl ... 不一定会使用代理。
  • apt:如果之后需要让 apt update 或 apt install 走代理,建议单独配置 apt,而不是直接假设它会读取当前 Shell 的环境变量。
  • 服务器重启后:Mihomo 会自动启动;~/.bashrc 也会在交互式 Bash 中加载。

另外,你现在的代理只监听 127.0.0.1,不要为了让命令行工具使用代理而将它改成监听公网地址。这样既能解决下载问题,也避免把代理服务暴露给其他人。

我

pnpm is running through Node.js because the script that installs its native binary was skipped. Reinstall pnpm with its build scripts allowed to run the binary directly.

这是什么限制么

AI 助手

是的,这是一个安装脚本执行限制,不一定是代理问题,也不代表 pnpm 无法正常工作。

这条提示的意思是:

pnpm 的原生二进制安装脚本被跳过了,所以当前 pnpm 只能通过 Node.js 运行脚本,而不能直接使用它的原生二进制程序。

pnpm 的某些版本会提供原生二进制,以减少启动开销。当前这种情况通常仍然可以使用 pnpm,只是可能无法使用原生版本带来的性能优势。

结合你之前服务器上的 pnpm 环境,需要先区分:你现在使用的是通过 npm install -g pnpm 安装的 pnpm,还是由 Corepack 管理的 pnpm,以及提示究竟来自全局安装还是项目依赖安装。

先检查是谁跳过了安装脚本

你之前的服务器使用过 pnpm 11。pnpm 本身、Corepack、npm 和项目依赖管理器都可能参与安装过程,因此先别急着重装。

在出现提示的同一个终端里执行:

which pnpm
pnpm --version
node --version
npm config get ignore-scripts

再执行:

pnpm config get ignore-scripts

如果是在项目目录里执行 pnpm install 时出现的提示,也请告诉我。

常见原因

  • 安装时跳过了构建脚本:包管理器或安全配置阻止了原生二进制安装脚本运行。
  • 主动禁用了脚本:例如 npm 配置了 ignore-scripts=true,或 pnpm 的构建脚本审批策略没有放行相关脚本。
  • pnpm 的安装来源不同:通过 Corepack 管理的版本和 npm install -g pnpm 安装的版本,处理方式可能不同。

不建议为了消除这条提示就直接全局放开所有依赖的安装脚本。先确认具体原因,再只允许必要的脚本执行。

把上述命令输出发来,我就能进一步判断该如何处理。

我

我用的是 corepack 装的 pnpm,所以才有这个提示?

AI 助手

有可能和 Corepack 有关,但不是因为 Corepack 本身禁止了 pnpm 的原生二进制。

Corepack 主要负责下载、选择和运行指定版本的 pnpm。你看到的提示更可能是:当前安装的 pnpm 版本没有成功安装它的原生二进制,或者安装脚本被跳过了。

需要区分两件事:

  • Corepack:管理 pnpm 版本并启动它。
  • pnpm 的安装脚本:负责安装或准备原生二进制;脚本被跳过时,pnpm 可能退回 Node.js 运行方式。

先在服务器执行:

corepack pnpm --version
corepack pnpm config get ignore-scripts
npm config get ignore-scripts

另外,如果你是在项目里执行 pnpm install 时看到这条提示,请检查 package.json 中是否指定了 pnpm 版本,以及项目是否配置了构建脚本审批策略。

暂时不需要卸载 Corepack 或重装 pnpm。 把输出发给我,我可以继续判断是版本自身的行为,还是安装脚本策略导致的。

我

corepack pnpm --version corepack pnpm config get ignore-scripts npm config get ignore-scripts 10.33.0 undefined false

AI 助手

从这三个结果来看,目前没有证据表明是 Corepack 或 ignore-scripts 导致的。

命令输出说明
corepack pnpm --version10.33.0当前通过 Corepack 运行的是 pnpm 10.33.0
corepack pnpm config get ignore-scriptsundefinedpnpm 没有通过该配置项读到明确值,不代表脚本被禁用
npm config get ignore-scriptsfalsenpm 全局配置没有禁用安装脚本

之前看到的提示,核心是 pnpm 的原生二进制安装步骤被跳过了,但目前还不能确定具体原因。

建议先执行下面两条命令,确认当前实际调用的 pnpm,以及 Corepack 的管理方式:

which pnpm
pnpm --version

再查看项目是否指定了 pnpm 版本:

node -p "require('./package.json').packageManager"

最后一条需要在项目根目录执行;如果报错或输出 undefined,说明项目可能没有设置这个字段。

暂时不建议卸载 Corepack 或重新安装 pnpm。 你现在使用的是 pnpm 10.33.0,而提示可能与具体版本及其原生二进制安装机制有关。拿到上述输出后,就能进一步判断是版本管理、安装方式,还是安装脚本审批的问题。