Как настроить HAProxy с помощью Certbot / letsencrypt - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть один домен с несколькими поддоменами. Все они указывают на мой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...