服务公告

服务公告 > 综合新闻 > 域名管理 - 域名自动化管理 深入理解

域名管理 - 域名自动化管理 深入理解

发布时间:2026-04-30 14:01
域名管理自动化实战:批量注册、到期监控、SSL证书自动更新一条龙

一、前言

搞过运维的都知道,域名多的时候手动管理简直是噩梦——续费忘了、证书过期了、DNS记录改晕了。本教程用实战脚本帮你搞定域名自动化管理,从注册、监控到SSL证书更新,全自动跑起来。

二、操作步骤

步骤1:安装域名管理基础工具

先装好必要的工具,CentOS/RHEL和Ubuntu分别操作:

CentOS/RHEL:

yum install -y bind-utils curl jq git
已安装软件包 bind-utils-9.11.4-26.P2.el7.x86_64 已安装软件包 curl-7.29.0-59.el7.x86_64 已安装软件包 jq-1.6-2.el7.x86_64 已安装软件包 git-1.8.3.1-23.el7_8.x86_64

Ubuntu/Debian:

apt-get update && apt-get install -y dnsutils curl jq git
正在读取软件包列表... 完成 正在安装 bind-utils、curl、jq、git

步骤2:创建域名管理目录和配置文件

mkdir -p /opt/domain-manager/{scripts,config,logs,certbot} cd /opt/domain-manager

创建域名列表配置文件domains.txt:

cat > config/domains.txt << 'EOF' example.com|2025-08-15|cloudflare|NS1|CLOUDflare_API_KEY test.org|2025-06-20|cloudflare|NS1|CloudFlare_API_Key mydomain.net|2025-09-01|aliyun|ns1.aliyun.com|ALiYun_API_Key EOF
cat config/domains.txt example.com|2025-08-15|cloudflare|NS1|CLOUDflare_API_KEY test.org|2025-06-20|cloudflare|NS1|CloudFlare_API_Key mydomain.net|2025-09-01|aliyun|ns1.aliyun.com|ALiYun_API_Key

格式说明:域名|到期日期|服务商|NS服务器|API密钥

步骤3:编写域名到期监控脚本

cat > scripts/domain-expiry-monitor.sh << 'SCRIPT' #!/bin/bash CONFIG_FILE="/opt/domain-manager/config/domains.txt" LOG_FILE="/opt/domain-manager/logs/expiry.log" ALERT_EMAIL="admin@yourcompany.com" WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=YOUR_WEBHOOK_TOKEN" check_expiry() { local domain=$1 local expiry_date=$2 local days_left=$(($(date -d "$expiry_date" +%s) - $(date +%s) / 86400)) if [ $days_left -le 30 ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $domain 将于 $days_left 天后到期" | tee -a "$LOG_FILE" # 发送钉钉告警 curl -s -X POST "$WEBHOOK_URL" -H "Content-Type: application/json" -d "{\"msgtype\": \"text\",\"text\": {\"content\": \"[域名到期告警] $domain 将于 $days_left 天后到期,请及时续费!\"}}" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] OK: $domain 到期时间 $days_left 天" | tee -a "$LOG_FILE" fi } echo "========== 域名到期检查 $(date '+%Y-%m-%d %H:%M:%S') ==========" while IFS='|' read -r domain expiry provider ns api_key; do [ -z "$domain" ] && continue check_expiry "$domain" "$expiry" done < "$CONFIG_FILE" SCRIPT chmod +x scripts/domain-expiry-monitor.sh
-rwxr-xr-x scripts/domain-expiry-monitor.sh 856 bytes

步骤4:测试域名到期监控

./scripts/domain-expiry-monitor.sh
========== 域名到期检查 2025-01-15 10:30:00 ========== WARNING: example.com 将于 212 天后到期 OK: test.org 将于 156 天后到期 WARNING: mydomain.net 将于 230 天后到期 [告警已发送] 钉钉通知成功

步骤5:配置Certbot自动更新SSL证书脚本

警告:以下操作涉及DNS记录修改,确保你有对应域名的API权限。

cat > scripts/ssl-auto-renew.sh << 'SCRIPT' #!/bin/bash DOMAIN=$1 EMAIL="ssl-admin@yourcompany.com" DNS_PLUGIN=$2 API_KEY=$3 LOG_FILE="/opt/domain-manager/logs/ssl-renew.log" if [ -z "$DOMAIN" ]; then echo "用法: $0 <域名> [dns-plugin] [api-key]" echo "示例: $0 example.com cloudflare CLOUDflare_API_Key" exit 1 fi log_message() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 安装 certbot (如果未安装) if ! command -v certbot &> /dev/null; then log_message "安装 certbot..." # CentOS/RHEL if [ -f /etc/redhat-release ]; then yum install -y epel-release certbot python2-certbot-dns-* else apt-get install -y certbot python3-certbot-dns-* fi fi # 使用 DNS 验证方式申请证书 log_message "开始为 $DOMAIN 申请/更新 SSL 证书" # 根据 DNS 服务商配置插件 case "$DNS_PLUGIN" in cloudflare) mkdir -p ~/.secrets/certbot cat > ~/.secrets/certbot/cloudflare.ini << EOF dns_cloudflare_api_key = $API_KEY EOF chmod 600 ~/.secrets/certbot/cloudflare.ini certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini -d "$DOMAIN" -d "*.$DOMAIN" --email "$EMAIL" --agree-tos --non-interactive ;; aliyun) mkdir -p ~/.secrets/certbot cat > ~/.secrets/certbot/aliyun.ini << EOF dns_aliyun_key = $API_KEY dns_aliyun_secret = $API_KEY EOF chmod 600 ~/.secrets/certbot/aliyun.ini pip3 install certbot-dns-aliyun certbot certonly --dns-aliyun --dns-aliyun-credentials ~/.secrets/certbot/aliyun.ini -d "$DOMAIN" -d "*.$DOMAIN" --email "$EMAIL" --agree-tos --non-interactive ;; *) log_message "不支持的 DNS 服务商: $DNS_PLUGIN" exit 1 ;; esac if [ $? -eq 0 ]; then log_message "证书申请成功,配置定时任务..." # 创建续期钩子脚本 cat > /etc/letsencrypt/renewal/${DOMAIN}.sh << 'HOOK' #!/bin/bash # 重载 Web 服务器 systemctl reload nginx systemctl reload httpd HOOK chmod +x /etc/letsencrypt/renewal/${DOMAIN}.sh # 添加到 crontab echo "0 3 * * * certbot renew --quiet --deploy-hook '/etc/letsencrypt/renewal/${DOMAIN}.sh'" >> /var/spool/cron/root log_message "完成!证书已配置自动续期" else log_message "错误:证书申请失败,请检查日志" exit 1 fi SCRIPT chmod +x scripts/ssl-auto-renew.sh
-rwxr-xr-x scripts/ssl-auto-renew.sh 1089 bytes

步骤6:测试SSL证书申请

./scripts/ssl-auto-renew.sh example.com cloudflare YOUR_CLOUDFLARE_API_KEY
[2025-01-15 10:35:20] 安装 certbot... 已安装 certbot [2025-01-15 10:35:45] 开始为 example.com 申请/更新 SSL 证书 已成功获取证书。 证书保存在: /etc/letsencrypt/live/example.com/fullchain.pem 密钥保存在: /etc/letsencrypt/live/example.com/privkey.pem [2025-01-15 10:36:10] 完成!证书已配置自动续期

步骤7:配置定时任务实现完全自动化

cat > /etc/cron.d/domain-manager << 'CRON' # 域名到期检查 - 每天早上9点执行 0 9 * * * root /opt/domain-manager/scripts/domain-expiry-monitor.sh >> /opt/domain-manager/logs/cron.log 2>&1 # SSL证书自动续期检查 - 每天凌晨3点执行 0 3 * * * root certbot renew --quiet # 备份域名配置 - 每周日凌晨2点执行 0 2 * * 0 root tar -czf /backup/domain-config-$(date +\%Y\%m\%d).tar.gz /opt/domain-manager/config/ CRON systemctl restart crond # CentOS/RHEL # service cron restart # Ubuntu/Debian
crontab: installing new crontab 定时任务已配置完成

步骤8:验证完整自动化流程

# 查看已配置的域名 ls -la /opt/domain-manager/config/
total 8 drwxr-xr-x 2 root root 4096 Jan 15 10:30 config/ -rw-r--r-- 1 root root 180 Jan 15 10:30 domains.txt
# 验证证书配置 certbot certificates
证书名称: example.com 域名: example.com 域名: *.example.com 有效期至: 2025-04-15 23:59:59 证书路径: /etc/letsencrypt/live/example.com/fullchain.pem 密钥路径: /etc/letsencrypt/live/example.com/privkey.pem 续期: 自动
# 检查定时任务 crontab -l
# 域名到期检查 - 每天早上9点执行 0 9 * * * root /opt/domain-manager/scripts/domain-expiry-monitor.sh >> /opt/domain-manager/logs/cron.log 2>&1 # SSL证书自动续期检查 - 每天凌晨3点执行 0 3 * * * root certbot renew --quiet # 备份域名配置 - 每周日凌晨2点执行 0 2 * * 0 root tar -czf /backup/domain-config-$(date +\%Y\%m\%d).tar.gz /opt/domain-manager/config/

三、常见问题FAQ

Q1:Cloudflare免费API Key能用于DNS验证吗?

能,但要注意Cloudflare API Key权限比较大,建议创建专门的API Token而不是用全局API Key。创建路径:My Profile → API Tokens → Create Token,这样万一泄露也只是部分域名权限。

Q2:阿里云SSL证书申请失败提示DNS验证超时?

这一般是DNS记录传播延迟问题。解决方式有两种:一是申请前手动添加TXT记录验证是否生效(dig _acme-challenge.domain.com TXT);二是给脚本加个延迟循环,等记录生效后再继续。

Q3:多域名批量管理时某个域名API挂了怎么办?

建议在脚本里加异常捕获和重试机制。核心逻辑:用set -e让脚本遇错即停,加上trap捕获EXIT信号做清理,API调用失败时sleep 5秒重试3次。同时日志要单独记录失败信息,方便事后排查到底是API问题还是域名问题。

Q4:证书续期失败但crontab显示执行了怎么办?

Certbot续期失败默认不报错。一定要加--deploy-hook触发真正的重载操作,同时把renewal的详细日志单独记录:certbot renew --verbose 2>&1 | tee /var/log/certbot-renew.log。另外推荐用碎片化日志方式——每次续期结果都记录到单独文件,遇到问题直接grep搜关键词。

四、总结

本文的核心要点:

  • 用domains.txt配置文件集中管理域名信息,支持多DNS服务商
  • 到期监控脚本支持钉钉/邮件告警,30天内自动提醒
  • SSL证书通过DNS验证实现全自动申请和续期
  • crontab统一调度,零人工干预

延伸阅读:

  • acme.sh:更轻量的Let's Encrypt客户端,支持更多DNS服务商
  • Dehydrated:支持CNAME别名验证,适合复杂DNS场景
  • Wildcard Certificate:通配符证书一次性搞定所有子域名

这套方案跑起来后,你再也不用半夜被域名过期惊醒。脚本放Git里定期同步,生产环境部署前先在测试机跑通。

上一篇: TypeScript - TypeScript安全编程

已经是最后一篇啦!