Вопрос или проблема
Попытка на 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
.
Возможные причины проблемы и их решения:
-
Конфигурация путей:
Ваша конфигурация 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]
-
Корректный серверный путь:
Иногда, когда вы запускаете Drupal в подкаталоге, как в вашем случае, необходимо установить некоторые параметры конфигурации в самом Drupal.Убедитесь, что в вашем файле
settings.php
вы установили корректные базовые URL и пути:$base_url = 'http://EC2-IP/c1'; // Для первого контейнера
Для других контейнеров замените
c1
наc2
иc3
соответственно. -
Проблемы с кэшированием:
Убедитесь, что кэширование в Docker-контейнерах не вызывает проблем. Попробуйте очистить кэш Drupal, если у вас есть доступ к Drush или к административному интерфейсу.Использование Drush:
docker exec c1 drush cr
-
Проблемы с файлами и правами:
Убедитесь, что ваш контейнер имеет доступ к необходимым файлам и директориям. Проверьте права на выполнение, особенно на директорииsites/default/files
. -
Проверка логов:
Посмотрите на логи HAProxy и на логи контейнера Drupal для более детальной информации о том, что может быть не так.Логи HAProxy:
tail -f /var/log/haproxy.log
Логи контейнера Drupal:
docker logs c1
-
Проверка сетевых настроек:
Убедитесь, что нет сетевых проблем между контейнерами и HAProxy, и что все порты открыты и доступ к ним разрешен.
Если после выполнения данных шагов проблема останется нерешенной, попробуйте запустить контейнеры без HAProxy для проверки функциональности. Это поможет понять, связано ли это с настройками HAProxy или с конфигурацией самой установки Drupal.