1. 概述与前提
1) 目标:在新加坡机房(例如 AWS ap-southeast-1、Vultr Singapore、Linode Singapore 或 DigitalOcean 新加坡节点)托管多个站群,做到自动化部署、证书自动续期、集中监控与告警。
2) 前提准备:每台服务器 SSH 公钥登录、域名已在 DNS 服务商(建议 Cloudflare)可编辑、准备一个代码仓库(GitLab/GitHub)及 CI/CD 权限。
3) 工具栈建议:Ansible(配置管理)、Docker Compose 或 Kubernetes (K3s)(容器化部署)、Nginx(反向代理)、Certbot 或 acme.sh(证书)、Prometheus+Grafana+Alertmanager(监控告警)、Loki/Promtail(日志)。
2. 服务器选型与网络配置
1) 选型:生产建议 2-4 核 CPU、4-8GB 内存起步,磁盘选择 SSD,增加 IOPS 可选。对于高并发站群考虑负载均衡(L4/L7)。
2) 私有网络:在云平台内启用 VPC,划分子网并设置安全组,只开放必要端口(22、80、443,监控端口如 9090/3000 内网可限制)。
3) DNS:在 Cloudflare 上统一管理,开启 proxied(DNS over CDN)或根据需要直接解析到负载均衡器。建议使用 API Token 用于证书/自动化更新。
3. 基础运维硬化与常用命令
1) 创建用户与 SSH:在服务器上创建 deploy 用户并复制公钥。
- sudo adduser deploy
- sudo mkdir /home/deploy/.ssh && sudo chmod 700 /home/deploy/.ssh
- 将公钥写入 /home/deploy/.ssh/authorized_keys 并 chmod 600
2) 禁用密码登录:编辑 /etc/ssh/sshd_config,设置 PasswordAuthentication no,Restart sshd:sudo systemctl restart sshd
3) 防火墙与 Fail2ban:使用 UFW 或 iptables,例:sudo ufw allow OpenSSH; sudo ufw allow 80; sudo ufw allow 443; sudo ufw enable;安装 fail2ban:sudo apt install fail2ban。
4. 自动化配置与部署(Ansible 实操)
1) 安装 Ansible(控制机本地):pip3 install ansible 或 apt install ansible。
2) inventory 示例(hosts):
- [sg-web]
sg-web-1 ansible_host=1.2.3.4 ansible_user=deploy
3) playbook 示例步骤(site.yml):包含更新包、安装 docker、部署 docker-compose 文件、拉取镜像并启动。
- tasks: apt update/upgrade; install docker.io; pip3 install docker-compose;复制 /srv/compose/{{site}}/docker-compose.yml;docker-compose up -d
4) 执行:ansible-playbook -i hosts site.yml --limit sg-web
5. 容器化部署示例(Docker Compose 与 Nginx 反向代理)
1) 推荐目录结构:/srv/sites/{domain}/docker-compose.yml 与 /srv/nginx/conf.d/{domain}.conf
2) docker-compose.yml 简要:
- version: '3'
services:
web:
image: yourrepo/site:latest
restart: always
ports: ["8000"]
3) Nginx 反向配置(示例):
- server { listen 80; server_name example.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; } }
4) SSL 自动化:使用 acme.sh 或 certbot 的 DNS 插件(建议 Cloudflare API)进行通配符证书,命令示例(acme.sh):
- export CF_Token=xxx; acme.sh --issue --dns dns_cf -d example.com -d '*.example.com' --keylength ec-256
- acme.sh --install-cert -d example.com --key-file /etc/ssl/private/example.key --fullchain-file /etc/ssl/certs/example.crt --reloadcmd "docker-compose -f /srv/nginx/docker-compose.yml restart nginx"
6. 使用 K3s/Kubernetes 进行可扩展部署(可选)
1) 单节点或小集群建议使用 K3s:curl -sfL https://get.k3s.io | sh -,在 master 节点安装并在 worker 节点使用 K3S_URL 和 K3S_TOKEN 加入。
2) 部署 Ingress(Traefik 或 Nginx Ingress),并通过 cert-manager + ClusterIssuer(Cloudflare DNS)实现证书自动签发。
3) CI/CD:在 GitLab CI 中使用 kubectl apply -f 部署 YAML,或使用 Helm charts 管理站群应用版本。
7. 监控 & 日志集中化(Prometheus + Grafana + Loki)
1) 部署 Prometheus:使用 Docker Compose 或 K8s。Prometheus scrape_targets 包括 node_exporter、cadvisor、blackbox_exporter(用于站点可用性检测)。prometheus.yml 示例需加入 job 配置。
2) 安装 node_exporter(服务器端):
- wget https://.../node_exporter.tar.gz;tar xzf ...; sudo cp node_exporter /usr/local/bin/;创建 systemd 服务并启动。
3) Grafana:通过数据源连接 Prometheus,导入 dashboard(node-exporter、container insights)。设置 Alertmanager 与邮件/Slack/Wechat 绑定告警规则。
4) 日志:Loki + Promtail 收集容器与 Nginx 日志,Grafana 可统一查看并与告警结合。
8. 灾备与备份策略
1) 数据库:定时逻辑备份(mysqldump)+ 上传到 S3/Spaces,示例 crontab:0 3 * * * /usr/bin/mysqldump -u root -p'PASS' db | gzip > /backup/db-$(date +\%F).sql.gz && rclone copy /backup s3:bucket/ --s3-region ap-southeast-1
2) 镜像与代码:镜像推到私有仓库(Harbor 或 Docker Hub),代码仓库开启保护分支与 CI。
3) 快照:对重要实例启用云端快照策略(每日或每周),并测试恢复流程。
9. 8. 常见问答一:如何在新加坡节点实现低延迟与合规?
Q: 新加坡站群如何保证低延迟与合规性? A: 选择靠近目标用户的机房(APAC),使用 CDN(Cloudflare)做静态加速,启用 TCP 优化与 HTTP/2,对敏感数据遵循当地法律,使用区域化备份并在机房网络层开启 DDoS 防护与私有子网分离。
10. 9. 常见问答二:证书自动续期失败怎么办?
Q: 如果 certbot/acme.sh 自动续期失败如何排查? A: 1) 查看 /var/log/letsencrypt 或 acme.sh 日志。2) 检查 DNS API Token 权限和 TTL 是否生效。3) 确认防火墙/Cloudflare 是否阻断验证(必要时使用 DNS-01 校验而非 HTTP-01)。4) 手动运行 acme.sh --renew -d domain --force 并看返回错误。
11. 10. 常见问答三:如何扩容站群并保持部署一致性?
Q: 站群扩容时如何保证环境一致且部署快速? A: 使用镜像化部署(Docker/Helm),用 Ansible/Terraform 自动化创建实例与网络,用配置管理(Consul/etcd 或 env secrets 管理)统一配置,CI/CD 推镜像后自动滚动更新(blue-green 或 canary),并在扩容后自动将新节点加入监控与日志采集。
来源:站群运维指南新加坡站群服务器托管 自动化部署与监控实践