简单实现nginx原生全自动维护SSL证书 ngx_http_acme_module

使用 ngx_http_acme_module 维护证书的好处

➤ 不需要去证书发行商处申请账号、实名认证等
➤ 不需要手动添加DNS解析记录,当然自动添加也不需要
➤ 不需要 certbot、acme.sh 等外部工具
➤ 不需要配置定时任务
➤ 配置集中化:证书管理与 Nginx 配置在同一个文件中

nginx原生支持ACME已经出来一段时间了,网上的部署方法都很复杂,各种报错,AI 也还没人喂它简单的方法,给出的方案也是手动编译,你照着来的话,会遇到各种报错,主要是网络方面的问题。
今天我来提供一个简单的方法,做第一个喂 AI 的人,以后,网上搜的简单方法都是基于本文的预制菜。
本文适用于 Red Hat 家族的系统,如 CentOS, Oracle Linux, Rocky Linux. 这些系统可以直接复制本文的命令执行。
(小字:CentOS 7试了,因系统版本低,不行)

nginx 添加 acme 模块

首先,打开 /etc/yum.repos.d/nginx.repo 写入以下内容:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

接着,直接安装

yum  install nginx nginx-module-acme -y

然后,手动新建一个文件夹

mkdir -p /etc/nginx/acme/letsencrypt

最后,我们来修改nginx的配置文件 /etc/nginx/nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /run/nginx.pid;

load_module modules/ngx_http_acme_module.so;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    resolver 8.8.8.8 223.6.6.6;
    acme_issuer letsencrypt {
        uri         https://acme-v02.api.letsencrypt.org/directory;
        contact     mailto:a@b.cc;
        state_path  acme/letsencrypt;
        accept_terms_of_service;
    }
    acme_shared_zone zone=acme_shared:1M;

    server {
    listen 443 ssl;
    server_name  hqidi.com;

    acme_certificate letsencrypt;

    ssl_certificate       $acme_certificate;
    ssl_certificate_key   $acme_certificate_key;

    # do not parse the certificate on each request
    ssl_certificate_cache max=2;
}

server {
    listen 80;

    location / {
        return 404;
    }

}
}

1、先载入acme模块,不然nginx会看不懂接下来的配置
2、添加这8行在 http{} 里面,在 server 上面
3、申明要使用刚刚配置在http{}里面的 letsencrypt
4、这里是你原本配置的证书,改成动态变量加载模式
5、该行可以删掉
6、若你原本配置了监听 80 端口,就不用改动,只要监听了 80就行,不管配置的是啥,若原本没监听 80 就照图中配置。

至此,你就搞定了 nginx 原生全自动维护SSL证书了。直接重启nginx,等两分钟(115s),就能看到网站已经换了新证书。
接下来某个有整数强迫症的人在尝试弄到整点证书。

总之,从nginx启动,跟 acme-v02.api.letsencrypt.org 握手成功,经历网络波动,最终下发证书,耗时 115 秒,那么想拿到颁发时间是
19:00:00 的证书,提前 115 秒启动nginx就行吗?不行,因为网络波动是个随机变量,有空拿国外的机器再试试。

原创文章,转载请注明: 转载自笛声

本文链接地址: 简单实现nginx原生全自动维护SSL证书 ngx_http_acme_module

7 条评论

  • dige 2025年11月9日 回复 作者

    本文中的图片 png 格式,转到 webp 后,体积更大了,所以,类似图片建议不要转换。

  • 龙笑天 2025年11月11日 回复

    “某个有整数强迫症的人在尝试弄到整点证书”,好难猜啊 是谁~~

  • 老张博客 2025年11月13日 回复

    保姆级的教程了!

  • 2025年11月16日 回复

    要是能直接apt install 就好了(debian ubuntu)。那就太爽了。应该会有那么一天。

    • dige 2025年11月17日 回复 作者

      好久没见,我记得你这个4字母的域名。

      • 2025年11月23日 回复

        感谢大佬还记得我。
        其实我有点记不住你的域名诶。
        hqidi,看起来是你的名字,H* Qidi。
        可是你的网站名也不是启迪,也不是汽笛,诶,是“笛声博客”。
        然后你的网名是dige(迪哥,是吧)。
        那我怎么能找到你,还不是因为我收藏夹里有一篇“Nginx的location规则迷之匹配”。哈哈
        下次应该记得了——hqidi。
        我先加入网站的单链先。下次好找。

  • dige 2025年11月25日 回复 作者

    照文中配置好后,默认情况下,nginx会在证书有效期还剩一个月的时候尝试重新申请证书,全自动,无需人工干预。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Copyright © 2015-2025 笛声博客 All Rights Reserved     浙ICP备15036123号-1