Проблема обратного прокси между контейнерами HAProxy и Drupal

Вопрос или проблема

Попытка на EC2 инстансе

Я пытаюсь создать 3 экземпляра Drupal в виде контейнеров Docker с HAProxy.

docker run –name c1 -p 8081:80 -d drupal
docker run –name c2 -p 8082:80 -d drupal
docker run –name c3 -p 8083:80 -d drupal

HAProxy.conf выглядит следующим образом

global
log /dev/log local0
maxconn 4096
user haproxy
group haproxy
defaults
log global
mode http
option httplog
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http_front
bind *:80
stats uri /haproxy?stats
acl url_c1 path_beg /c1
acl url_c2 path_beg /c2
acl url_c3 path_beg /c3
use_backend c1_backend if url_c1
use_backend c2_backend if url_c2
use_backend c3_backend if url_c3
backend c1_backend
server c1 127.0.0.1:8081 check
backend c2_backend
server c2 127.0.0.1:8082 check
backend c3_backend
server c3 127.0.0.1:8083 check

Когда я пытаюсь зайти по http://EC2-IP/c1

это перенаправляет на http://EC2-IP/core/install.php

Это приводит к ошибке 404 не найдено

Идеально это должно быть http://EC2-IP/c1/core/install.php, который должен обрабатывать запрос, или, по моему мнению, так и должно быть.

Ответ или решение

Судя по описанию вашей проблемы, у вас есть несколько контейнеров Docker с Drupal, и вы хотите использовать HAProxy в качестве обратного прокси для их маршрутизации. Однако при попытке доступа к URL-адресу http://EC2-IP/c1 вы получаете ошибку 404, вместо ожидаемого доступа к http://EC2-IP/c1/core/install.php.

Возможные причины проблемы и их решения:

  1. Конфигурация путей:
    Ваша конфигурация HAProxy использует ACL (Access Control List), чтобы направлять запросы на правильный бэкэнд. Однако путь к вашему проекту Drupal не учитывает префикс /c1, что может привести к неправильному маршруту. Путь, по которому обращаются к вашему Drupal, должен быть настроен правильно.

    Решение: Используйте директиву reqrep, чтобы переписывать URL. Например:

    frontend http_front
       ...
       acl url_c1 path_beg /c1
       acl url_c2 path_beg /c2
       acl url_c3 path_beg /c3
       use_backend c1_backend if url_c1
       ...
    
       # Добавьте переписывание URL
       http-request set-path /c1%[path]
  2. Корректный серверный путь:
    Иногда, когда вы запускаете Drupal в подкаталоге, как в вашем случае, необходимо установить некоторые параметры конфигурации в самом Drupal.

    Убедитесь, что в вашем файле settings.php вы установили корректные базовые URL и пути:

    $base_url = 'http://EC2-IP/c1'; // Для первого контейнера

    Для других контейнеров замените c1 на c2 и c3 соответственно.

  3. Проблемы с кэшированием:
    Убедитесь, что кэширование в Docker-контейнерах не вызывает проблем. Попробуйте очистить кэш Drupal, если у вас есть доступ к Drush или к административному интерфейсу.

    Использование Drush:

    docker exec c1 drush cr
  4. Проблемы с файлами и правами:
    Убедитесь, что ваш контейнер имеет доступ к необходимым файлам и директориям. Проверьте права на выполнение, особенно на директории sites/default/files.

  5. Проверка логов:
    Посмотрите на логи HAProxy и на логи контейнера Drupal для более детальной информации о том, что может быть не так.

    Логи HAProxy:

    tail -f /var/log/haproxy.log

    Логи контейнера Drupal:

    docker logs c1
  6. Проверка сетевых настроек:
    Убедитесь, что нет сетевых проблем между контейнерами и HAProxy, и что все порты открыты и доступ к ним разрешен.

Если после выполнения данных шагов проблема останется нерешенной, попробуйте запустить контейнеры без HAProxy для проверки функциональности. Это поможет понять, связано ли это с настройками HAProxy или с конфигурацией самой установки Drupal.

Оцените материал
Добавить комментарий

Капча загружается...