Рейтинг:2

Том GlusterFS останавливается/блокируется после быстрого доступа к файлам сеанса PHP из контейнера PHP Docker

флаг in

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 установлен в /var/php_session в конфигурации PHP изображений и сопоставлены в Nomad / Docker с /данные/хранилище/тест/php_sessions.

/данные/хранилище/тест/php_sessions принадлежит пользователю 20000, чтобы убедиться, что все узлы имеют доступ к одним и тем же сеансам PHP:

клиент:/данные/хранилище/тест$ ls -ln .
drwxr-xr-x 2 20000 20000 6 5 окт 14:53 php_sessions
drwxr-xr-x 2 20000 20000 6 5 окт 14:53 загрузить

При изменении сопоставления тома кочевника (в /etc/nomad/nomad.hcl) от:

клиент {

  host_volume "тестовые сеансы" {
    путь = "/данные/хранилище/тест/php_sessions"
    только для чтения = ложь
  }

}

к

клиент {

  host_volume "тестовые сеансы" {
    путь = "/tmp/php_sessions"
    только для чтения = ложь
  }

}

(И убедившись /tmp/php_sessions также принадлежит пользователю 20000)

Все снова работает.

Подробные данные (Подробнее по запросу)

Содержание /etc/fstab:

LABEL=cloudimg-rootfs / ext4 по умолчанию 0 1
LABEL=UEFI /boot/efi vfat по умолчанию 0 1
gluster-01,gluster-02,gluster-03:/storage/data/storage glusterfs _netdev, defaults, direct-io-mode=disable,rw

Dockerfile для образа сайта:

ИЗ php:7.4.1-apache
ENV APACHE_DOCUMENT_ROOT /var/www/htdocs
РАБОЧИЙ КАТАЛОГ /var/www

ЗАПУСК docker-php-ext-install mysqli pdo_mysql

# Сделать корень Apache настраиваемым
ЗАПУСК sed -ri -e s!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
ЗАПУСК sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

# Прослушивание порта 1080 по умолчанию для пользователя без полномочий root
RUN sed -ri 's/Listen 80/Listen 1080/g' /etc/apache2/ports.conf
ЗАПУСК sed -ri 's/:80/:1080/g' /etc/apache2/sites-enabled/*

# Использовать собственный конфиг
КОПИРОВАТЬ data/000-default.conf /etc/apache2/sites-enabled/

# Включить производство ini
ЗАПУСК cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini

ЗАПУСК a2enmod rewrite && a2enmod remoteip

КОПИРОВАТЬ --from=composer:последняя /usr/bin/composer /usr/local/bin/composer
КОПИРОВАТЬ --chown=www-данные:www-данные . /вар/www

RUN /usr/local/bin/composer --no-cache --no-ansi --no-interaction установить

# Наконец добавляем изменения безопасности
КОПИРОВАТЬ data/changes.ini/usr/local/etc/php/conf.d/

Файл nomad урезан до того, что вызывает проблему: со следующим планом работы Nomad:

работа "тест" {
  центры данных = ["dc1"]

  группа "постановка тестов" {
    количество = 1

    сеть {
      порт "php_http" {
        до = 1080
      }
    }

    объем "тестовых сессий" {
      тип = "хост"
      только для чтения = ложь
      источник = "тестовые сеансы"
    }

    том "тестовая загрузка" {
      тип = "хост"
      только для чтения = ложь
      источник = "тестовая загрузка"
    }

    оказание услуг {
      имя = "тестовая постановка"
      порт = "php_http"

      теги = [
        "traefik.enable=true",
        "traefik.http.routers.test.php_staging.rule=Хост(`staging.xxxxxx.com`)",
      ]

      проверять {
        Тип = "TCP"
        порт = "php_http"
        интервал = "5 с"
        таймаут = "2с"
      }
    }

    задание "тест" {
      драйвер = "докер"
      пользователь = "20000"

      конфиг {
        изображение = "докер-репо: 5000/тест/тест: последний"
        порты = ["php_http"]
      }

      том_mount {
        объем = "тестовые сеансы"
        назначение = "/var/php_sessions"
        только для чтения = ложь
      }

      том_mount {
        объем = "тестовая загрузка"
        назначение = "/вар/загрузить"
        только для чтения = ложь
      }

      шаблон {
        данные = <<EOF
1.2.3.4
EOF

        назначение = "local/trusted-proxy.lst"
      }
    }
  }
}
Ярослав Рахматуллин avatar
Вы описываете сложную среду и проблему, которую трудно воспроизвести, поскольку у нас нет доступа к вашему конкретному PHP-приложению. На такие вопросы трудно ответить. Чтобы увеличить свои шансы на получение ответов, попробуйте ограничить объем вопроса или опишите, каковы критерии успеха для ответа.Во всяком случае, у меня есть некоторое представление о причине проблемы. Предоставьте data/000-default.conf и краткий/минимальный обзор того, как вы настроили traefik, nomad и consul (даже больше, чем уже упомянутые файлы конфигурации).
Paul avatar
флаг in
Спасибо @ЯÑоÑÐ»Ð°Ð²Ð Ð°Ñ Ð¼Ð°ÑÑллин, я еще больше изолировал проблему. Это вызвано тем, что каталог сеанса PHP в образе сопоставляется с каталогом тома GlusterFS на хосте. Надеюсь, теперь кто-нибудь может сказать мне, как это исправить!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.