服务公告
域名管理 - 域名自动化管理 深入理解
发布时间:2026-04-30 14:01
域名管理自动化实战:批量注册、到期监控、SSL证书自动更新一条龙
一、前言
搞过运维的都知道,域名多的时候手动管理简直是噩梦——续费忘了、证书过期了、DNS记录改晕了。本教程用实战脚本帮你搞定域名自动化管理,从注册、监控到SSL证书更新,全自动跑起来。
二、操作步骤
步骤1:安装域名管理基础工具 | 步骤2:创建域名管理目录和配置文件 | 步骤3:编写域名到期监控脚本 | 步骤4:测试域名到期监控 | 步骤5:配置Certbot自动更新SSL证书脚本 | 步骤6:测试SSL证书申请 | 步骤7:配置定时任务实现完全自动化 | 步骤8:验证完整自动化流程
步骤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安全编程
已经是最后一篇啦!