Поиск

Что делать, если CGI-программа не работает

Перечисленные ниже разделы можно считать кратким руководством по отладке типичной CGI-программы. Перед тем как начать разбираться, почему не работает ваша первая CGI-программа, вернитесь к предыдущему материалу и проверьте, все ли инструкции выполнены. К концу этого занятия вы сможете локализовать любую проблему CGI-программы и исправить ее.

Все диагностические сообщения, приведенные в следующих разделах, предполагают, что отлаживаемая программа называется hello.cgi. Если у программы другое имя — используйте его.

А может, виновата сама программа?

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

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

perl hello.cgi

Интерпретатор Perl ответит вам подобной строкой:

Эта строка означает, что модуль CGI пытается получить значения полей формы. Про формы мы поговорим на 18-м занятии, "Основы обработки форм".

В ответ на это сообщение вы должны что-то ввести, хотя бы символ конца файла. В UNIX — это <Ctrl+D>, в Windows — <Ctrl+Z>. Затем CGI-сценарий выведет следующий текст:

Сообщение Content-Type: text/html означает, что следующий за ним текст должен быть интерпретирован как текст HTML. Более основательно вы поймете значение этого сообщения после изучения материала 20-го занятия, "Работа с HTML-кодом и CGI-программами". Пока лишь вам достаточно знать, что эта первая строка необходима и что ее выводит функция header. Если перед этой строкой будет выведен какой-нибудь другой текст, CGI-программа не будет работать. Ниже перечислены несколько распространенных проблем, возникающих с CGI-программами, и способы их разрешения.

  • Проблема. Сообщение о синтаксической ошибке.
    Решение. Устраните синтаксическую ошибку.
  • Проблема. Сообщение Can't locate CGI. pm in @ INC_____
    Решение. Вы используете неполную установку интерпретатора Perl. Модуль CGI устанавливается вместе с Perl. Для переустановки Perl воспользуйтесь инструкциями, приведенными в приложении "Инсталляция модулей в Perl".
Проблемы сервера

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

  • Проблема. Сообщение сервера Not found или 404 Not Found.
    Решение. Это сообщение свидетельствует о наличии одной из двух проблем.
    • Введен неправильный URL. Например, вы набрали https//www.server.com/cgi/hello.cgi вместо http://www.server.com/cgi-bin/hello.cgi. Снова вернитесь к контрольному списку и проверьте правильность указания URL и каталога CGI.
    • Сценарий помещен в неправильный каталог. Проверьте по контрольному списку правильность использованного каталога CG1 и при необходимости переместите сценарий в нужное место.
  • Проблема. Отображается текст сценария.
    Решение. Это происходит потому, что Web-сервер воспринял файл программы как обычный документ. Причин может быть несколько.
    • CGI-программе назначено неправильное расширение, например вместо .pl — .cgi или любое другое. Проверьте по контрольному списку, какое расширение нужно использовать в CGI-программах при работе с данным сервером.
    • Вы поместили сценарий в неправильный каталог и используете неправильный URL для доступа к нему. Убедитесь, что сценарий находится в требуемом каталоге и введен правильный URL.
    • Сервер неправильно сконфигурирован. Если вы используете собственный Web-сервер, внимательно прочтите документацию и проверьте корректность установок. Иногда в дистрибутив Web-сервера входит тестовый CGI-сценарий, попробуйте запустить его. Если вы работаете с коммерческим Web-узлом, убедитесь в том, что сценарий помещен в нужный каталог. При необходимости обратитесь за помощью в службу технической поддержки этого Web-узла.
  • Проблема. Сообщение сервера Forbidden или 403 Error.
    Решение. Неправильно назначены права доступа к CGI-программе. Эта проблема характерна для Web-серверов, работающих под управлением UNIX.

    Для того чтобы посмотреть права доступа программы hello.cgi, перейдите в каталог, в котором она находится, и наберите в командной строке Is-1 hello.cgi. Эта команда позволяет отобразить права доступа в подобном виде:

    Права доступа — это символы -rwxr-xr-x. Если в вашем случае они не совпадают с приведенными, измените их в соответствии с приведенными выше инструкциями.

Устранение ошибок Internal Server или 500 Error

Если появляется сообщение Internal Server Error или 500 Error, это означает, что CGI-программа каким-то образом не смогла корректно выполнить свою работу. Это сообщение об ошибке общего назначения может быть получено во многих случаях.

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

Расположение файла системного журнала вы должны были определить при проверке контрольного списка. Обычно новые записи добавляются в конец файла системного журнала. Для просмотра в UNIX нескольких последних записей в файле журнала наберите в командной строке

tail server_log

Эта команда отобразит конец файла журнала. Некоторые Web-серверы имеют специальные утилиты для просмотра таких файлов. Часто такие утилиты представляют собой CGI-программы. Если у вас есть лишь FTP-доступ к Web-серверу, возможно, вам придется загрузить файл журнала на локальный компьютер и просмотреть его там.

Если у вас нет доступа к файлам журнала ошибок, дело совсем плохо. В этом случае вам придется устранять ошибку Internal Server Error методом последовательного исключения. Мы составили еще один контрольный список для поиска ошибок. Приведенные сообщения приблизительны и могут изменяться в зависимости от используемого сервера.

  • Запись в журнале. No such file or directory: exec of/cgi-bin/hello.cgi failed
    Возможные причины.
    • • Неправильная строка #! в сценарии. Убедитесь, что в этой строке указан корректный путь к интерпретатору Perl. Проверьте через FTP указанный каталог на наличие в нем интерпретатора Perl или воспользуйтесь командами Is или dir.
    • • При пересылке CGI-программы на сервер через FTP использовался не ASCII-режим. Сценарии нельзя пересылать через FTP между Windows и UNIX в бинарном режиме.
    • • Для CGI-программы в UNIX назначены неправильные права доступа. (См. описание ошибки Forbidden выше в разделе "Проблемы сервера".)
  • Запись в журнале. Can't locate CGI.pm in @INC___
    Возможные причины.
    • • У вас неполная установка интерпретатора Perl либо поврежденная, либо очень старая. Интерпретатор Perl не может определить положение модуля CGI, являющегося частью стандартной установки Perl. Переустановите Perl или попросите об этом системного администратора. Инструкции по установке модулей приведены в приложении к этой книге.
  • Запись в журнале. Syntax error, warning, Global symbol requires, etc.
    Возможные причины.
    • • В программе имеется опечатка или синтаксическая ошибка. Для их устранения следуйте инструкциям, приведенным в разделе "А может, виновата сама программа?".
  • Запись в журнале. Premature end of script headers.
    Возможные причины.

    Это сообщение об ошибке охватывает широкий класс ситуаций, при которых сценарий первым выводит не заголовок Content-Type, а что-либо другое. Напомним, что этот заголовок выводится функцией header модуля CGI. Иногда в файле журнала ошибок может содержаться еще одна уточняющая запись перед или после указанной. Используйте ее для определения причины ошибки. Ваши действия в этом случае таковы.

    • • Убедитесь, что до вызова функции header ваша программа не выводила никакой информации (включая сообщения об ошибках). Такой вывод перед функцией header приводит к возникновению ошибки.
      Некоторые CGI-программы не используют вызов функции header, а сами организуют первую строку вывода "Content-Type: text/html\n\n" . Многие считают, что такой способ и вызов функции header равносильны, но на самом деле это не так. На различных серверах последовательность символов \n\n может интерпретироваться по-разному, а функция header учитывает эти различия.
    • • Проблема может быть связана с буферизацией вывода. При этом вывод функции system или оператора ' ' будет опережать вывод функции header. Для того чтобы избежать этого, перепишите начало программы таким образом: