Скрипт CGI не записывает в файл логов с Apache

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

Я пытаюсь выполнить CGI-скрипт с использованием Apache2 на своем сервере (работающего на Debian). Скрипт должен выполнять некоторые операции и записывать свой прогресс в /tmp/cgi_errors.log. Когда я обращаюсь к скрипту через браузер, он, как и ожидалось, запускает загрузку файла, что указывает на то, что скрипт выполняется. Однако файл журнала остается пустым, несмотря на все мои попытки.

Мне удалось записать файл благодаря
sudo -u www-data bash -c 'echo "$(date) - Test from command line" >> /tmp/cgi_errors.log'

Что я пытаюсь достичь:

Выполнить CGI-скрипт, который записывает свои шаги выполнения в файл журнала.
Убедиться, что файл журнала заполнен ожидаемым выводом для целей отладки.

Что я сделал до сих пор:

CGI-скрипт (/usr/lib/cgi-bin/trigger_script.cgi):

#!/bin/bash

echo "Content-Type: application/octet-stream"
echo "Content-Disposition: attachment; filename=\"cleaned_drop.txt\""
echo ""

stdbuf -oL echo "$(date) - CGI script started" >> /tmp/cgi_errors.log

Права доступа к файлам:

CGI-скрипт:

sudo chown www-data:www-data /usr/lib/cgi-bin/trigger_script.cgi
sudo chmod 755 /usr/lib/cgi-bin/trigger_script.cgi
-rwxr-xr-x 1 www-data www-data 848 Окт 9 10:04 /usr/lib/cgi-bin/trigger_script.cgi

Файл журнала:

sudo touch /tmp/cgi_errors.log
sudo chown www-data:www-data /tmp/cgi_errors.log
sudo chmod 666 /tmp/cgi_errors.log
-rw-rw-rw- 1 www-data www-data 0 Окт 9 09:38 /tmp/cgi_errors.log

Конфигурация Apache (/etc/apache2/sites-available/000-default.conf):

<VirtualHost *:80>
    DocumentRoot /var/www/html

    # Настройка CGI
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +FollowSymLinks
        AddHandler cgi-script .cgi
        Require all granted
    </Directory>

Включен модуль CGI в Apache:

sudo a2enmod cgi
sudo systemctl restart apache2

Обращение к скрипту через браузер:

http :// mydomain .com/cgi-bin/trigger_script.cgi

Запускается загрузка файла (я делаю загрузку позже в скрипте), что указывает на то, что скрипт выполняется.

Попытки методов ведения журнала:

Использовал echo и перенаправил вывод в файл журнала.
Пробовал использовать stdbuf, чтобы предотвратить буферизацию вывода.
Использовал tee для записи вывода как в браузер, так и в файл журнала.
Добавил set -x и exec для захвата всех выполняемых команд и ошибок.

Проверка журналов Apache и системы:

Проверил /var/log/apache2/error.log и /var/log/apache2/access.log на наличие ошибок, связанных со скриптом. Ничего такого не нашел.
Мониторил /tmp/cgi_errors.log, файл остается пустым.

Тестирование записи в другие локации журнала:

Пробовал вести журнал в /var/log/cgi_errors.log с соответствующими правами доступа.
Тем не менее, файл журнала остается пустым.

Проверка на наличие ограничений безопасности:

Подтвердил, что AppArmor не применяет никаких профилей, которые могут блокировать ведение журнала.
SELinux на системе не активен.

Итог проблемы:

CGI-скрипт выполняется и запускает загрузку файла при доступе через браузер.
Несмотря на правильные права доступа и собственность файлов, скрипт не записывает данные в файл журнала, когда выполняется через Apache.
Файл журнала остается пустым, что затрудняет отладку поведения скрипта под управлением Apache.

Мой вопрос:

Почему CGI-скрипт не записывает данные в /tmp/cgi_errors.log, когда выполняется через Apache, несмотря на наличие правильных прав и собственности?

Как я могу заставить скрипт записывать свой вывод в файл, когда он запускается как CGI-скрипт через Apache?

Дополнительная информация:

Apache работает под пользователем www-data.
Директория /tmp имеет правильные права доступа (drwxrwxrwt).
Другие CGI-скрипты (более простые) демонстрируют то же самое поведение.
В журнале ошибок Apache нет ошибок, связанных со скриптом.
Любые идеи или предложения будут весьма полезны!

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

Проблема, с которой вы столкнулись, может быть вызвана несколькими факторами, связанными с выполнением CGI-скриптов через Apache. Давайте рассмотрим несколько шагов, которые могут помочь вам решить проблему с записью в файл лога /tmp/cgi_errors.log.

Возможные причины проблемы и их решения:

  1. Права доступа и права на запись:
    Убедитесь, что Apache действительно выполняет скрипт от имени пользователя www-data, и у него есть соответствующие права для записи в файл. Поскольку вы уже установили права на файл /tmp/cgi_errors.log и его владельцем является www-data, это скорее всего не является причиной. Однако вы можете дополнительно проверить права на директорию /tmp:

    ls -ld /tmp

    Она должна быть drwxrwxrwt. Вы уже упомянули, что у вас установлены правильные права, так что перейдем к следующему пункту.

  2. Проблемы с перенаправлением вывода:
    Ваша команда для записи в лог использует stdbuf. Это может не сработать в некоторых случаях, когда скрипт выполняется через CGI. Попробуйте использовать прямое перенаправление. Измените ваш скрипт следующим образом:

    #!/bin/bash
    
    echo "Content-Type: application/octet-stream"
    echo "Content-Disposition: attachment; filename=\"cleaned_drop.txt\""
    echo ""
    
    echo "$(date) - CGI script started" >> /tmp/cgi_errors.log 2>&1
  3. Добавление отладки:
    Для более детального понимания того, что происходит, вы можете добавить команды отладки в ваш скрипт. Например:

    #!/bin/bash
    set -x  # Включаем отладку
    echo "Content-Type: application/octet-stream"
    echo "Content-Disposition: attachment; filename=\"cleaned_drop.txt\""
    echo ""
    
    {
       echo "$(date) - CGI script started"
       # Добавьте дополнительные команды здесь, если нужно
    } >> /tmp/cgi_errors.log 2>&1
  4. Проверка конфигурации Apache:
    Убедитесь, что в конфигурации Apache включен обработчик CGI. Ваши настройки, похоже, корректны. Также убедитесь, что конфигурация применена, перезапустив Apache:

    sudo systemctl restart apache2
  5. Проверка логов Apache:
    Продолжайте следить за логами Apache. Если при выполнении скрипта возникает ошибка, это может быть отражено в логе ошибок:

    tail -f /var/log/apache2/error.log
  6. Тестирование простого скрипта:
    Создайте простой скрипт для тестирования, который просто записывает строку в лог, чтобы убедиться, что проблема не в вашем основном скрипте. Например:

    #!/bin/bash
    echo "Content-Type: text/plain"
    echo ""
    echo "Hello, World!" >> /tmp/cgi_errors.log 2>&1
  7. Проверка SELinux и других систем безопасности:
    Хотя вы упомянули, что SELinux не активен и AppArmor не препятствует выполнению, все же убедитесь, что нет других уровней безопасности, мешающих записи файлов.

Заключение

Если ни одно из вышеупомянутых решений не сработает, вы могли бы рассмотреть возможность временного изменения вашего Apache на выполнение скриптов в другой директории, например, /var/www/html/cgi-errors.log, и проверьте, будет ли он по-прежнему пустым. Это поможет сузить проблему к окружению выполнения скрипта.

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

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

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