1. 从 CentOS 7 换到 Alibaba Cloud Linux 3,我踩过的第一波坑
CentOS 7 在 2024 年 6 月 30 日停止维护之后,很多还在跑老项目的服务器就有点尴尬了:yum源里能装的东西越来越旧,Node.js 想上 20 以上版本动不动就报GLIBC_2.27 not found,Docker 官方源也早就把 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
环境搭好之后,如果你要接大模型做编码辅助或者跑 Agent,TaoToken 是一个可以省掉不少配置麻烦的入口。它提供统一的 API 地址和密钥管理,模型对话、Coding Plan、API Keys 都在一个控制台里,不用自己维护多套凭证。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_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 LTS
nvm 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.conf:
server { 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"; } }改完配置一定要先测语法再重载,别直接 restart:
sudo 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-repo=https://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 验证 Nginx
curl -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 验证 Docker
docker run --rm hello-world能打印出Hello from Docker!就说明镜像拉取和容器运行都正常。如果卡在拉取,检查daemon.json里的镜像加速地址。
6.4 验证 TaoToken 接入
系统环境跑通之后,去控制台拿 Key。API Keys 页面在 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite ,接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。想先试模型对话可以去 https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite ,长期做编码或者 Agent 的话看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。
用 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 通过但访问 502
nginx -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_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 。要长期跑 Agent 或者做批量编码任务,Coding Plan 更合适:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。控制台统一管理凭证:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite 。
最后留一个我踩过的坑:迁移的时候别急着把老机器关掉,先把新环境跑通、数据迁完、域名解析切过去,观察一两天再下线。CentOS 7 到 Alibaba Cloud Linux 3 的命令差异其实很小,真正花时间的是证书路径、安全组和 Docker 源这些细节,提前对一遍能省不少返工。