Apache Error AH01215: CGI execution failed — Решение
При вызове CGI-скрипта (Perl, Python, Bash, C/C++) веб-сервер возвращает пользователю ошибку 500 Internal Server Error. В системном журнале error.log фиксируется сбой исполнения процесса: [cgi:error] [pid 1234:tid 5678] [client ...] AH01215: /usr/lib/cgi-bin/test.cgi: CGI execution failed: script not found or unable to execute или AH01215: (13)Permission denied: exec of '/usr/lib/cgi-bin/script.sh' failed.
| Причина отказа | Симптом в файловой системе | Системный код ядра |
|---|---|---|
| Отсутствует флаг исполнения | Права 644 (-rw-r--r--) вместо 755 | (13) Permission denied |
| Ошибочный Shebang | #!/usr/bin/python (путь не существует) | (2) No such file or directory |
| Окончания строк Windows (CRLF) | Интерпретатор ищет /bin/bash\r | AH01215: script not found or unable to execute |
| SELinux блокировка | Контекст не равен httpd_sys_script_exec_t | SELinux запрещает ядру Apache выполнять execve() |
- Браузер отображает ошибку «500 Internal Server Error: The server encountered an internal error and was unable to complete your request».
- CGI-процесс не может стартовать на уровне операционной системы.
- Установите бит исполнения (executable) на файл скрипта:
sudo chmod +x /usr/lib/cgi-bin/script.cgi # Или полные права на чтение и исполнение: sudo chmod 755 /usr/lib/cgi-bin/script.cgi - Убедитесь, что первая строка скрипта (Shebang) содержит правильный абсолютный путь к существующему в системе интерпретатору:
#!/usr/bin/env python3 # или для Bash: #!/bin/bash # или для Perl: #!/usr/bin/perl - Устраните скрытые символы перевода строк Windows (CRLF), преобразовав скрипт в UNIX-формат:
sudo dos2unix /usr/lib/cgi-bin/script.cgi - Проверьте, что скрипт возвращает обязательный HTTP-заголовок
Content-Typeперед выводом основного тела:#!/bin/bash echo "Content-Type: text/plain" echo "" echo "Hello World" - Если активен SELinux (RHEL/CentOS), назначьте файлу правильный контекст безопасности для CGI-скриптов:
sudo chcon -t httpd_sys_script_exec_t /usr/lib/cgi-bin/script.cgi - Проверьте работу скрипта, запустив его в терминале от имени пользователя веб-сервера:
sudo -u www-data /usr/lib/cgi-bin/script.cgi
#!/bin/bash превращается в #!/bin/bash\r. Ядро Linux пытается найти бинарник с именем bash\r и возвращает No such file or directory, что приводит к загадочной на первый взгляд ошибке AH01215.Частые вопросы (FAQ)
Что такое модуль mod_cgid?
mod_cgid — это оптимизированная версия mod_cgi для многопоточных MPM (event/worker), использующая отдельный фоновый сокет-демон для форка процессов без замедления основных потоков веб-сервера.
Как включить поддержку CGI в произвольной папке?
Добавьте опцию ExecCGI и обработчик cgi-script: Options +ExecCGI и AddHandler cgi-script .cgi .pl .py внутри блока <Directory>.
Что означает ошибка 'Premature end of script headers'?
Она означает, что скрипт упал с критической ошибкой рантайма до того, как успел отправить обязательную строку заголовка Content-Type: text/html и пустую строку-разделитель.
Как протестировать работу CGI простым bash-скриптом?
Создайте файл test.cgi со строками: #!/bin/bash, echo 'Content-type: text/html', echo '', echo 'OK', и сделайте chmod +x.