Docker 如何解决停靠反向代理后的LetsEncrypt/Certbot 404?
我在Docker的反向代理后面有几个web域。。。作为上下文,下面是docker-compose.yml中的一个片段:Docker 如何解决停靠反向代理后的LetsEncrypt/Certbot 404?,docker,ssl,nginx,reverse-proxy,certbot,Docker,Ssl,Nginx,Reverse Proxy,Certbot,我在Docker的反向代理后面有几个web域。。。作为上下文,下面是docker-compose.yml中的一个片段: version: '2' services: nginx-proxy: image: jwilder/nginx-proxy container_name: nginxREVERSE ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginxREVERSE
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
site1:
container_name: 'nginxsite1'
image: nginx:latest
volumes:
- ./sites-available/site1.com/index.html:/usr/share/nginx/html/index.html
- ./sites-available/site1.com/nginx.conf:/etc/nginx/conf.d/default.conf
ports:
- 8080:80
environment:
- VIRTUAL_HOST=site1.com,www.site1.com
- VIRTUAL_PORT:80
- VIRTUAL_PORT:443
site2:
container_name: 'nginxsite2'
image: nginx:latest
volumes:
- ./sites-available/site2.com/index.html:/usr/share/nginx/html/index.html
ports:
- 8082:80
environment:
- VIRTUAL_HOST=site2.com,www.site2.com
- VIRTUAL_PORT:80
这在我的浏览器中非常有效。我可以访问site1.com/www.site1.com或site2.com/www.site2.com,并获得正确Index.html页面的代理
Site1.com的nginx.conf文件:
server {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
location ~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
root /usr/share/nginx/html;
index index.html;
}
server {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
location ~ /.well-known/acme-challenge {
alias /usr/share/nginx/html;
try_files $uri =404;
}
root /usr/share/nginx/html;
index index.html;
}
我正在docker中使用以下命令运行Certbot:
sudo docker run -it --rm \
-v /docker-volumes/etc/letsencrypt:/etc/letsencrypt \
-v /docker-volumes/var/lib/letsencrypt:/var/lib/letsencrypt \
-v /docker/letsencrypt-docker-nginx/src/letsencrypt/letsencrypt-site:/data/letsencrypt \
-v "/docker-volumes/var/log/letsencrypt:/var/log/letsencrypt" \
certbot/certbot \
certonly --webroot \
--register-unsafely-without-email --agree-tos \
--webroot-path=/data/letsencrypt \
--staging \
-d site1.com -d www.site1.com
sudo docker run -it --rm \
-v /docker-volumes/etc/letsencrypt:/etc/letsencrypt \
-v /docker-volumes/var/lib/letsencrypt:/var/lib/letsencrypt \
-v /docker/letsencrypt-docker-nginx/src/letsencrypt/letsencrypt-site:/data/letsencrypt \
-v "/docker-volumes/var/log/letsencrypt:/var/log/letsencrypt" \
certbot/certbot \
certonly --webroot \
--register-unsafely-without-email --agree-tos \
--webroot-path=/usr/share/nginx/html \
--staging \
-d site1.com -d www.site1.com
当我从路由器直接将端口转发到site1.com容器时,上面的功能正常
当我将端口转发到反向代理时,我从Certbot获得404错误:
Failed authorization procedure. site1.com (http-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorizatin :: Invalid response from http://site1.com/.well-known/acme-challenge/x05mYoqEiWlrRFH9ye6VZfEiX-mlwEffVt2kP3twoOU: "<html>\r\n<head><ttle>404 Not Found</title></head>\r\n<body>\r\n<center><h1>404 Not Found</h1></center>\r\n<hr><center>nginx/1.15.5</ce", www.site1.com (ttp-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://www.site1/.well-known/acme-challenge/AIDgGYg1WiQRm4-dOVK6fV8-vKqR940nLPzT9poFUZA: "<html>\r\n<head><title>404 Not Found</title></head>\r\n<body>r\n<center><h1>404 Not Found</h1></center>\r\n<hr><center>nginx/1.15.5</ce"
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: site1.com
Type: unauthorized
Detail: Invalid response from
http://site1.com/.well-known/acme-challenge/x05mYoqEiWlrRFH9ye6VZfEiX-mlwEOU:
"<html>\r\n<head><title>404 Not
Found</title></head>\r\n<body>\r\n<center><h1>404 Not
Found</h1></center>\r\n<hr><center>nginx/1.15.5</ce"
Domain: www.site1.com
Type: unauthorized
Detail: Invalid response from
http://www.site1.com/.well-known/acme-challenge/AIDgGYg1WiQRm4-dOVK6fV8-poFUZA:
"<html>\r\n<head><title>404 Not
Found</title></head>\r\n<body>\r\n<center><h1>404 Not
Found</h1></center>\r\n<hr><center>nginx/1.15.5</ce"
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.
授权过程失败。site1.com(http-01):urn:ietf:params:acme:error:unauthorized::客户端缺少足够的authorizatin::来自的响应无效http://site1.com/.well-known/acme-challenge/x05mYoqEiWlrRFH9ye6VZfEiX-mlwEffVt2kP3twoOU: “\r\n404未找到\r\n\r\n404未找到\r\n
nginx/1.15.5您的Site1.com的nginx.conf文件中的质询位置与certbot选项--webroot路径不匹配。这是因为你得到了一个404错误
接下来是可能的修正
Site1.com的nginx.conf文件:
server {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
location ~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
root /usr/share/nginx/html;
index index.html;
}
server {
listen 80;
listen [::]:80;
server_name site1.com www.site1.com;
location ~ /.well-known/acme-challenge {
alias /usr/share/nginx/html;
try_files $uri =404;
}
root /usr/share/nginx/html;
index index.html;
}
docker中的Certbot使用以下命令:
sudo docker run -it --rm \
-v /docker-volumes/etc/letsencrypt:/etc/letsencrypt \
-v /docker-volumes/var/lib/letsencrypt:/var/lib/letsencrypt \
-v /docker/letsencrypt-docker-nginx/src/letsencrypt/letsencrypt-site:/data/letsencrypt \
-v "/docker-volumes/var/log/letsencrypt:/var/log/letsencrypt" \
certbot/certbot \
certonly --webroot \
--register-unsafely-without-email --agree-tos \
--webroot-path=/data/letsencrypt \
--staging \
-d site1.com -d www.site1.com
sudo docker run -it --rm \
-v /docker-volumes/etc/letsencrypt:/etc/letsencrypt \
-v /docker-volumes/var/lib/letsencrypt:/var/lib/letsencrypt \
-v /docker/letsencrypt-docker-nginx/src/letsencrypt/letsencrypt-site:/data/letsencrypt \
-v "/docker-volumes/var/log/letsencrypt:/var/log/letsencrypt" \
certbot/certbot \
certonly --webroot \
--register-unsafely-without-email --agree-tos \
--webroot-path=/usr/share/nginx/html \
--staging \
-d site1.com -d www.site1.com
已尝试将每个容器添加到桥接器网络。。。没有任何更改尝试装载index.html目录而不是index.html,因此请查看它是否会对访问“.well-known/acme challenge/”产生影响。。。不变