Автоматическое создание экземпляров FastCGI Perl-скриптов в NGINX

Вопрос или проблема

В последние несколько лет я использовал конфигурацию NGINX в качестве обратного прокси, который передает любые запросы на динамический контент Apache. Apache затем использует mod_fcgid для автоматического создания процессов слушателей с включенными FastCGI скриптами на Perl. Для сложного кода на Perl это было огромным преимуществом, позволяя поддерживать соединения с базой данных и т.д.

Теперь я пытаюсь настроить чистую конфигурацию NGINX, которая исключает Apache, однако я не могу понять, как добиться такой же базовой функциональности автоматического создания процессов. Кажется, что большинство обсуждений FCGI, касающихся NGINX, предполагают, что пользователь вручную запускает демон, специфичный для данного скрипта. Он либо запускает один экземпляр скрипта на Perl, либо с помощью multiwatch может управлять несколькими копиями для большего количества запросов (как делает mod_fcgid), но остается простой факт: необходимо предвидеть, какие скрипты на Perl с поддержкой FastCGI будут выполняться, иметь их в ожидании на сокете и затем явно сообщить NGINX о данном скрипте.

Если вы хостите несколько виртуальных серверов, и на каждом из них могут быть скрипты, которые необходимо загрузить, это значительно сложнее, чем просто позволить mod_fcgid запускать эти скрипты и перезапускать их, если они завершатся аварийно.

Существует ли способ добиться подобной конфигурации mod_fcgid, которая автоматически создает процессы, как это делает fcgiwrap, но в отличие от fcgiwrap, это должно быть для скриптов с поддержкой FastCGI, которые должныPersist между запросами? (Поскольку fcgiwrap является устаревшим оберткой CGI, он просто запускает скрипт один раз за запрос, а не предоставляет истинное преимущество FastCGI.)

Если хотите, вы можете использовать мой проект, созданный именно для этого: https://github.com/vdudouyt/std-fpm

Вы можете рассматривать его как самостоятельный mod_fcgid для Nginx или как свою версию PHP-FPM без части PHP.

В нем также отсутствует эта неприятная проблема can't apply process slot, с которой сталкиваются пользователи mod_fcgid, если их скрипты неожиданно завершатся или выполняют длительные операции ввода-вывода.

Он уже используется в продакшене, включая некоторые высоконагруженные конфигурации.

Ответ или решение

Автозапуск FastCGI скриптов Perl с NGINX: пошаговое руководство

В последние годы многие разработчики и системные администраторы использовали конфигурацию NGINX в качестве обратного прокси, передавая запросы на динамический контент в Apache. Apache, в свою очередь, использовал модуль mod_fcgid для автоматического запуска FastCGI-скриптов на Perl. Однако с переходом на чистую архитектуру NGINX без Apache, многие сталкиваются с проблемой автоматического управления FastCGI-процессами.

Проблема

Как указано в предоставленном описании, одна из главных трудностей заключается в том, что часто обсуждаемые решения для NGINX предполагают ручной запуск демонов, специфичных для каждого скрипта. Это приводит к необходимости предугадывать, какие FastCGI-скрипты будут вызываться, и заранее готовить их для обработки запросов. Такая ситуация становится неудобной, особенно если на сервере размещено множество виртуальных хостов с разными сценариями.

Решение

Для адекватной замены функциональности mod_fcgid мы можем рассмотреть проект std-fpm, который представляет собой аналогичное по назначению решение для NGINX. Этот инструмент позволяет избежать рутинного управления процессами, предлагая удобный способ автозапуска и управления FastCGI-скриптами на Perl.

Установка std-fpm

  1. Клонирование репозитория:

    git clone https://github.com/vdudouyt/std-fpm.git
    cd std-fpm
  2. Сборка и установка:
    Следуйте инструкциям в README для установки и настройки на вашей системе.

  3. Конфигурация NGINX:
    После установки, необходимо настроить NGINX для работы с вашим FastCGI-скриптом. Пример конфигурации:

    server {
       listen 80;
       server_name yourdomain.com;
    
       location / {
           # Ваши статические файлы могут обслуживаться напрямую
           root /path/to/webroot;
           try_files $uri $uri/ /index.html;
       }
    
       location ~ \.pl$ {
           # Настройка FastCGI
           fastcgi_pass 127.0.0.1:9000; # Порт, который использует std-fpm
           include fastcgi_params;
           fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
           fastcgi_param PATH_INFO $fastcgi_path_info;
       }
    }

Преимущества std-fpm:

  • Автоматическое управление процессами: std-fpm будет автоматически запускать и управлять процессами для каждого сценария, что минимизирует ручные операции.

  • Постоянные соединения: FastCGI обеспечит надежное соединение с вашими базами данных и другими ресурсами, избежав необходимости постоянно создавать и разрывать соединения.

  • Устойчивость к сбоям: Проект разработан так, чтобы устранить популярные проблемы, такие как "нельзя применить слот процесса", возникающие при работе с mod_fcgid.

Заключение

Совершенно ясно, что переход с Apache на чистую архитектуру NGINX с FastCGI требует внимания к деталям в настройках. Использование проекта std-fpm значительно упрощает этот процесс, обеспечивая функциональность, аналогичную mod_fcgid, и позволяя более эффективно управлять скриптами на Perl.

Если у вас остались вопросы или нужна дальнейшая помощь с настройкой, не стесняйтесь обращаться за поддержкой в сообщество разработчиков или изучить документацию std-fpm для получения дополнительных рекомендаций.

Оцените материал
Добавить комментарий

Капча загружается...