Ubuntu 服务器部署 Mihomo 代理完整记录
前言
我有一台部署在阿里云上的 Ubuntu 服务器。平时在服务器上下载 GitHub、Google、一些海外源站资源时,经常会遇到访问慢、连接失败、SSL 握手异常等问题。
在本地 Windows 上,这类问题通常很好解决:安装 Clash Verge Rev,导入订阅,打开系统代理即可。

但远程 Ubuntu 服务器通常没有图形化界面,不能像 Windows 一样直接使用 Clash Verge 的桌面 UI。服务器真正需要的是 Clash Verge 背后的代理内核,也就是 Mihomo。

这篇文章记录我在 Ubuntu 服务器上部署 Mihomo 的完整过程:安装内核、复用 Windows Clash Verge 的订阅配置、注册 systemd 后台服务,并让 curl、wget、git、npm 等命令走代理。
部署完成后的目标效果是:
curl https://www.google.com -I -L可以正常返回:
HTTP/2 200
安装 Mihomo
先在服务器上创建一个临时安装目录:
mkdir -p ~/mihomocd ~/mihomo下载 Mihomo 的 Linux amd64 版本:
wget https://github.com/MetaCubeX/mihomo/releases/download/v1.19.30/mihomo-linux-amd64-compatible-v1.19.30.gz解压、赋予执行权限,并移动到系统命令目录:
gzip -d mihomo-linux-amd64-compatible-v1.19.30.gzchmod +x mihomo-linux-amd64-compatible-v1.19.30sudo mv mihomo-linux-amd64-compatible-v1.19.30 /usr/local/bin/mihomo检查是否安装成功:
mihomo -v如果能看到 Mihomo 的版本信息,就说明二进制程序已经安装成功。

准备配置文件
Mihomo 本身只是代理内核,还需要一份 Clash/Mihomo 格式的配置文件,里面包含节点、代理组和规则。
先创建配置目录:
mkdir -p ~/.config/mihomo如果订阅链接可以在服务器上直接访问,可以这样下载:
wget -O ~/.config/mihomo/config.yaml "你的订阅链接"但我这里遇到的问题是:订阅站在服务器上访问不稳定,wget 或 curl 会卡住,甚至出现 SSL 连接失败。


因此更稳的方式是:直接复用 Windows 上 Clash Verge Rev 已经生成好的配置文件。
首先在 Clash Verge Rev 的订阅页面里,找到正在使用的订阅配置。

配置文件通常位于 Windows 的这个目录:
C:\Users\你的用户名\AppData\Roaming\io.github.clash-verge-rev.clash-verge-rev\profiles
在这个目录中找到对应的 .yaml 文件。判断标准是文件里应该有类似字段:
proxies:proxy-groups:rules:然后在 Windows PowerShell 里使用 scp 上传到服务器:
scp "C:\Users\你的用户名\AppData\Roaming\io.github.clash-verge-rev.clash-verge-rev\profiles\你的配置文件名称.yaml" 用户名@你的服务器IP:/home/work/.config/mihomo/config.yaml这里的 scp 是 secure copy,基于 SSH 协议进行远程文件复制,和 ssh 使用同一套账号密码或密钥。
上传完成后,在服务器上检查文件:
ls -lh ~/.config/mihomo/config.yamlhead -n 20 ~/.config/mihomo/config.yaml如果能看到 proxies、proxy-groups、rules 等字段,说明配置文件可用。

手动启动测试
先以前台方式启动 Mihomo:
mihomo -d ~/.config/mihomo启动后,如果看到类似下面的日志,说明本地代理端口已经起来了:
RESTful API listening at: 127.0.0.1:9090Mixed(http+socks) proxy listening at: [::]:7890
有些节点可能会出现测速失败,例如:
failed to get the second response from http://www.gstatic.com/generate_204这不一定代表 Mihomo 启动失败。只要 7890 端口已经监听,就可以继续测试代理。
保持当前 SSH 窗口不关闭,另开一个 SSH 窗口执行:
curl -x http://127.0.0.1:7890 https://www.google.com -I -L如果返回:
HTTP/2 200说明服务器已经可以通过 Mihomo 访问海外网站。

注册为 systemd 后台服务
手动启动适合测试,但不能长期使用。测试通过后,可以把 Mihomo 注册成 systemd 服务,让它后台运行并开机自启。
先按 Ctrl + C 停掉前台运行的 Mihomo,然后创建服务文件:
sudo nano /etc/systemd/system/mihomo.service写入以下内容:
[Unit]Description=Mihomo Proxy ServiceAfter=network.target
[Service]Type=simpleUser=workExecStart=/usr/local/bin/mihomo -d /home/work/.config/mihomoRestart=on-failureRestartSec=5
[Install]WantedBy=multi-user.target这里要注意两处:
User=work要换成你的服务器用户名。/home/work/.config/mihomo也要和你的实际用户目录一致。
nano 保存退出方式:
Ctrl + O 保存Enter 确认文件名Ctrl + X 退出
然后重新加载 systemd 配置并启动服务:
sudo systemctl daemon-reloadsudo systemctl enable mihomosudo systemctl start mihomosudo systemctl status mihomo如果状态里看到:
Active: active (running)说明 Mihomo 已经作为后台服务运行。

让命令行下载走代理
Mihomo 启动后,只是本地开了代理端口。要让命令行工具真正使用这个代理,还需要设置环境变量。
当前 SSH 窗口临时生效:
export http_proxy=http://127.0.0.1:7890export https_proxy=http://127.0.0.1:7890export all_proxy=socks5://127.0.0.1:7890设置后,curl、wget、git clone 等命令会优先走代理。此时测试不需要再手动加 -x:
curl https://www.google.com -I -L返回 HTTP/2 200 就说明当前 shell 已经成功走代理。

需要注意:上面的 export 只对当前 SSH 窗口有效。关闭窗口或重新登录后,环境变量会消失,但 Mihomo 后台服务仍然在运行。
也就是说,重新登录后:
curl -x http://127.0.0.1:7890 https://www.google.com -I -L仍然可以访问,因为手动指定了代理。
但:
curl https://www.google.com -I -L可能无法访问,因为新 shell 没有设置代理环境变量。
如果希望每次登录后自动生效,需要把环境变量写入 shell 配置文件。
我使用的是 zsh,所以写入 ~/.zshrc:
echo 'export http_proxy=http://127.0.0.1:7890' >> ~/.zshrcecho 'export https_proxy=http://127.0.0.1:7890' >> ~/.zshrcecho 'export all_proxy=socks5://127.0.0.1:7890' >> ~/.zshrcsource ~/.zshrc如果你使用的是 Ubuntu 默认 bash,则应该写入 ~/.bashrc:
echo 'export http_proxy=http://127.0.0.1:7890' >> ~/.bashrcecho 'export https_proxy=http://127.0.0.1:7890' >> ~/.bashrcecho 'export all_proxy=socks5://127.0.0.1:7890' >> ~/.bashrcsource ~/.bashrc常用工具的单独配置
通常情况下,只要设置了 http_proxy、https_proxy、all_proxy,大多数命令行工具都会自动使用代理。
但有些工具也可以写入自己的全局配置。这样即使没有设置 shell 环境变量,它们也会走代理。
Git:
git config --global http.proxy http://127.0.0.1:7890git config --global https.proxy http://127.0.0.1:7890npm:
npm config set proxy http://127.0.0.1:7890npm config set https-proxy http://127.0.0.1:7890pip 单次使用:
pip install 包名 --proxy http://127.0.0.1:7890这里要区分临时和永久:
export http_proxy=... 临时,除非写入 ~/.zshrc 或 ~/.bashrcgit config --global ... 永久,写入 ~/.gitconfignpm config set ... 永久,写入 npm 用户配置pip install --proxy ... 单次临时,只对这一条命令有效我的建议是:先把环境变量写进 ~/.zshrc 或 ~/.bashrc。如果之后发现某个工具不读取环境变量,再给这个工具单独配置代理。
常见问题
1. 订阅链接在服务器上下载失败
如果使用:
wget -O ~/.config/mihomo/config.yaml "你的订阅链接"出现 SSL 连接失败、卡住、无响应等情况,可以优先从 Windows Clash Verge Rev 的配置目录中复制已经生成好的 YAML 文件,再用 scp 上传。
这样可以绕过服务器无法访问订阅站的问题。
2. HTTP/1.1 200 Connection established 是不是成功?
这表示 curl 已经连上本地代理,并成功建立 HTTPS 隧道。但最好继续观察后续是否有:
HTTP/2 200或者用:
curl -x http://127.0.0.1:7890 https://api.github.com如果能返回 GitHub API 的 JSON 内容,就说明代理可用。
3. Mihomo 日志里节点测速失败怎么办?
单个节点测速失败不一定影响整体使用。可以先测试代理访问是否成功。
如果经常看到关于 http://www.gstatic.com/generate_204 的警告,可以把配置文件里的测速地址从 HTTP 改成 HTTPS:
url: https://www.gstatic.com/generate_204安全注意事项
最重要的一点:不要把 7890 端口暴露到公网。
建议保持配置中的:
allow-lan: false并且不要在阿里云安全组里开放 7890 端口。这个代理只应该给服务器自己使用。
另外,Clash 订阅链接本质上等同于账号凭证。如果不小心把完整订阅链接发到公开场合,建议立刻去服务商后台重置订阅 token。
总结
远程 Ubuntu 服务器不需要安装 Clash Verge Rev 这样的图形客户端。更适合的做法是:
Windows 本地:Clash Verge Rev 管理订阅和节点Ubuntu 服务器:Mihomo 作为后台代理内核运行命令行工具:通过 http_proxy / https_proxy / all_proxy 使用本地 7890 端口这样配置完成后,服务器上的 curl、wget、git clone、npm install 等命令就可以稳定通过代理访问海外资源。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!