自建 MCP server 放上 ECS,出网与常驻怎么配
自建 server 的优势是放在你控制得住的机器上。劣势也直接——一旦出了本机,安全组、监听地址、进程守护、密钥管理、出网策略这五件事都得自己补,宿主那边还有一套与你无关的配置写法在等着。
先把边界画清楚
三个前提:server 是你自己的,监听参数与日志都能改;对外入口只有一个,就是宿主访问的 HTTP 路径,没有网页界面与管理后台;宿主位置不确定,可能在同事笔记本上,也可能在另一台云主机上,不能假设来源 IP 固定。
稳的形态因此是:server 只监听 127.0.0.1,公网入口交给 Nginx 终止 TLS,进程用 systemd 拉起,配置与密钥分离。
安全组只开一条缝
入方向只需要 443,80 可留作跳转也可直接关;SSH 的 22 端口不要对全网开放,限制到办公网出口或跳板机地址段;server 自己的端口(比如 8000)绝对不要进安全组,它只该被本机 Nginx 访问。
出方向常被忽略。上线后建议把出网收成白名单:包源、接口域名、OAuth 端点。出网被挡住的表现是「工具能列出来,一调用就超时」,比连不上更难查。
让 server 只监听回环
监听地址写 127.0.0.1 而不是 0.0.0.0:即使安全组被误改,外部也连不上未授权端口。
Nginx 侧最关键的不是 TLS,而是关缓冲、放宽读超时。MCP 的 HTTP 传输可能是流式响应,默认 proxy_buffering on 会把响应攒起来再发,宿主侧看起来就是「一直没动静」。
location /mcp {
proxy_pass http://127.0.0.1:8000;
proxy_http_version 1.1;
proxy_buffering off;
proxy_read_timeout 300s;
}
读超时给到 300 秒是有意的:这类 server 冷启动实测可到 7889 ms,余量要比「够用」宽。
systemd 常驻:非 root、自动重启
不要用 nohup 或 tmux 挂着跑。云主机重启、进程 OOM、依赖升级,任何一种都会让它悄悄消失,宿主那边只显示工具列表为空。单独建一个系统用户,工作目录只给它读写权限。
[Unit]
Description=mcp server
[Service]
User=mcp
WorkingDirectory=/opt/mcp
EnvironmentFile=/etc/mcp/mcp.env
ExecStart=/opt/mcp/.venv/bin/python -m app.server --host 127.0.0.1 --port 8000
Restart=always
RestartSec=3
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
Restart=always 加 RestartSec=3 是基础,NoNewPrivileges 能限制意外权限。日志走 journald,journalctl -u mcp -f 能看到启动过程与每次握手。Python 实现冷启动几秒钟很正常,别因此调小超时。
密钥走环境变量,不进配置文件
MCP 配置里经常要填 token,写进宿主配置意味着它会跟着文件进 git、进共享目录、进截图。正确位置是服务端的 EnvironmentFile,权限 600,属主是运行用户。
MCP_API_TOKEN=...
UPSTREAM_API_KEY=...
LOG_LEVEL=info
server 若需校验调用方,让它读环境变量做比对,不要硬编码。轮换时改文件、重启服务即可,宿主侧不用动。
宿主侧:五处键名对不上
服务端跑通只完成一半。把地址交给宿主时会遇到 17 个宿主 5 种顶层键:VS Code 的 servers、Codex CLI 的 mcp_servers、Zed 的 context_servers、OpenCode 的 mcp,其余多数是 mcpServers;远程字段也有三种叫法。
可行做法:准备几份按宿主分文件的配置片段,让人复制对应那一份,而不是给一段通用 JSON 自己改。能省掉大量「我这边连不上」的工单。
还有一条:若 server 冷启动要七八秒,而某个宿主默认只等 5000 ms 拉工具列表,在宿主视角里你永远是「连上了但没工具」。部署说明里写清启动耗时。
上线前的自查
- 安全组入方向只剩 443,SSH 限源地址;
ss -lntp看不到0.0.0.0:8000。 - Nginx 已关缓冲,读超时够长;systemd 非 root、自动重启;代码里搜不到明文密钥。
口径:宿主键名差异引自兼容手册的宿主表与坑点表(核对 2026-10-23),宿主表属规则推导;采集汇总 generatedAt 2026-10-25T14:16Z、mode=partial,仅 1 个 server × 17 个宿主 17 格,真机 5 格、文档 12 格。
总结
server 上 ECS 稳的形态是「安全组开一条缝、进程只监听回环、Nginx 终止 TLS 并关缓冲、systemd 非 root 常驻、密钥走环境变量」;另一半功夫在宿主侧的配置差异。想对照同类插件的中文清单与安装形态,见 完整插件清单与汉化避坑指南。
适合与不适合
适合:要把内部 MCP server 给多人用的后端工程师;已在 ECS 上跑别的服务、想复用同一套 Nginx 与 systemd 的运维;需要把 token 挪出宿主配置的团队。
不适合:只在笔记本上用 server 的个人用户,上云不划算;希望一条命令搞定的读者,这里没有一键脚本;需要多租户隔离与计费的场景,本文形态撑不住。
标签:MCP、阿里云 ECS、Nginx 反向代理、systemd、服务部署
本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页与 MCP 兼容手册。