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"
}
}
}
}