Centos7 +Nginx+ Let’s Encrypt 自动续费SSL证书
1. 安装 Certbot 的 Nginx 插件
此错误表明缺少 Certbot 的 Nginx 插件。在 CentOS 7 中,需通过 EPEL 仓库安装 python2-certbot-nginx
包:
# 确保 EPEL 仓库已启用
sudo yum install epel-release
# 安装 Certbot 及 Nginx 插件
sudo yum install certbot python2-certbot-nginx
安装完成后,验证插件是否加载:
certbot plugins
输出中应包含 nginx
插件
2.生成证书
1.自动申请并配置证书
若 Nginx 未安装在默认路径(如 /etc/nginx
),需手动指定配置目录。例如,自定义路径为 /opt/nginx/conf
:
#执行命令,输入邮箱,一直yes 就行。此情况适用于非标准安装环境
certbot --nginx --nginx-server-root=/usr/local/nginx/conf -d lzyou.top -d www.lzyou.top
-d
指定域名,支持多个域名或子域名。- 按提示输入邮箱(用于证书到期提醒)并同意服务协议。
- 证书将保存在
/etc/letsencrypt/live/example.com/
目录下。
2.手动验证(可选)
若自动配置失败,使用 certonly
模式手动生成证书:
sudo certbot certonly --nginx -d example.com -d www.example.com
需手动在 Nginx 配置中添加 SSL 路径:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
特殊情况:conf文件编码异常
解决方案
1. 检查并修复 Nginx 配置文件编码
步骤 1:验证文件编码 使用
file
命令检查nginx.conf
的编码格式:file -i /usr/local/nginx/conf/nginx.conf
若输出非
charset=utf-8
(如charset=iso-8859-1
),需转换编码。步骤 2:转换编码为 UTF-8 使用
iconv
工具转换文件编码:cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak # 备份 iconv -f iso-8859-1 -t UTF-8 /usr/local/nginx/conf/nginx.conf -o /usr/local/nginx/conf/nginx.conf
- 若文件含中文字符且原编码为
GBK
,需替换-f GBK
为实际编码(如GB2312
、ISO-8859-1
)。 - 若无
iconv
,通过yum install libiconv
安装。
- 若文件含中文字符且原编码为
步骤 3:删除非法字符 手动检查
nginx.conf
中的特殊符号(如中文标点、Emoji),确保所有内容为 英文或 UTF-8 兼容字符。
3.定时检查并自动续期
1. 确保Cron服务已安装并运行
安装Cron(若未安装):
sudo yum install crontabs sudo systemctl start crond sudo systemctl enable crond
验证Cron状态:
systemctl status crond # 应显示“active (running)”
2. 创建自动续期任务
编辑Cron定时任务:
crontab -e
添加以下内容(按
i
进入编辑模式):15 3 * * * /usr/bin/certbot renew --quiet --renew-hook "systemctl reload nginx"
- 含义:每天凌晨3:15执行
certbot renew
检查证书续期,成功后通过--renew-hook
自动重载Nginx服务(避免中断当前连接)。 - 关键参数:
--quiet
:抑制非必要输出,减少日志体积。--renew-hook
:仅在证书成功续期后触发Nginx重载
- 含义:每天凌晨3:15执行
3. 验证命令有效性
手动测试续期:
certbot renew --dry-run # 模拟续期流程,检查配置是否正确
强制续期测试(非必要):
certbot renew --force-renewal # 强制更新证书(慎用)
4. 日志监控与错误处理
查看续期日志:
tail -f /var/log/letsencrypt/letsencrypt.log
增强Cron任务日志记录(可选):
Bash# 在Cron任务中添加日志输出: 15 3 * * * /usr/bin/certbot renew --quiet --renew-hook "systemctl reload nginx" >> /var/log/letsencrypt/renew.log 2>&1
4. 其他注意事项
防火墙配置: 确保 80 和 443 端口开放:
sudo firewall-cmd --add-service={http,https} --permanent sudo firewall-cmd --reload
证书续期验证: 测试自动续期功能:
certbot renew --dry-run