在单个服务器上使用 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个镜像应该都是处于运行状态。

image-20230606211048218

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.

反正很奇怪,后来我用了自己购买的可以正常使用的域名,还是失败。可能墙内墙外不是一个世界吧。不知道用国外的域名是不是就ok。

总的来说,加深了对docker compose的理解,本来想着内网能https好像也挺有意思的,既然不行,那就算了。

posted @ 2023-06-06 21:23  念秋  阅读(21)  评论(0编辑  收藏  举报