Том GlusterFS зависает/блокируется после быстрого доступа к файлам сеанса PHP из контейнера PHP Docker
2021-10-05 ОБНОВЛЕННЫЙ ВОПРОС И ТЕКСТ ПОСЛЕ ДОПОЛНИТЕЛЬНОГО АНАЛИЗА, СОКРАЩЕННЫЙ ДО МИНИМАЛЬНОГО СЛУЧАЯ
Краткое описание
Кластер Nomad/Consul работает, а Traefik (с минимальной настройкой) является системной задачей на каждом клиенте Nomad. На данный момент есть 3 кочующих сервера, 3 консульских сервера, 3 кочующих клиента и 3 сервера Gluster. Настройка очень похожа на эту статью по настройке кластера Nomad/Consul.
Основные изображения и сайты работают хорошо.
Проблема
Я начал портировать первый более крупный сайт на основе PHP (с большим количеством загрузок зависимостей страниц на сайте) в этот кластер и столкнулся со странной проблемой, которую я обнаружил, но не могу решить должным образом.
Задачи загружаются хорошо и регистрируются как в Consul, Traefik и Nomad. Небольшие страницы (с небольшим количеством зависимостей) работают хорошо.
Всякий раз, когда на страницу загружается слишком много зависимостей, Apache останавливает эти конкретные соединения.
Когда я открываю новое окно браузера в режиме инкогнито и перехожу по URL-адресу, загружается главная страница и около 10-15 зависимостей. Остальные остаются в состоянии ожидания в браузере. Статус браузера продолжает «вращаться» (как при загрузке). Закрытие окна и открытие нового позволяет мне повторить процесс.
Я объяснил проблему тем, что каталог сеансов PHP сопоставляется (через Docker) с каталогом при монтировании GlusterFS.
Перемещение сопоставления томов в другой каталог, расположенный на том же сервере, устраняет проблему, и сайт загружается должным образом.
Вывод: взаимодействие между томами Docker и монтированием Gluster вызывает проблемы при «большой нагрузке». Всего несколько запросов и все работает хорошо. При большом количестве запросов на доступ к файлу сеанса PHP все останавливается и не восстанавливается.
Вопрос: Вероятно, это вызвано либо проблемой конфигурации Gluster, либо тем, как настроено монтирование в /etc/fstab. Пожалуйста, помогите решить эту проблему!
ИЗОЛЯЦИЯ
В конфигурации PHP изображений для каталога сеансов PHP установлено значение /var/php_session , а в Nomad/Docker он сопоставлен с /data/storage/test/php_sessions.
Каталог /data/storage/test/php_sessions принадлежит пользователю 20000, чтобы гарантировать, что все узлы имеют доступ к одним и тем же сеансам PHP:
client:/data/storage/test$ ls -ln .
drwxr-xr-x 2 20000 20000 6 Oct 5 14:53 php_sessions
drwxr-xr-x 2 20000 20000 6 Oct 5 14:53 upload
При изменении сопоставления томов кочевника (в /etc/nomad/nomad.hcl ) с:
client {
host_volume "test-sessions" {
path = "/data/storage/test/php_sessions"
read_only = false
}
}
к
client {
host_volume "test-sessions" {
path = "/tmp/php_sessions"
read_only = false
}
}
(И убедитесь, что /tmp/php_sessions также принадлежит пользователю 20000)
Все снова работает.
Подробные данные (Более подробная информация по запросу)
Содержимое /etc/fstab:
LABEL=cloudimg-rootfs / ext4 defaults 0 1
LABEL=UEFI /boot/efi vfat defaults 0 1
gluster-01,gluster-02,gluster-03:/storage /data/storage glusterfs _netdev,defaults,direct-io-mode=disable,rw
Dockerfile для образа сайта:
FROM php:7.4.1-apache
ENV APACHE_DOCUMENT_ROOT /var/www/htdocs
WORKDIR /var/www
RUN docker-php-ext-install mysqli pdo_mysql
# Make Apache root configurable
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
# Listen on port 1080 by default for non-root user
RUN sed -ri 's/Listen 80/Listen 1080/g' /etc/apache2/ports.conf
RUN sed -ri 's/:80/:1080/g' /etc/apache2/sites-enabled/*
# Use own config
COPY data/000-default.conf /etc/apache2/sites-enabled/
# Enable Production ini
RUN cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
RUN a2enmod rewrite && a2enmod remoteip
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
COPY --chown=www-data:www-data . /var/www
RUN /usr/local/bin/composer --no-cache --no-ansi --no-interaction install
# Finally add security changes
COPY data/changes.ini /usr/local/etc/php/conf.d/
В файле кочевника указано, что вызывает проблему: со следующим планом работы Nomad:
job "test" {
datacenters = ["dc1"]
group "test-staging" {
count = 1
network {
port "php_http" {
to = 1080
}
}
volume "test-sessions" {
type = "host"
read_only = false
source = "test-sessions"
}
volume "test-upload" {
type = "host"
read_only = false
source = "test-upload"
}
service {
name = "test-staging"
port = "php_http"
tags = [
"traefik.enable=true",
"traefik.http.routers.test.php_staging.rule=Host(`staging.xxxxxx.com`)",
]
check {
type = "tcp"
port = "php_http"
interval = "5s"
timeout = "2s"
}
}
task "test" {
driver = "docker"
user = "20000"
config {
image = "docker-repo:5000/test/test:latest"
ports = ["php_http"]
}
volume_mount {
volume = "test-sessions"
destination = "/var/php_sessions"
read_only = false
}
volume_mount {
volume = "test-upload"
destination = "/var/upload"
read_only = false
}
template {
data = <<EOF
1.2.3.4
EOF
destination = "local/trusted-proxies.lst"
}
}
}
}