使用nginx-proxy与acme-companion实现自动化HTTPS配置指南
acme-companion 项目地址: https://gitcode.com/gh_mirrors/acm/acme-companion
项目概述
本文介绍如何利用nginx-proxy与acme-companion容器组合,实现自动化HTTPS证书申请与Nginx反向代理配置的技术方案。这套方案能够为您的Docker容器服务自动申请Let's Encrypt证书并配置HTTPS访问,极大地简化了Web服务的SSL/TLS部署流程。
核心组件说明
1. nginx-proxy容器
- 功能:自动为Docker容器配置Nginx反向代理
- 特点:监听Docker事件,自动生成Nginx配置
2. acme-companion容器
- 功能:自动化管理Let's Encrypt证书
- 特点:与nginx-proxy集成,自动申请、续期SSL证书
详细部署步骤
第一步:部署nginx-proxy容器
nginx-proxy作为反向代理核心,需要配置以下关键参数:
docker run --detach \
--name nginx-proxy \
--publish 80:80 \ # 暴露HTTP端口
--publish 443:443 \ # 暴露HTTPS端口
--volume certs:/etc/nginx/certs \ # 证书存储卷
--volume vhost:/etc/nginx/vhost.d \ # 虚拟主机配置卷
--volume html:/usr/share/nginx/html \ # Web根目录卷
--volume /var/run/docker.sock:/tmp/docker.sock:ro \ # Docker套接字
nginxproxy/nginx-proxy
关键点说明:
- 三个持久化卷(certs/vhost/html)必须配置,用于与acme-companion共享数据
- Docker套接字挂载使得容器能监听Docker事件,实现自动配置
第二步:部署acme-companion容器
acme-companion作为证书管理组件,需要与nginx-proxy共享卷:
docker run --detach \
--name nginx-proxy-acme \
--volumes-from nginx-proxy \ # 共享nginx-proxy的卷
--volume /var/run/docker.sock:/var/run/docker.sock:ro \ # Docker套接字
--volume acme:/etc/acme.sh \ # acme.sh配置存储卷
--env "DEFAULT_EMAIL=mail@yourdomain.tld" \ # 推荐设置默认邮箱
nginxproxy/acme-companion
最佳实践建议:
- 务必设置DEFAULT_EMAIL环境变量,便于证书到期提醒和账户恢复
- acme卷用于持久化存储acme.sh的配置和状态数据
第三步:配置被代理的容器
任何需要HTTPS代理的容器,只需设置两个关键环境变量:
docker run --detach \
--name your-app \
--env "VIRTUAL_HOST=app.yourdomain.tld" \ # 代理域名
--env "LETSENCRYPT_HOST=app.yourdomain.tld" \ # 申请证书的域名
--expose 80 \ # 暴露容器端口
your-application-image
注意事项:
- VIRTUAL_HOST和LETSENCRYPT_HOST必须同时设置且域名一致
- 容器必须暴露(EXPOSE)需要被代理的端口
- 确保域名已正确解析到主机IP且主机可公开访问
高级配置示例
非标准端口应用配置
对于监听非80端口的应用(如Grafana监听3000端口):
docker run --detach \
--name grafana \
--env "VIRTUAL_HOST=grafana.yourdomain.tld" \
--env "VIRTUAL_PORT=3000" \ # 指定应用端口
--env "LETSENCRYPT_HOST=grafana.yourdomain.tld" \
--env "LETSENCRYPT_EMAIL=admin@yourdomain.tld" \ # 可单独设置证书邮箱
--expose 3000 \ # 暴露应用实际端口
grafana/grafana
多域名配置
单个容器支持多个域名的HTTPS配置:
docker run --detach \
--name multi-site-app \
--env "VIRTUAL_HOST=site1.tld,site2.tld" \ # 多域名用逗号分隔
--env "LETSENCRYPT_HOST=site1.tld,site2.tld" \ # 为多个域名申请证书
--expose 80 \
your-multi-site-image
常见问题解答
Q:为什么我的证书没有自动申请? A:请检查:
- 是否同时设置了VIRTUAL_HOST和LETSENCRYPT_HOST
- 域名是否已解析到正确IP
- 主机的80/443端口是否可公开访问
Q:如何验证证书申请过程? A:可以查看acme-companion容器的日志:
docker logs nginx-proxy-acme
Q:证书自动续期如何工作? A:acme-companion内置自动续期机制,默认会在证书到期前自动续期。
总结
通过nginx-proxy与acme-companion的组合,我们实现了Docker容器HTTPS配置的完全自动化。这套方案具有以下优势:
- 自动化证书申请与续期
- 动态Nginx配置生成
- 简化部署流程
- 支持多域名和非标准端口应用
对于需要快速部署HTTPS服务的Docker环境,这是一个高效可靠的解决方案。
acme-companion 项目地址: https://gitcode.com/gh_mirrors/acm/acme-companion
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考