Том 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"
      }
    }
  }
}

0 ответов

Другие вопросы по тегам