跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    阿里云 ECS 实践

    阿里云弹性计算服务(ECS)是国内使用最广泛的云服务器平台之一。本文介绍在阿里云 ECS 上使用 Enterprise Linux 发行版(Anolis OS、AlmaLinux、CentOS Stream)的完整实践,包括实例创建、安全组配置、Cloud-Init 定制、OSS 对象存储集成、阿里云 CLI 使用及自定义镜像制作。

    阿里云 ECS 在创建实例时提供多种 Enterprise Linux 镜像:

    镜像说明推荐场景
    Anolis OS 8/23阿里巴巴发起的发行版(8 兼容 CentOS 8,23 独立演进),深度集成阿里云阿里云深度用户、需要 Cloud Kernel 的场景
    AlmaLinux 8/9/10社区驱动的 EL 兼容发行版通用生产环境、多云部署
    CentOS Stream 9/10RHEL 的上游滚动发行版开发测试、追踪最新特性
    CentOS 7(已 EOL)已于 2024 年 6 月停止维护不推荐新部署

    上表是概览:具体可选的镜像版本以控制台当前列表为准(10 系已随上游 GA,各区域上架时间可能不同;看不到就用「自定义镜像」导入)。

    1. 登录阿里云 ECS 控制台,点击「创建实例」
    2. 在「镜像」步骤中选择「公共镜像」
    3. 操作系统下拉框中选择目标发行版和版本
    4. Anolis OS 位于「Alibaba Cloud Linux」分类下(Alibaba Cloud Linux 3 基于 Anolis OS 8,Alibaba Cloud Linux 4 基于 Anolis OS 23)

    如果公共镜像中没有你需要的版本,可以:

    • 在「镜像市场」搜索第三方提供的 EL 镜像
    • 使用「自定义镜像」功能从其他账号导入
    • 自行制作镜像后上传(参见后文「自定义镜像」章节)

    安全组是阿里云 ECS 的虚拟防火墙,控制实例的入站和出站流量。每个 ECS 实例必须关联至少一个安全组。

    典型的 Web 服务器安全组规则
    方向 协议 端口范围 授权对象 说明
    入方向 TCP 22/22 你的办公 IP/32 SSH 登录
    入方向 TCP 80/80 0.0.0.0/0 HTTP
    入方向 TCP 443/443 0.0.0.0/0 HTTPS
    入方向 ICMP -1/-1 0.0.0.0/0 Ping
    出方向 全部 -1/-1 0.0.0.0/0 允许所有出站
    • 遵循最小权限原则,只开放必要端口
    • SSH 端口(22)仅对办公 IP 或堡垒机开放,不要对 0.0.0.0/0 开放
    • 数据库端口(3306、5432、6379 等)仅对应用服务器的内网 IP 开放
    • 使用安全组规则的「优先级」字段(1-100,数字越小优先级越高)精细控制
    • 为不同用途的实例创建不同安全组(如 Web 安全组、数据库安全组)
    创建安全组
    $ aliyun ecs CreateSecurityGroup \
    --RegionId cn-hangzhou \
    --SecurityGroupName web-sg \
    --Description "Web 服务器安全组" \
    --VpcId vpc-xxxxxx
    添加入方向规则(开放 80 端口)
    $ aliyun ecs AuthorizeSecurityGroup \
    --RegionId cn-hangzhou \
    --SecurityGroupId sg-xxxxxx \
    --IpProtocol tcp \
    --PortRange 80/80 \
    --SourceCidrIp 0.0.0.0/0 \
    --Description "Allow HTTP"
    查看安全组规则
    $ aliyun ecs DescribeSecurityGroupAttribute \
    --RegionId cn-hangzhou \
    --SecurityGroupId sg-xxxxxx

    阿里云 ECS 使用 Cloud-Init 完成实例首次启动时的自动化配置。你可以在创建实例时传入 user-data 脚本。

    在创建 ECS 实例的「系统配置」步骤中,展开「高级选项」,在「实例自定义数据」文本框中输入 cloud-config 内容。

    cloud-config:初始化 Web 服务器
    #cloud-config
    # 系统更新
    package_update: true
    package_upgrade: true
    # 安装软件
    packages:
    - nginx
    - firewalld
    - vim-enhanced
    # 创建运维用户
    users:
    - name: deploy
    groups: wheel
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    ssh_authorized_keys:
    - ssh-ed25519 AAAA... your-key-comment
    # 配置防火墙并启动 Nginx
    runcmd:
    - systemctl enable --now firewalld
    - firewall-cmd --permanent --add-service=http
    - firewall-cmd --permanent --add-service=https
    - firewall-cmd --reload
    - systemctl enable --now nginx
    # 写入配置文件
    write_files:
    - path: /etc/motd
    content: |
    ========================================
    阿里云 ECS - 生产服务器
    未经授权禁止访问
    ========================================
    创建实例时指定 User-Data
    $ aliyun ecs RunInstances \
    --RegionId cn-hangzhou \
    --ImageId aliyun_3_x64_20G_alibase_20260101.vhd \
    --InstanceType ecs.g7.large \
    --SecurityGroupId sg-xxxxxx \
    --VSwitchId vsw-xxxxxx \
    --UserData $(base64 -w 0 user-data.yaml)

    User-Data 需要经过 Base64 编码后传入。控制台会自动处理编码,CLI 则需要手动编码。

    阿里云 ECS 实例可以通过元数据服务获取自身信息:

    查询实例元数据
    # 获取实例 ID
    $ curl http://100.100.100.200/latest/meta-data/instance-id
    # 获取实例所在地域
    $ curl http://100.100.100.200/latest/meta-data/region-id
    # 获取实例私网 IP
    $ curl http://100.100.100.200/latest/meta-data/private-ipv4
    # 获取实例公网 IP
    $ curl http://100.100.100.200/latest/meta-data/eipv4
    # 获取实例规格
    $ curl http://100.100.100.200/latest/meta-data/instance/instance-type
    # 获取 User-Data
    $ curl http://100.100.100.200/latest/user-data

    阿里云元数据服务地址为 100.100.100.200,与 AWS 的 169.254.169.254 不同。

    阿里云支持「加固模式」元数据访问,通过 Token 机制防止 SSRF 攻击:

    使用加固模式访问元数据
    # 获取 Token(有效期 6 小时)
    $ TOKEN=$(curl -s -X PUT "http://100.100.100.200/latest/api/token" \
    -H "X-Forwarded-For: Chinese" \
    -H "X-Metadata-Token-TTL-Seconds: 21600")
    # 使用 Token 获取元数据
    $ curl -s -H "X-Metadata-Token: $TOKEN" \
    http://100.100.100.200/latest/meta-data/instance-id

    阿里云 CLI 工具 aliyun 可以在命令行管理所有阿里云资源。

    在 EL 系统上安装阿里云 CLI
    # 方式一:通过官方安装脚本
    $ curl -fsSL https://aliyuncli.alicdn.com/aliyun-cli-linux-latest-amd64.tgz | sudo tar xz -C /usr/local/bin/
    # 方式二:通过 Homebrew(如果已安装)
    $ brew install aliyun-cli
    验证安装
    $ aliyun version
    交互式配置 AccessKey
    $ aliyun configure

    按提示输入:

    • Access Key ID
    • Access Key Secret
    • Default Region Id(如 cn-hangzhou)
    • Default Output Format(推荐 json)

    配置文件保存在 ~/.aliyun/config.json。

    在 ECS 实例上,推荐使用 RAM 实例角色代替 AccessKey,避免将密钥存储在实例中:

    使用 ECS 实例 RAM 角色
    $ aliyun configure --mode EcsRamRole --ram-role-name MyEcsRole
    查询 ECS 实例列表
    $ aliyun ecs DescribeInstances --RegionId cn-hangzhou
    启动/停止/重启实例
    $ aliyun ecs StartInstance --InstanceId i-xxxxxx
    $ aliyun ecs StopInstance --InstanceId i-xxxxxx
    $ aliyun ecs RebootInstance --InstanceId i-xxxxxx
    查询实例详情并用 jq 提取关键信息
    $ aliyun ecs DescribeInstances --RegionId cn-hangzhou | \
    jq '.Instances.Instance[] | {InstanceId, InstanceName, Status, PublicIpAddress}'

    阿里云对象存储 OSS(Object Storage Service)可用于存储备份文件、静态资源、日志归档等。

    安装 ossutil 命令行工具
    $ curl -fsSL https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash
    验证安装
    $ ossutil version
    配置 ossutil 凭证
    $ ossutil config

    按提示输入 Endpoint(如 oss-cn-hangzhou.aliyuncs.com)、AccessKey ID 和 AccessKey Secret。

    创建 Bucket
    $ ossutil mb oss://my-backup-bucket --region cn-hangzhou
    上传文件
    # 上传单个文件
    $ ossutil cp /backup/database.sql.gz oss://my-backup-bucket/db-backups/
    # 递归上传目录
    $ ossutil cp -r /var/www/static/ oss://my-backup-bucket/static/
    下载文件
    $ ossutil cp oss://my-backup-bucket/db-backups/database.sql.gz /tmp/
    列出 Bucket 中的文件
    $ ossutil ls oss://my-backup-bucket/db-backups/
    同步目录到 OSS(类似 rsync)
    $ ossutil sync /var/log/nginx/ oss://my-backup-bucket/nginx-logs/ --delete
    创建数据库备份脚本
    sudo tee /usr/local/bin/backup-to-oss.sh << 'SCRIPT'
    #!/bin/bash
    DATE=$(date +%Y%m%d_%H%M%S)
    BACKUP_DIR="/tmp/backup"
    BUCKET="oss://my-backup-bucket"
    mkdir -p "$BACKUP_DIR"
    # 备份 PostgreSQL
    sudo -u postgres pg_dumpall | gzip > "${BACKUP_DIR}/postgres_${DATE}.sql.gz"
    # 上传到 OSS
    ossutil cp "${BACKUP_DIR}/postgres_${DATE}.sql.gz" "${BUCKET}/db-backups/"
    # 清理本地临时文件
    rm -f "${BACKUP_DIR}/postgres_${DATE}.sql.gz"
    # 清理 OSS 上 30 天前的备份(通过生命周期规则管理更佳)
    echo "Backup completed: postgres_${DATE}.sql.gz"
    SCRIPT
    sudo chmod +x /usr/local/bin/backup-to-oss.sh
    添加定时任务
    echo "0 2 * * * root /usr/local/bin/backup-to-oss.sh" | sudo tee /etc/cron.d/backup-to-oss

    建议在 OSS Bucket 上配置生命周期规则,自动将过期备份转为低频存储或归档存储,降低成本。

    自定义镜像可以将已配置好的系统环境打包,用于快速创建新实例或跨地域部署。

    准备工作——在创建镜像前,清理敏感信息和临时文件:

    镜像创建前的清理工作
    # 清理 SSH 主机密钥(Cloud-Init 会在新实例上重新生成)
    $ sudo rm -f /etc/ssh/ssh_host_*
    # 清理 cloud-init 缓存
    $ sudo cloud-init clean --logs
    # 清理 DNF 缓存
    $ sudo dnf clean all
    # 清理日志
    $ sudo journalctl --vacuum-time=1d
    $ sudo rm -f /var/log/*.gz /var/log/*-????????
    # 清理 bash 历史
    $ history -c && history -w
    通过 CLI 创建自定义镜像
    $ aliyun ecs CreateImage \
    --RegionId cn-hangzhou \
    --InstanceId i-xxxxxx \
    --ImageName "webapp-alma9-v1" \
    --Description "AlmaLinux 9 + Nginx + PostgreSQL 基础镜像"

    如果你有本地制作的 qcow2 或 raw 格式镜像,可以通过 OSS 导入:

    上传镜像文件到 OSS
    $ ossutil cp alma9-custom.qcow2 oss://my-image-bucket/images/

    然后在 ECS 控制台的「镜像」页面选择「导入镜像」,指定 OSS 文件路径、操作系统类型和架构。

    将镜像复制到其他地域
    $ aliyun ecs CopyImage \
    --RegionId cn-hangzhou \
    --ImageId m-xxxxxx \
    --DestinationRegionId cn-shanghai \
    --DestinationImageName "webapp-alma9-v1-shanghai"

    适合小型项目或个人站点:

    单机部署架构
    用户 → SLB(可选) → ECS 实例
    ├── Nginx(反向代理)
    ├── 应用进程
    └── 数据库(PostgreSQL/MySQL)

    关键配置要点:

    • 选择合适的实例规格(推荐 ecs.g7 或 ecs.c7 系列)
    • 系统盘使用 ESSD 云盘,数据盘独立挂载
    • 开启自动快照策略,每日备份
    • 安全组仅开放 80/443 和受限的 SSH 端口

    适合中大型生产环境:

    集群部署架构
    用户 → SLB(负载均衡)
    ├── ECS-1(应用节点)
    ├── ECS-2(应用节点)
    └── ECS-3(应用节点)
    │
    内网连接
    │
    ├── RDS(数据库)
    ├── Redis(缓存)
    └── OSS(静态资源)

    关键配置要点:

    • 应用节点使用自定义镜像统一部署,确保环境一致
    • 使用 SLB 进行负载均衡和健康检查
    • 数据库使用阿里云 RDS(托管服务),不在 ECS 上自建
    • 静态资源存储在 OSS,通过 CDN 加速
    • 使用专有网络(VPC)隔离内网环境

    启动模板可以保存实例创建参数,避免重复配置:

    创建启动模板
    $ aliyun ecs CreateLaunchTemplate \
    --RegionId cn-hangzhou \
    --LaunchTemplateName web-template \
    --ImageId m-xxxxxx \
    --InstanceType ecs.g7.large \
    --SecurityGroupId sg-xxxxxx \
    --VSwitchId vsw-xxxxxx \
    --SystemDiskCategory cloud_essd \
    --SystemDiskSize 40 \
    --UserData $(base64 -w 0 user-data.yaml)
    使用启动模板创建实例
    $ aliyun ecs RunInstances \
    --RegionId cn-hangzhou \
    --LaunchTemplateId lt-xxxxxx \
    --Amount 3
    • 密钥管理:使用 RAM 角色而非 AccessKey 访问阿里云 API,避免密钥泄露
    • 监控告警:配置云监控(CloudMonitor)对 CPU、内存、磁盘、网络设置告警阈值
    • 自动快照:对系统盘和数据盘启用自动快照策略
    • 安全加固:定期更新系统补丁,使用安骑士(云安全中心)进行漏洞扫描
    • 成本优化:开发测试环境使用抢占式实例,长期稳定负载使用包年包月或节省计划