好消息!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

  1. 检查配置语法:运行命令 sudo nginx -t。这是超级重要的一步!它会检查你的配置文件有没有语法错误。看到 syntax is ok 和 test is successful 才说明配置正确。
  2. (可选) 创建状态目录:如果第一步 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 # 更严格的权限
  3. 重启 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

📌 重要注意事项

  1. 80 端口必须开放:HTTP-01 验证依赖 80 端口。务必确保你的防火墙和安全组允许公网访问你服务器的 80 端口。否则验证会失败!
  2. 域名解析必须正确server_name 里填写的域名,必须已经正确解析 (A 或 AAAA 记录) 到你当前配置的这台 Nginx 服务器的公网 IP 地址上。
  3. 首次访问延迟:配置好重启 Nginx 后,第一次通过 HTTPS 访问网站时,Nginx 需要先申请证书,所以可能会有一个短暂的延迟(几秒到几十秒)。如果立即访问报 SSL 错误,稍等几秒再刷新
  4. state_path 权限:这是 最常见的问题来源!务必确保你指定的 state_path 目录存在,并且 Nginx 的工作进程用户(如 nginxwww-data)对这个目录拥有完全的读写权限 (rwx)。权限不对会导致申请或续期失败。
  5. Nginx 版本:确认你安装或编译的 Nginx 版本 包含了 ngx_http_acme_module 模块(可以用 nginx -V 命令查看输出的模块列表)。这个功能在比较新的 Nginx 稳定版或主线版中才引入。
  6. 生产环境谨慎强烈建议先在测试环境或非关键业务上验证成功,再应用到生产服务器。
  7. 未来变化:有消息称 Let’s Encrypt 未来可能会测试或采用更短有效期的证书(如 6 天)。这恰恰证明了 自动化续期 功能的重要性!Nginx 原生支持这个功能,简直是及时雨,让我们完全不用担忧未来证书管理的变化。

💎 总结

Nginx 原生集成 Let’s Encrypt ACME 自动证书管理,绝对是 Web 服务器领域的一次重大进步!只需三步配置:

  1. 设定好证书颁发者和状态存储路径 (acme_issuer + state_path + 共享内存)。
  2. 配置好 HTTP 验证通道 (开 80 端口 + 特殊 location 处理挑战)。
  3. 在 HTTPS 站点启用自动证书管理 (acme_certificate + 使用变量 $acme_certificate / $acme_certificate_key)。

设置完成后,首次访问自动申请证书,到期前自动续期,真正实现 “配置一次,永久有效”。快去试试吧,和手动更新证书的繁琐操作说再见!🥳

分类于:

未分类,