Вопрос или проблема
Я пытаюсь выполнить 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
.
Возможные причины проблемы и их решения:
-
Права доступа и права на запись:
Убедитесь, что Apache действительно выполняет скрипт от имени пользователяwww-data
, и у него есть соответствующие права для записи в файл. Поскольку вы уже установили права на файл/tmp/cgi_errors.log
и его владельцем являетсяwww-data
, это скорее всего не является причиной. Однако вы можете дополнительно проверить права на директорию/tmp
:ls -ld /tmp
Она должна быть
drwxrwxrwt
. Вы уже упомянули, что у вас установлены правильные права, так что перейдем к следующему пункту. -
Проблемы с перенаправлением вывода:
Ваша команда для записи в лог использует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
-
Добавление отладки:
Для более детального понимания того, что происходит, вы можете добавить команды отладки в ваш скрипт. Например:#!/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
-
Проверка конфигурации Apache:
Убедитесь, что в конфигурации Apache включен обработчик CGI. Ваши настройки, похоже, корректны. Также убедитесь, что конфигурация применена, перезапустив Apache:sudo systemctl restart apache2
-
Проверка логов Apache:
Продолжайте следить за логами Apache. Если при выполнении скрипта возникает ошибка, это может быть отражено в логе ошибок:tail -f /var/log/apache2/error.log
-
Тестирование простого скрипта:
Создайте простой скрипт для тестирования, который просто записывает строку в лог, чтобы убедиться, что проблема не в вашем основном скрипте. Например:#!/bin/bash echo "Content-Type: text/plain" echo "" echo "Hello, World!" >> /tmp/cgi_errors.log 2>&1
-
Проверка SELinux и других систем безопасности:
Хотя вы упомянули, что SELinux не активен и AppArmor не препятствует выполнению, все же убедитесь, что нет других уровней безопасности, мешающих записи файлов.
Заключение
Если ни одно из вышеупомянутых решений не сработает, вы могли бы рассмотреть возможность временного изменения вашего Apache на выполнение скриптов в другой директории, например, /var/www/html/cgi-errors.log
, и проверьте, будет ли он по-прежнему пустым. Это поможет сузить проблему к окружению выполнения скрипта.
Также, если у вас есть возможность, попробуйте обратиться к сообществу Debian или Apache для получения дополнительных советов, так как проблемы в конфигурации сервера могут быть уникальными для вашей конкретной установки.