У меня есть один домен с несколькими поддоменами. Все они указывают на мой VPS. Я использую docker в режиме роя для запуска своих веб-сервисов и моего (HA) прокси. Я также использую Certbot / Let's Encrypt в автономном режиме для получения сертификата для моего домена.
Кажется, все работает нормально, кроме конфигурации HAproxy для certbot. Вот моя конфигурация HAProxy:
defaults
mode http
log global
option httplog
option dontlognull
timeout check 5s
timeout connect 5s
timeout client 50s
timeout client-fin 50s
timeout server 50s
timeout tunnel 1h
resolvers docker
nameserver dns1 127.0.0.11:53
resolve_retries 3
timeout resolve 1s
timeout retry 1s
hold other 10s
hold refused 10s
hold nx 10s
hold timeout 10s
hold valid 10s
hold obsolete 10s
# HTTP(S) frontend
frontend web-in
bind *:80
bind *:443 ssl crt /etc/ssl/haproxy.pem
# test URI to see if its a letsencrypt request
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend be-letsencrypt if letsencrypt-acl
# sub-domains
acl sub1 hdr(host) -i sub1.mydomain.com
acl sub2 hdr(host) -i sub2.mydomain.com
acl sub3 hdr(host) -i sub3.mydomain.com
# figure out which one to use
use_backend be-sub1 if sub1
use_backend be-sub2 if sub2
use_backend be-sub3 if sub3
# Default
default_backend maintenance
# Backend | LE
backend be-letsencrypt
server letsencrypt dockerhost:8888 check resolvers docker init-addr none
# Sub1
backend be-sub1
option forwardfor
http-request add-header X-Forwarded-Proto https
redirect scheme https code 301 if !{ ssl_fc }
server sub1-server webservice1:8080 check resolvers docker init-addr libc,none
# ... Sub2, Sub3 ...
# Default backend
backend maintenance
balance roundrobin
Я ожидаю, что все следующие URL-адреса:
mydomain.com/.well-known/acme-challenge/
sub1.mydomain.com/.well-known/acme-challenge/
sub2.mydomain.com/.well-known/acme-challenge/
sub3.mydomain.com/.well-known/acme-challenge/
разрешится в dockerhost:8888
. Но вместо этого я всегда получаю 503 Service Unavailable
.
Чтобы проверить конфигурацию, я запускаю dockercloud/hello-world
на порту 8888
docker run --rm -d -p 8888:80 dockercloud/hello-world
Я знаю, что разрешение dockerhost:8888
отлично работает, как я может протестировать его со следующей конфигурацией:
# Sub1
backend be-sub1
server letsencrypt dockerhost:8888 check resolvers docker init-addr none
Это означает, что когда я нажимаю на свой домен syb sub1.mydomain.com
, я в конечном итоге получаю dockercloud/hello-world
"Hello world!" стр.
Так почему не работает разрешение на основе пути? Я что-то упустил?
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
use_backend be-letsencrypt if letsencrypt-acl