在单个服务器上使用 HTTPS 托管多个网站
在单个服务器上使用 HTTPS 托管多个网站
参考自单个服务器使用https托管多个网站
首先需要编写一个docker-compose.yml文件
version: '3'
services:
nginx:
image: nginx
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
container_name: nginx
restart: unless-stopped
logging:
options:
max-size: "10m"
max-file: "3"
ports:
- "80:80"
- "443:443"
volumes:
- /home/user/nginx-proxy/conf.d:/etc/nginx/conf.d // /home/user/nginx-proxy/ 这一截可以自己根据路径进行修改
- /home/user/nginx-proxy/vhost.d:/etc/nginx/vhost.d
- /home/user/nginx-proxy/html:/usr/share/nginx/html
- /home/user/nginx-proxy/certs:/etc/nginx/certs:ro
nginx-gen:
image: jwilder/docker-gen
command: -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf
container_name: nginx-gen
restart: unless-stopped
volumes:
- /home/user/nginx-proxy/conf.d:/etc/nginx/conf.d
- /home/user/nginx-proxy/vhost.d:/etc/nginx/vhost.d
- /home/user/nginx-proxy/html:/usr/share/nginx/html
- /home/user/nginx-proxy/certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
- /home/user/nginx-proxy/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
nginx-letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: nginx-letsencrypt
restart: unless-stopped
volumes:
- /home/user/nginx-proxy/conf.d:/etc/nginx/conf.d
- /home/user/nginx-proxy/vhost.d:/etc/nginx/vhost.d
- /home/user/nginx-proxy/html:/usr/share/nginx/html
- /home/user/nginx-proxy/certs:/etc/nginx/certs:rw
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
NGINX_DOCKER_GEN_CONTAINER: "nginx-gen"
NGINX_PROXY_CONTAINER: "nginx"
networks:
default:
external:
name: nginx-proxy //这个名称可以自己取,但是下文所有的nginx-proxy都需要自己替换
docker network create nginx-proxy
docker network ls
systemctl restart docker
docker-compose up -d
其次,需要下载nginx.tmpl文件
wget https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl
注意,这两个文件夹在一个文件夹下,并且,就是前面/home/user/nginx-proxy/ 这个文件夹下面。
这是路径图:
[root@localhost nginx-proxy]# tree
├── docker-compose.yml
├── nginx.tmpl
就是一个文件夹下,别的啥也不用。
然后,创建一个docker的网络:
docker network create nginx-proxy //名称和前面对应
最后,docker compose
docker-compose up -d
然后就会自己创建一些文件夹。
[root@localhost nginx-proxy]# tree
.
├── certs
│ ├── default.crt
│ ├── default.key
│ ├── dhparam.pem
├── conf.d
│ └── default.conf
├── docker-compose.yml
├── html
│ └── index.html
├── nginx.tmpl
└── vhost.d
└── default
此时,3个镜像应该都是处于运行状态。
nginx nginx-gen nginx-letsencrypt
后面的操作,任意选择文件夹即可。和前面的毫不相关。
[root@localhost test3]# tree
.
├── docker-compose.yml
└── index.html
0 directories, 2 files
[root@localhost test3]#
index.html是什么,就不用解释了。
看docker-compose.yml
version: '2'
services:
app:
image: nginx
volumes:
- .:/usr/share/nginx/html //注意,不同的web服务器,这个路径不一样。
//比如是httpd的话。就是这个 - ./website:/usr/local/apache2/htdocs/ 根据bing生成的,具体的,自己测试也就好了。
environment:
- VIRTUAL_HOST=example.com
- VIRTUAL_PORT:80
- LETSENCRYPT_HOST=example.com
expose:
- 80
- 443
networks:
- nginx-proxy
networks:
nginx-proxy:
external: true
docker compose一下
docker-compose up -d
此时,你可以去看看之前的nginx-proxy的里面一些文件产生了变化,尤其是conf.d里面那个default.conf文件,这就是所谓的自动添加配置。
最后修改主机的hosts文件,自己解析example.com到虚拟机的IP地址。
使用域名访问80端口,没问题,但是443端口就出错了。然后看了下default.conf,就发现没有证书文件,只是创建了目录,然后去看生成证书那个容器的日志
example.com:Verify error:DNS problem: NXDOMAIN looking up A for swjnxyf.org - check that a DNS record exists for this domain; DNS problem: NXDOMAIN looking up AAAA for swjnxyf.org - check that a DNS record exists for this domain
这种时候,bing还是好用的。
根据我查到的信息,jrcs/letsencrypt-nginx-proxy-companion是一个Docker镜像,用于为nginx-proxy提供自动化的Let's Encrypt证书生成和管理¹。这个镜像使用simp_le客户端来与Let's Encrypt的ACME服务器通信,申请和续期证书²。
如果您只想在内网使用这个域名,您可能无法强制生成证书,因为Let's Encrypt的ACME服务器需要能够访问您的域名,验证您对它的控制权,才能颁发证书³。如果您的域名没有在公网上解析,或者解析到了一个内网地址,ACME服务器就无法验证您的域名,从而导致错误。
有几种可能的解决方案:
- 您可以在公网上解析您的域名,让ACME服务器能够访问它,然后使用jrcs/letsencrypt-nginx-proxy-companion生成证书。这样,您就可以在内网使用这个域名,并享受HTTPS的安全性。
- 您可以使用其他的ACME客户端,例如acme.sh或certbot,来生成证书,并使用DNS验证方式来验证您的域名。这样,您不需要在公网上解析您的域名,只需要在DNS服务商那里添加一些TXT记录即可。然后,您可以把生成的证书复制到nginx-proxy所在的容器中,或者使用其他方式来配置HTTPS。
- 您可以使用自签名证书或其他CA颁发的证书来为您的域名提供HTTPS服务。这样,您不需要依赖Let's Encrypt或其他ACME服务商来生成证书,但是您可能需要手动更新证书,并且可能遇到浏览器不信任您的证书的问题。
更多关于jrcs/letsencrypt-nginx-proxy-companion的信息,您可以参考以下网页:
¹ jrcs/letsencrypt-nginx-proxy-companion - Docker Hub
² jrcs/letsencrypt-nginx-proxy-companion - Docker Hub
³ "jrcs/letsencrypt-nginx-proxy-companion" docker image: too many certificates already issued for exact set of domains - Stack Overflow
源: 与必应的对话, 2023/6/6
(1) jrcs/letsencrypt-nginx-proxy-companion - Docker Hub. https://hub.docker.com/r/jrcs/letsencrypt-nginx-proxy-companion/.
(2) jrcs/letsencrypt-nginx-proxy-companion - Docker Hub. https://hub.docker.com/r/jrcs/letsencrypt-nginx-proxy-companion/dockerfile.
(3) "jrcs/letsencrypt-nginx-proxy-companion" docker image: too many .... https://stackoverflow.com/questions/66102225/jrcs-letsencrypt-nginx-proxy-companion-docker-image-too-many-certificates-alr.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律