好消息!Nginx 这个全球最火的 Web 服务器,终于 原生支持 Let’s Encrypt 免费证书的自动申请和续期啦!这都归功于它新开发的 ngx_http_acme_module
模块(用 Rust 写的哦)。
以前我们要用 certbot 之类的工具手动操作,现在直接在 Nginx 配置里就能搞定自动续期,再也不用担心证书过期网站打不开了!SSL/TLS 证书是网站安全的基石,Let’s Encrypt 又提供了免费好用的证书,配合 Nginx 这个新功能,简直是建站福音!
核心原理:ACME 协议
Let’s Encrypt 通过 ACME 协议 来管理证书(申请、验证、续期、吊销)。Nginx 的新模块就是实现了这个协议,能自动和 Let’s Encrypt 的服务器“对话”。
📌 手把手配置教学
只需要修改你的 Nginx 主配置文件(通常是 /etc/nginx/nginx.conf
或 /usr/local/nginx/conf/nginx.conf
),跟着下面三步走:
🔧 第一步:配置 ACME 服务器和“记忆库”
在 http { ... }
配置块里面加入这段代码,告诉 Nginx 你要用哪家的证书服务(这里以 Let’s Encrypt 为例)和在哪里“记住”申请状态。
http {
# ... (其他你原有的配置)
# 配置 ACME 证书签发者 (这里命名为 letsencrypt)
acme_issuer letsencrypt {
uri https://acme-v02.api.letsencrypt.org/directory; # Let's Encrypt 官方接口地址
state_path /var/cache/nginx/acme-letsencrypt; # 存放申请状态和证书的目录,确保Nginx有写权限!
accept_terms_of_service; # 非常重要!表示你同意 Let's Encrypt 的服务条款
}
# 设置一块共享内存区域,用于模块间协调证书操作 (1MB通常足够)
acme_shared_zone zone=acme_shared:1M;
# ... (其他你原有的配置)
}
acme_issuer
: 定义一个证书签发者,名字叫letsencrypt
(你可以改成别的,后面会用这个名字)。uri
: 固定指向 Let’s Encrypt 的 ACME v2 协议接口地址。state_path
: 必须指定一个目录,Nginx 会把申请到的证书、账户密钥、申请状态等信息存在这里。确保 Nginx 工作进程(通常是nginx
或www-data
用户)对这个目录有读写权限!accept_terms_of_service
: 必须加上这一句,表示你同意 Let’s Encrypt 的服务条款,否则申请会失败。acme_shared_zone
: 分配一小块共享内存 (1MB 足够),模块内部用来同步信息。
🌐 第二步:配置域名验证(HTTP-01 方式)
Let’s Encrypt 需要验证你真的拥有要申请证书的域名。Nginx 作为 Web 服务器,用 HTTP-01 验证 最方便。
我们需要确保 Nginx 的 80 端口 是开放的,并且能处理 Let’s Encrypt 发来的验证请求。
# 通常在某个 server 块或单独的配置文件中配置
server {
listen 80; # 关键!监听 80 端口 (HTTP)
server_name yourdomain.com www.yourdomain.com; # 替换成你真实的域名!
# 专门处理 Let's Encrypt ACME 挑战请求的路径
# 这个 location 块是模块自动使用的,非常重要!
location ^~ /.well-known/acme-challenge/ {
# 告诉Nginx这个location使用我们之前定义的acme签发者来处理挑战
acme_challenge letsencrypt;
}
# 对于其他所有访问 80 端口的请求,返回一个简单的 404
location / {
return 404;
}
}
listen 80
: 这个 Server 块专门用来响应 HTTP (80 端口) 请求,主要是为了应对 ACME 的验证挑战。server_name
: 务必改成你要申请证书的域名,比如example.com
和www.example.com
。location ^~ /.well-known/acme-challenge/
: 这是 最关键 的部分!它定义了一个特殊路径,专门用于处理 Let’s Encrypt 的验证请求。acme_challenge letsencrypt;
指令将这个路径的处理关联到我们第一步定义的letsencrypt
签发者。Nginx 模块会自动在这个路径下放置验证文件供 Let’s Encrypt 检查。location /
: 对于访问网站根目录或其他路径的 HTTP 请求,直接返回 404 错误。因为我们这个 Server 块的核心任务就是处理证书验证。
🔐 第三步:配置 HTTPS 服务器 & 自动证书管理
最后一步,配置你真正的 HTTPS 网站,并启用自动获取和续期证书的功能。
server {
listen 443 ssl; # 监听 443 端口 (HTTPS)
server_name yourdomain.com www.yourdomain.com; # 同样替换成你的域名!
# 核心指令:告诉 Nginx 为此 server 块自动申请和管理来自 'letsencrypt' 签发者的证书
acme_certificate letsencrypt;
# 指向 ACME 模块管理的证书和私钥 (使用变量 $acme_certificate 和 $acme_certificate_key)
ssl_certificate $acme_certificate;
ssl_certificate_key $acme_certificate_key;
# (可选但推荐) 配置 SSL 证书缓存,提升性能
ssl_certificate_cache max=2;
# ... 你网站的其他配置 (例如 root, index, PHP 处理等) ...
}
acme_certificate letsencrypt;
: 这是核心魔法指令! 它告诉 Nginx:这个server
块(对应server_name
指定的域名)的证书,交给第一步定义的letsencrypt
签发者去 自动申请、续期和管理。ssl_certificate $acme_certificate;
和ssl_certificate_key $acme_certificate_key;
: 这两行不再是写死证书文件路径,而是使用 Nginx ACME 模块提供的 特殊变量。模块会自动将申请/续期到的证书和私钥内容通过这两个变量提供给 SSL 配置使用。这是实现自动化的关键!ssl_certificate_cache max=2;
: (可选但推荐) 配置 SSL 证书缓存。max=2
表示在内存中最多缓存 2 个 worker 进程的证书信息,可以显著提高 HTTPS 连接建立的性能。
🔍 第四步:测试 & 重启 Nginx
- 检查配置语法:运行命令
sudo nginx -t
。这是超级重要的一步!它会检查你的配置文件有没有语法错误。看到syntax is ok
和test is successful
才说明配置正确。 - (可选) 创建状态目录:如果第一步
state_path
指定的目录(如/var/cache/nginx/acme-letsencrypt
)还不存在,手动创建它,并确保 Nginx 用户(如nginx
或www-data
)对这个目录 拥有读写权限:sudo mkdir -p /var/cache/nginx/acme-letsencrypt sudo chown nginx:nginx /var/cache/nginx/acme-letsencrypt # 根据你的Nginx用户调整 sudo chmod 700 /var/cache/nginx/acme-letsencrypt # 更严格的权限
- 重启 Nginx:运行
sudo systemctl restart nginx
或sudo nginx -s reload
让新配置生效。
🎉 见证奇迹的时刻
- 当你第一次访问配置好的 HTTPS 网站 (
https://yourdomain.com
) 时,Nginx ACME 模块检测到还没有证书,它会 自动触发 向 Let’s Encrypt 申请证书的流程。 - 这个过程需要几秒到几十秒(取决于网络和验证速度)。第一次访问可能会稍慢一点或短暂报错(如 SSL 握手错误),这是正常的。稍等片刻再刷新,证书应该就生效了!
- 以后证书快到期(Let’s Encrypt 证书有效期是 90 天),Nginx 模块会 自动在后台续期,完全不用你操心!
🔎 查看日志确认
- 查看 Nginx 的错误日志(通常是
/var/log/nginx/error.log
),搜索关键词acme
。你会看到模块工作的详细记录,比如申请证书、续期证书的状态信息。 - 成功日志示例:
[notice] acme: certificate for "yourdomain.com" issued successfully [notice] acme: certificate for "yourdomain.com" renewed successfully
📌 重要注意事项
- 80 端口必须开放:HTTP-01 验证依赖 80 端口。务必确保你的防火墙和安全组允许公网访问你服务器的 80 端口。否则验证会失败!
- 域名解析必须正确:
server_name
里填写的域名,必须已经正确解析 (A
或AAAA
记录) 到你当前配置的这台 Nginx 服务器的公网 IP 地址上。 - 首次访问延迟:配置好重启 Nginx 后,第一次通过 HTTPS 访问网站时,Nginx 需要先申请证书,所以可能会有一个短暂的延迟(几秒到几十秒)。如果立即访问报 SSL 错误,稍等几秒再刷新。
state_path
权限:这是 最常见的问题来源!务必确保你指定的state_path
目录存在,并且 Nginx 的工作进程用户(如nginx
,www-data
)对这个目录拥有完全的读写权限 (rwx
)。权限不对会导致申请或续期失败。- Nginx 版本:确认你安装或编译的 Nginx 版本 包含了
ngx_http_acme_module
模块(可以用nginx -V
命令查看输出的模块列表)。这个功能在比较新的 Nginx 稳定版或主线版中才引入。 - 生产环境谨慎:强烈建议先在测试环境或非关键业务上验证成功,再应用到生产服务器。
- 未来变化:有消息称 Let’s Encrypt 未来可能会测试或采用更短有效期的证书(如 6 天)。这恰恰证明了 自动化续期 功能的重要性!Nginx 原生支持这个功能,简直是及时雨,让我们完全不用担忧未来证书管理的变化。
💎 总结
Nginx 原生集成 Let’s Encrypt ACME 自动证书管理,绝对是 Web 服务器领域的一次重大进步!只需三步配置:
- 设定好证书颁发者和状态存储路径 (
acme_issuer
+state_path
+ 共享内存)。 - 配置好 HTTP 验证通道 (开 80 端口 + 特殊
location
处理挑战)。 - 在 HTTPS 站点启用自动证书管理 (
acme_certificate
+ 使用变量$acme_certificate
/$acme_certificate_key
)。
设置完成后,首次访问自动申请证书,到期前自动续期,真正实现 “配置一次,永久有效”。快去试试吧,和手动更新证书的繁琐操作说再见!🥳