Манипуляция путём Haproxy - PullRequest
0 голосов
/ 12 марта 2020

В Google Cloud Platform у нас есть haproxy, который служит прокси для нашей внутренней VPN и выполняет перенаправления URL-адресов с GCP DNS на proxy.mycompany.com (наш haproxy), где мы делаем дальнейшие манипуляции.

Haproxy от изображения 2.0.8-alpine

Nginx основано на изображении 1-alpine

В последнее время я установил nginx, который обслуживает данные c files.

Nginx настроен для autoindex on, доступен по URL static-files.mycompany.com и настроен для показа root gcs-bucket. Поэтому, если вы зайдете на static-files.mycompany.com, вы увидите содержимое gcs-bucket:

  • каталог static-files
  • любой файл в корзине.

Каталог static-files содержит stati c файлы веб-сайта, сгенерированные hu go. Эти файлы содержат пути, такие как /docu/file.md

Мне удалось настроить haproxy, чтобы он перенаправлял любые запросы на URL website.mycompany.com на static-files.mycompany.com/static-files и отображал сгенерированный веб-сайт stati c, настроив его в backend section конфигурации haproxy:

acl p_root path -i /
http-request set-path /static-files/\1 if p_root

Каждый раз, когда я посещаю website.mycompany.com, путь перенаправляется на website.mycompany.com/static-files (что на самом деле static-files.mycompany.com/static-files)

Однако сайт не работает :

  • css не загружается, файл находится в / и запросы нацелены на website.mycompany.com/mycss.file, но файл можно найти в website.mycompany.com/static-files/mycss.file из-за манипуляции пути выше
  • Каждая ссылка на сайте не работает, запрашивает website.mycompany.com/my-link-to-file, но файл находится под website.mycompany.com/static-files/my-link-to-file

У меня ограниченная возможность настроить haproxy, скорее всего, я могу добавить параметры в существующие разделы бэкэнда и внешнего интерфейса здесь я предоставляю параметры, которые я не могу изменить :

    global
    log stdout format raw local0 info
    maxconn  30000
    tune.ssl.default-dh-param 2048
resolvers vpc
    parse-resolv-conf
    hold valid 120s
defaults
    mode    http
    log     global
    option  dontlognull
    #option  tcplog
    option  httplog
    option  forwardfor
    option  redispatch
    maxconn 3000
    retries 3
    timeout connect 5s
    timeout client  50s
    timeout server  50s
    timeout tunnel  1h
    timeout client-fin 30s
    timeout http-keep-alive 4s
    balance roundrobin
    default-server check resolvers vpc
    default-server on-marked-down shutdown-sessions
    default-server max-reuse 100

frontend http
    bind *:80
    redirect scheme https code 302 if !{ ssl_fc }
    monitor-uri /_healtz
    use_backend %[hdr(host),lower]

frontend https
    bind *:443 ssl no-sslv3 crt /config/haproxy_certificate.pem alpn http/1.1,h2
    http-response add-header Via 1.1\ %[env(HOSTNAME)]
    http-request add-header Via 1.1\ %[env(HOSTNAME)]
    http-request add-header X-Forwarded-Proto https
    http-request capture req.hdr(Host) len 40
    http-request capture req.hdr(User-Agent) len 120
    use_backend %[hdr(host),lower]

backend proxy.mycompany.com
    stats enable
    stats uri /

Я хотел бы добиться следующего:

Посещая website.mycompany.com I будет перенаправлен на static-files.mycompany.com/static-files в фоновом режиме, однако URL останется website.mycompany.com, и, следовательно, сгенерированные пути к веб-сайту stati c будут работать, как и сайт stati c. Или я ошибаюсь?

Я открыт для любых разумных предложений.

спасибо

1 Ответ

0 голосов
/ 20 марта 2020

Ну, это было довольно просто в конце

http-request replace-uri ([^/:]*://[^/]*)?(.*) \1/static-files\2

Сделал трюк.

edit:

, чтобы избежать и бесконечное l oop of / stati c -файлы / данные c -файлы /

    acl remove_static-files path_beg -i /architecture-diagrams
    http-request replace-uri ([^/:]*://[^/]*)?(.*) \1/static-files\2 if !remove_static-files
...