1. 从 CentOS 7 换到 Alibaba Cloud Linux 3我踩过的第一波坑CentOS 7 在 2024 年 6 月 30 日停止维护之后很多还在跑老项目的服务器就有点尴尬了yum源里能装的东西越来越旧Node.js 想上 20 以上版本动不动就报GLIBC_2.27 not foundDocker 官方源也早就把 el7 的包挪走了。我手上有一台跑了三年的 CentOS 7 小机器本来想硬扛结果装个 Node.js 22 直接卡在 glibc 版本上折腾半天还是决定迁移。Alibaba Cloud Linux 3 是我最后选的落点理由很直接它兼容 CentOS 8 的软件生态dnf和yum都能用系统库版本够新官方支持到 2031 年迁移成本比换 Ubuntu 低很多。这篇文章就把我从 CentOS 7 习惯迁移到 Alibaba Cloud Linux 3 的完整过程写下来覆盖 Node.js、Nginx、Docker 三件套的安装、配置、启动和端口验证命令都可以直接复制。适合谁看手上有一台 Alibaba Cloud Linux 3 的 ECS想快速把 Node.js Nginx Docker 跑起来的人或者刚从 CentOS 7 迁过来发现老命令不太顺手的人。下面所有操作我都实测过报错和排查也一并写进去。2. 前置准备TaoToken 与基础环境2.1 为什么先提 TaoToken环境搭好之后如果你要接大模型做编码辅助或者跑 AgentTaoToken 是一个可以省掉不少配置麻烦的入口。它提供统一的 API 地址和密钥管理模型对话、Coding Plan、API Keys 都在一个控制台里不用自己维护多套凭证。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 注意 API 地址不带 UTM 参数。我一般建议先把系统环境跑通再去控制台拿 Key这样出问题的时候能快速判断是网络、系统还是凭证的问题。2.2 系统更新与基础工具Alibaba Cloud Linux 3 默认软件源已经比较新直接更新即可不需要像 CentOS 7 那样先换源。sudo dnf update -y sudo dnf install -y curl wget vim git tar unzip装完顺手配一下 Git后面拉代码用得上git config --global user.name 你的用户名 git config --global user.email 你的邮箱这里有个小细节Alibaba Cloud Linux 3 的dnf和yum是共存的yum实际上是dnf的软链接所以你在 CentOS 7 上习惯的yum install照样能用不用改肌肉记忆。2.3 防火墙策略交给安全组CentOS 7 时代很多人习惯开firewalld再手动放行端口。到了云上我的做法是直接关掉firewalld端口管控全部交给阿里云安全组避免双重配置打架。sudo systemctl stop firewalld sudo systemctl disable firewalld注意关掉系统防火墙之后一定要在阿里云控制台的安全组里放行你需要的端口比如 80、443、3000、8080。否则服务起来了但外网访问不了很容易误判成程序问题。3. Node.js 安装nvm 管理多版本3.1 用 nvm 而不是系统源CentOS 7 上系统源里的 Node.js 版本太旧我习惯用 nvm 管理。Alibaba Cloud Linux 3 上同样适用而且不会再有 glibc 的坑。curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc如果raw.githubusercontent.com拉取慢可以换成镜像脚本或者手动下载 install.sh 再执行。装完之后验证command -v nvm nvm --version3.2 安装 Node.js LTSnvm install 20 nvm alias default 20 node -v npm -v我选 20 是因为它是当前 LTS生态兼容性好。如果你要跑 Claude Code 这类工具注意它对 Node.js 版本有要求装之前先确认一下版本下限避免装完发现跑不起来。3.3 glibc 报错的根因在 CentOS 7 上装 Node.js 22 会报GLIBC_2.27 not found原因是 CentOS 7 的 glibc 停在 2.17而新版 Node.js 编译时依赖更高的 glibc。Alibaba Cloud Linux 3 的系统库版本已经满足要求这个问题自然消失。这也是我迁移的核心理由之一。4. Nginx 安装与站点配置4.1 安装与启动sudo dnf install -y nginx sudo systemctl start nginx sudo systemctl enable nginx关键目录记一下后面改配置全靠它们用途路径主配置/etc/nginx/nginx.conf站点配置/etc/nginx/conf.d/网站根目录/usr/share/nginx/html/日志目录/var/log/nginx/4.2 一个反向代理站点骨架假设你的 Node.js 服务跑在 3000 端口新建/etc/nginx/conf.d/app.confserver { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; 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_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; } }改完配置一定要先测语法再重载别直接 restartsudo nginx -t sudo systemctl reload nginx4.3 SSL 证书路径的两个常见坑第一个坑是路径写错。报错长这样cannot load certificate /usr/local/nginx/cert/xxx.pem: No such file or directory原因是配置文件里的路径指向了不存在的目录。规范做法是把证书统一放到/etc/nginx/ssl/下sudo mkdir -p /etc/nginx/ssl/your-domain sudo chmod 600 /etc/nginx/ssl/your-domain/privkey.key第二个坑是文件名带通配符。ssl_certificate不支持*必须写确切文件名比如/etc/nginx/ssl/your-domain/fullchain.pem不能写*.your-domain.pem。5. Docker 安装与镜像源5.1 为什么默认源装不上Alibaba Cloud Linux 3 默认源里没有docker-ce直接dnf install docker-ce会报No match for argument: docker-ce。必须手动加 Docker 的软件源。sudo dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo dnf -y install dnf-plugin-releasever-adapter --repo alinux3-plus sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin5.2 启动与验证sudo systemctl start docker sudo systemctl enable docker docker version docker compose version如果docker version能看到 Client 和 Server 两段信息说明守护进程正常。只看到 Client 说明服务没起来用systemctl status docker看日志。5.3 配置镜像加速编辑/etc/docker/daemon.json{ registry-mirrors: [https://your-mirror.mirror.aliyuncs.com], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }改完重载sudo systemctl daemon-reload sudo systemctl restart docker docker info | grep -A 5 Registry Mirrors日志轮转那两行建议加上不然容器跑久了日志能把磁盘吃满这个坑我在 CentOS 7 上踩过一次。6. 验证请求与成功结果6.1 验证 Nginxcurl -I http://127.0.0.1返回HTTP/1.1 200 OK就说明 Nginx 正常。如果返回 502多半是后端 Node.js 没起来或者端口不对。6.2 验证 Node.js 服务写个最小服务测试cat /tmp/app.js EOF const http require(http); http.createServer((req, res) { res.end(ok from node); }).listen(3000, 127.0.0.1); EOF node /tmp/app.js curl http://127.0.0.1:3000看到ok from node就说明 Node.js 和端口都通。测完记得kill掉这个临时进程。6.3 验证 Dockerdocker run --rm hello-world能打印出Hello from Docker!就说明镜像拉取和容器运行都正常。如果卡在拉取检查daemon.json里的镜像加速地址。6.4 验证 TaoToken 接入系统环境跑通之后去控制台拿 Key。API Keys 页面在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。想先试模型对话可以去 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 长期做编码或者 Agent 的话看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。用 curl 验证一下连通性curl https://taotoken.net/api/v1/models \ -H Authorization: Bearer 你的Key能返回模型列表就说明网络和凭证都没问题。如果返回 401检查 Key 有没有复制全返回超时检查安全组和 DNS。7. 本篇常见错排查7.1 dnf 找不到 docker-ce报错No match for argument: docker-ce原因是没加 Docker 源。回到 5.1 节执行dnf config-manager --add-repo那一步再重新安装。7.2 nginx -t 通过但访问 502nginx -t只检查语法不检查后端。502 说明 Nginx 转发到了 3000 端口但没人监听。用ss -lntp | grep 3000确认服务是否在跑注意 Node.js 要监听127.0.0.1或0.0.0.0不能只监听某个内网 IP。7.3 端口外网访问不了先确认服务监听地址再确认阿里云安全组。系统防火墙已经关了所以问题基本在安全组。放行端口后不用重启实例立即生效。7.4 Node.js 命令找不到nvm装完新开终端如果node -v报 command not found说明~/.bashrc没加载。执行source ~/.bashrc或者检查~/.nvm/nvm.sh那几行有没有写进去。7.5 Docker 拉镜像超时检查/etc/docker/daemon.json的registry-mirrors是否生效用docker info看。改完必须systemctl restart docker只 reload 不生效。7.6 SSL 重载后没生效改完证书配置先nginx -t再systemctl reload nginx。如果浏览器还报旧证书清一下本地缓存或者用curl -vI https://your-domain看实际返回的证书。8. 收尾与后续接入建议环境搭到这一步Node.js、Nginx、Docker 三件套都能跑起来了。我自己的习惯是先把一个最小 Node.js 服务用 Nginx 反代出去确认外网能访问再去接大模型相关的工具。这样分层排查出问题的时候能快速定位是系统层、Web 层还是应用层。如果你后面要接模型做编码辅助TaoToken 的模型对话入口适合先验证模型是否可用https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。要长期跑 Agent 或者做批量编码任务Coding Plan 更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。控制台统一管理凭证https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 。最后留一个我踩过的坑迁移的时候别急着把老机器关掉先把新环境跑通、数据迁完、域名解析切过去观察一两天再下线。CentOS 7 到 Alibaba Cloud Linux 3 的命令差异其实很小真正花时间的是证书路径、安全组和 Docker 源这些细节提前对一遍能省不少返工。
