acme-companion 基础使用指南:为 nginx-proxy 自动化签发与管理 ACME SSL 证书

发布时间:2026/9/27 7:03:04
acme-companion 基础使用指南:为 nginx-proxy 自动化签发与管理 ACME SSL 证书 云原生运维【免费下载链接】acme-companionAutomated ACME SSL certificate generation for nginx-proxy项目地址https://gitcode.com/gh_mirrors/ac/acme-companion点击查看免费下载本指南讲解 acme-companion 与 nginx-proxy 协同部署的最基础、最常用方式通过三个共享卷和一条 Docker 命令让被代理容器自动获得 Lets Encrypt或其他 ACME CA签发的 SSL 证书并在证书续期后自动重载 nginx 配置。读完本文你将掌握 nginx-proxy acme-companion 的完整启动流程、VIRTUAL_HOST/ACME_HOST等关键环境变量的用法以及底层源码中的卷校验、容器发现与证书签发原理。一、部署前的三个卷与一个前提要让 acme-companion 自动为 nginx-proxy 管理的域名签发证书核心思路是通过 Docker 卷在 nginx-proxy 与 acme-companion 两个容器之间共享状态。按 Basic-usage.md 的要求需要准备如下卷卷挂载位置所属容器作用证书卷可写/etc/nginx/certsnginx-proxy存放证书与私钥对 nginx-proxy 而言只读挑战卷可写/usr/share/nginx/htmlnginx-proxy供 acme-companion 写入HTTP-01挑战文件状态卷/etc/acme.shacme-companion存放 acme.sh 的配置与状态ACME 账号、签发记录等前两个卷声明在nginx-proxy容器上通过--volumes-from共享给acme-companion第三个卷/etc/acme.sh声明在acme-companion容器上用于持久化 acme.sh 配置与状态除卷之外还必须将宿主机的 Docker socket 挂载进容器acme-companion 依赖 Docker API 感知被代理容器。关于卷的选型命名卷 / 匿名卷 / 主机目录与文件权限设置请务必阅读 Persistent-data.md否则删除重建容器后证书数据可能丢失。二、Step 1启动 nginx-proxy声明两个共享卷首先启动 nginx-proxy并在其上声明certs与html两个命名卷$ docker run --detach \ --name nginx-proxy \ --publish 80:80 \ --publish 443:443 \ --volume certs:/etc/nginx/certs \ --volume html:/usr/share/nginx/html \ --volume /var/run/docker.sock:/tmp/docker.sock:ro \ nginxproxy/nginx-proxy要点说明--publish 80:80与--publish 443:443是 HTTP-01 挑战的前提Lets Encrypt 要求宿主机在 80 与 443 端口上均公开可达详见 README.md 的 HTTP-01 challenge requirements。若无法满足可改用 DNS-01 挑战见 Lets-Encrypt-and-ACME.md。把宿主机 Docker socket 绑定到容器内的/tmp/docker.sock是nginx-proxy自身的要求其内置的 docker-gen 依赖它感知容器变化并生成 nginx 配置。三、Step 2启动 acme-companion共享卷 自己的状态卷接着启动 acme-companion用--volumes-from nginx-proxy直接继承上一步声明的那两个卷$ docker run --detach \ --name nginx-proxy-acme \ --volumes-from nginx-proxy \ --volume /var/run/docker.sock:/var/run/docker.sock:ro \ --volume acme:/etc/acme.sh \ --env DEFAULT_EMAILmailyourdomain.tld \ nginxproxy/acme-companion要点说明这一次 Docker socket 需要绑定到容器内的/var/run/docker.sockacme-companion 通过它调用 Docker API见下文原理分析。DEFAULT_EMAIL虽然可选但强烈建议设置Lets Encrypt 会通过它向你发送证书到期提醒并允许你恢复 ACME 账号。当被代理容器未单独设置ACME_EMAIL时它还会作为兜底邮箱见 Environment-variables-reference.md 中DEFAULT_EMAIL的说明。启动时容器内部发生了什么源码视角acme-companion 的镜像入口是ENTRYPOINT [/bin/bash, /app/entrypoint.sh]见 Dockerfile。容器启动后会依次执行一系列自检见 entrypoint.shDocker socket 校验check_docker_socket检查DOCKER_HOST默认unix:///var/run/docker.sock对应的 socket 是否存在且可读若缺失会直接报错退出并提示正确的-v写法见 entrypoint.shnginx-proxy 容器发现get_nginx_proxy_container优先通过容器标签com.github.nginx-proxy.nginx识别其次回退到NGINX_PROXY_CONTAINER环境变量再通过解析自身HostConfig.VolumesFrom找到带NGINX_VERSION环境变量的容器——这正是--volumes-from之所以能工作的底层机制见 functions.sh。若找不到会报错并提示三种解决方式卷可写性检查check_writable_directory对/etc/nginx/certs、/etc/acme.sh等目录做写入探针不可写则报错warn_html_directory对/usr/share/nginx/html只给出警告——因为只使用 DNS-01 挑战时该目录可不共享见 entrypoint.sh。四、Step 3启动被代理容器VIRTUAL_HOST ACME_HOST两个基础容器就绪后启动任何想要被代理并启用 SSL 的应用容器需要同时设置两个环境变量$ docker run --detach \ --name your-proxyed-app \ --env VIRTUAL_HOSTsubdomain.yourdomain.tld \ --env ACME_HOSTsubdomain.yourdomain.tld \ nginx两个变量的分工VIRTUAL_HOST控制 nginx-proxy 的反向代理路由由 nginx-proxy 项目处理域名与容器一一对应ACME_HOST控制 acme-companion 的证书签发与 SSL 启用。只有当容器同时设置了这两个变量且域名正确解析到宿主机、宿主机公网可达时证书才会被签发。多域名可用逗号分隔此时会签发 SAN 多域名证书列表第一个域名作为主域名详见 Lets-Encrypt-and-ACME.md 的 Multi-domains certificates 一节。证书签发链路源码视角证书的实际签发由 letsencrypt_service.sh 中的update_cert完成与本文最相关的两个环节HTTP-01 挑战当ACME_CHALLENGE为默认的HTTP-01时update_cert会向 acme.sh 传递--webroot /usr/share/nginx/html见 letsencrypt_service.sh——这就是为什么/usr/share/nginx/html卷必须共享且可写挑战文件要落到这个 nginx 能提供访问的目录续期与重载证书签发/续期成功后create_links会在/etc/nginx/certs下生成域名.crt、域名.key等软链接见 letsencrypt_service.sh随后reload_nginx通过向 docker-gen 容器发送SIGHUP等方式触发 nginx 配置重载见 functions.sh实现证书更新即生效。五、端口暴露与 VIRTUAL_PORT以 Grafana 为例被代理容器必须暴露要被代理的端口二选一即可在 Dockerfile 中使用EXPOSE指令或在docker run/docker create时使用--expose标志。若被代理容器监听并暴露的不是默认的80端口可用VIRTUAL_PORT强制 nginx-proxy 使用该端口。以 Grafana监听并暴露 3000 端口为例$ docker run --detach \ --name grafana \ --env VIRTUAL_HOSTothersubdomain.yourdomain.tld \ --env VIRTUAL_PORT3000 \ --env ACME_HOSTothersubdomain.yourdomain.tld \ --env ACME_EMAILmailyourdomain.tld \ grafana/grafana注意本例额外使用了ACME_EMAIL它是按容器设置的联系邮箱优先于全局的DEFAULT_EMAIL可用于 ACME 账号注册与找回该变量的完整取值与回退规则见 Environment-variables-reference.md 的 Proxied Container Variables 一节。之后对任何其他需要代理的容器重复 Step 3 即可——证书签发、续期与 nginx 重载全部由 acme-companion 自动完成。六、被代理容器的常用环境变量速查以 Environment-variables-reference.md 为准与基础用法直接相关的被代理容器变量包括变量默认值说明ACME_HOST—要签发证书的域名可逗号分隔多域名ACME_EMAILDEFAULT_EMAIL或空该容器的 ACME 联系邮箱VIRTUAL_HOST—nginx-proxy 的路由域名由 nginx-proxy 处理VIRTUAL_PORT80被代理容器实际监听端口ACME_CHALLENGEHTTP-01可改为DNS-01需配合ACMESH_DNS_API_CONFIGACME_KEYSIZE4096RSA 可用2048/3072/4096/8192EC 可用ec-256/ec-384/ec-521ACME_SINGLE_DOMAIN_CERTSfalse为每个域名分别签发独立证书而非一张 SAN 证书七、数据持久化与只读加固基础用法中的certs、html、acme都是命名卷Docker 自动创建并持久化删除重建容器后可重新挂载。若希望进一步加固可以让 nginx 只读证书卷nginx-proxy / docker-gen 容器-v certs:/etc/nginx/certs:roacme-companion 容器-v certs:/etc/nginx/certs:rwacme-companion 默认会把私钥设为600、公钥证书设为644、目录设为755所有权默认 root这些行为可通过FILES_UID、FILES_GID、FILES_PERMS、FOLDERS_PERMS四个变量自定义详见 Persistent-data.md。八、用 Docker Compose 编排推荐替代方案习惯 Compose 的用户可以不使用--volumes-from改为显式挂载卷 标签识别效果等价且更清晰。最小化的两容器示例节选自 Docker-Compose.mdservices: nginx-proxy: image: nginxproxy/nginx-proxy container_name: nginx-proxy ports: - 80:80 - 443:443 labels: - com.github.nginx-proxy.nginx volumes: - certs:/etc/nginx/certs:ro - html:/usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro acme-companion: image: nginxproxy/acme-companion container_name: nginx-proxy-acme environment: - DEFAULT_EMAILmailyourdomain.tld volumes: - certs:/etc/nginx/certs:rw - html:/usr/share/nginx/html:rw - acme:/etc/acme.sh - /var/run/docker.sock:/var/run/docker.sock:ro volumes: certs: html: acme:这里 acme-companion 通过com.github.nginx-proxy.nginx标签定位 nginx-proxy而非--volumes-from这正是 functions.sh 中get_nginx_proxy_container的标签识别路径。若你仍在用volumes_from风格的旧 Compose 文件docker run 的--volumes-from方式依然受支持。九、常见问题与排查要点挑战失败确认宿主机 80/443 端口公网可达、防火墙未封禁 80 端口且域名解析到该主机有 AAAA 记录时还需保证 IPv6 连通性见 README.md 的 HTTP-01 challenge requirements。CAA 记录确保 DNS 服务商能正确应答 CAA 查询不一定需要设置 CAA 记录但应答出错会导致签发失败。找不到 nginx-proxy 容器按启动日志提示使用--volumes-from、NGINX_PROXY_CONTAINER环境变量或com.github.nginx-proxy.nginx标签三者之一建立关联。纯 DNS-01 场景可移除 nginx-proxy 与 acme-companion 之间共享的/usr/share/nginx/html卷详见 Lets-Encrypt-and-ACME.md 的 DNS-01 一节。以上三步nginx-proxy → acme-companion → 被代理容器构成了 acme-companion 的最小可用闭环此后证书的申请、续期、软链接更新与 nginx 重载均自动完成你只需在新增服务时为其设置VIRTUAL_HOST与ACME_HOST。赞分享云原生运维【免费下载链接】acme-companionAutomated ACME SSL certificate generation for nginx-proxy项目地址https://gitcode.com/gh_mirrors/ac/acme-companion点击查看免费下载相关推荐ControlNet FP16模型优化指南如何在有限硬件上实现高效AI图像控制ControlNet FP16模型优化指南如何在有限硬件上实现高效AI图像控制 ControlNet v1 1_fp16_safetensors是一个专门针对计算机视觉3DDFA部署指南从本地开发到生产环境的完整流程3DDFA部署指南从本地开发到生产环境的完整流程 3DDFA是一个基于PyTorch的3D人脸对齐解决方案能够实现全姿态范围内的人脸对齐、三维重建和姿态估计推荐使用acme-companion - 一键自动化SSL证书管理神器推荐使用acme companion 一键自动化SSL证书管理神器 在构建安全的Web服务时拥有可靠的SSL证书是必不可少的一环。今天我要向您推荐一个名为云原生运维上一篇ShrineRuby应用的文件附件处理工具包下一篇引领代码质量新纪元Flake8 - Python 的代码检查利器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询