Apache. Документация на русском


Разделы:   1    2    3    4    5      6      7    8    9    10    11    12    13    14    15    16  

Раздел 6. Руководства, учебные пособия и инструкции

Пункты:   49    50      51      52    53    54    55    56  

 <         > 
  RU            EN  

Пункт 51. Динамический контент с CGI

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

Настройка Apache для разрешения CGI

Чтобы ваши CGI-программы работали должным образом, вам необходимо настроить Apache для разрешения выполнения CGI. Есть несколько способов сделать это.

Примечание. Если Apache был собран с поддержкой общих модулей, вам необходимо убедиться, что модуль загружен; в вашем apache2.conf вы должны убедиться, что LoadModule директива не была закомментирована. Правильно настроенная директива может выглядеть так:
 Модули загрузки cgid_module/mod_cgid.so 
В Windows или при использовании MPM без потоков, например prefork, правильно настроенная директива может выглядеть так:
 Модули загрузки cgi_module/mod_cgi.so 

ScriptAlias

Директива ScriptAlias сообщает Apache, что конкретный каталог отведен для программ CGI. Apache будет считать, что каждый файл в этом каталоге является программой CGI, и попытается выполнить ее, когда этот конкретный ресурс будет запрошен клиентом.

Директива ScriptAlias выглядит так:

 ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/" 

Показанный пример взят из apache2.conf файла конфигурации по умолчанию, если вы установили Apache в расположение по умолчанию. Директива ScriptAlias очень похожа на Alias директиву, которая определяет префикс URL, который должен быть сопоставлен с определенным каталогом. Alias и ScriptAlias обычно используются для каталогов, которые находятся за пределами каталога DocumentRoot . Разница между Alias и ScriptAlias заключается в том ScriptAlias , что все, что находится под этим префиксом URL, будет считаться программой CGI. Таким образом, приведенный выше пример говорит Apache, что любой запрос ресурса, начинающийся с , /cgi-bin/ должен обслуживаться из каталога /usr/local/apache2/cgi-bin/ и должен рассматриваться как программа CGI.

Например, если http://www.example.com/cgi-bin/test.pl запрашивается URL-адрес, Apache попытается выполнить файл /usr/local/apache2/cgi-bin/test.pl и вернуть результат. Конечно, файл должен существовать, быть исполняемым и возвращать вывод определенным образом, иначе Apache вернет сообщение об ошибке.

CGI вне каталогов ScriptAlias

Программы CGI часто ограничиваются ScriptAlias каталогами с ограниченным доступом из соображений безопасности. Таким образом, администраторы могут строго контролировать, кому разрешено использовать программы CGI. Однако, если приняты надлежащие меры безопасности, нет никаких причин, по которым программы CGI нельзя запускать из произвольных каталогов. Например, вы можете разрешить пользователям иметь веб-контент в своих домашних каталогах с помощью директивы UserDir . Если они хотят иметь свои собственные CGI-программы, но не имеют доступа к основному cgi-bin каталогу, им необходимо иметь возможность запускать CGI-программы в другом месте.

Есть два шага, чтобы разрешить выполнение CGI в произвольном каталоге. Во-первых, cgi-script обработчик должен быть активирован с помощью директивы AddHandler or SetHandler . Во-вторых, ExecCGI должно быть указано в Options директиве.

Явное использование параметров для разрешения выполнения CGI

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

 <Каталог "/usr/local/apache2/htdocs/somedir">
 Опции +ExecCGI
</Каталог> 

Приведенная выше директива указывает Apache разрешить выполнение файлов CGI. Вам также нужно будет сообщить серверу, какие файлы являются файлами CGI. Следующая AddHandler директива указывает серверу обрабатывать все файлы с расширением cgi или pl как программы CGI:

 AddHandler cgi-скрипт .cgi .pl 

файлы .htaccess

В .htaccess учебнике показано, как активировать программы CGI, если у вас нет доступа к файлам apache2.conf .

Каталоги пользователей

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

 <Каталог "/home/*/public_html">
 Опции +ExecCGI
 AddHandler cgi-скрипт .cgi
</Каталог> 

Если вы хотите указать cgi-bin подкаталог каталога пользователя, где все будет рассматриваться как программа CGI, вы можете использовать следующее.

 <Каталог "/home/*/public_html/cgi-bin">
 Опции ExecCGI
 cgi-скрипт SetHandler
</Каталог> 

Написание CGI-программы

Есть два основных различия между «обычным» программированием и программированием CGI.

Во-первых, всем выводам вашей CGI-программы должен предшествовать заголовок MIME-типа . Это заголовок HTTP, который сообщает клиенту, какой контент он получает. В большинстве случаев это будет выглядеть так:

Content-type: text/html

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

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

Ваша первая программа CGI

Ниже приведен пример программы CGI, которая выводит одну строку в ваш браузер. Введите следующее, сохраните его в файл с именем first.pl и поместите в свой cgi-bin каталог.

 #!/USR/бен/перл
print "Тип контента: text/html\n\n";
напечатать "Привет, мир."; 

Даже если вы не знакомы с Perl, вы сможете увидеть, что здесь происходит. Первая строка сообщает Apache (или любой другой оболочке, под которой вы работаете), что эту программу можно выполнить, передав файл интерпретатору, находящемуся по адресу /usr/bin/perl . Во второй строке выводится объявление типа содержимого, о котором мы говорили, за которым следуют две пары символов новой строки перевода каретки. Это помещает пустую строку после заголовка, чтобы указать конец заголовков HTTP и начало тела. Третья строка выводит строку «Hello, World.». И это конец.

Если вы откроете свой любимый браузер и скажете ему получить адрес

http://www.example.com/cgi-bin/first.pl

или куда бы вы ни поместили свой файл, вы увидите, что Hello, World. в окне вашего браузера появится одна строка. Это не очень захватывающе, но как только вы заработаете, у вас будет хороший шанс заставить практически все работать.

Но это все еще не работает!

Есть четыре основные вещи, которые вы можете увидеть в своем браузере, когда пытаетесь получить доступ к своей программе CGI из Интернета:

Вывод вашей программы CGI
Большой! Это значит, что все работало нормально. Если вывод правильный, но браузер не обрабатывает его правильно, убедитесь, что у вас есть правильный Content-Type набор в вашей программе CGI.
Исходный код вашей программы CGI или сообщение «Метод POST не разрешен»
Это означает, что вы неправильно настроили Apache для обработки вашей программы CGI. Перечитайте раздел о настройке Apache и попытайтесь найти то, что вы пропустили.
Сообщение, начинающееся с «Запрещено»
Это означает, что есть проблема с разрешениями. Проверьте журнал ошибок Apache и раздел ниже о правах доступа к файлам.
Сообщение "Внутренняя ошибка сервера"
Если вы проверите журнал ошибок Apache, вы, вероятно, обнаружите, что в нем говорится «Преждевременный конец заголовков скрипта», возможно, вместе с сообщением об ошибке, сгенерированным вашей программой CGI. В этом случае вам нужно будет проверить каждый из следующих разделов, чтобы увидеть, что может помешать вашей программе CGI выдавать правильные заголовки HTTP.

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

Помните, что сервер работает не так, как вы. То есть, когда сервер запускается, он работает с разрешениями непривилегированного пользователя — обычно nobody или www — и поэтому ему потребуются дополнительные разрешения для выполнения файлов, принадлежащих вам. Обычно способ предоставить файлу достаточные разрешения для выполнения nobody — предоставить всем разрешение на выполнение файла:

chmod a+x first.pl

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

Информация о пути и среда

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

Когда программа запускается через веб-сервер как программа CGI, она может не иметь того же файла PATH . Любые программы, которые вы вызываете в своей CGI-программе (например sendmail , ), должны быть указаны полным путем, чтобы оболочка могла найти их при попытке выполнить вашу CGI-программу.

Обычным проявлением этого является путь к интерпретатору скриптов (часто perl ), указанный в первой строке вашей CGI-программы, который будет выглядеть примерно так:

 #!/USR/бен/перл 

Убедитесь, что это действительно путь к интерпретатору.

При редактировании сценариев CGI в Windows к пути интерпретатора могут добавляться символы конца строки. Убедитесь, что файлы затем передаются на сервер в режиме ASCII. Невыполнение этого требования может привести к появлению предупреждений ОС «Команда не найдена» из-за того, что нераспознанный символ конца строки интерпретируется как часть имени файла интерпретатора.

Отсутствующие переменные среды

Если ваша CGI-программа зависит от нестандартных переменных среды, вам необходимо убедиться, что эти переменные передаются Apache.

Если вы пропускаете заголовки HTTP из среды, убедитесь, что они отформатированы в соответствии с RFC 2616, раздел 4.2: имена заголовков должны начинаться с буквы, за которой следуют только буквы, цифры или дефис. Любой заголовок, нарушающий это правило, будет автоматически удален.

Ошибки программы

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

cd /usr/local/apache2/cgi-bin
./first.pl

(Не вызывайте perl интерпретатор. Оболочка и Apache должны найти интерпретатор, используя информацию о пути в первой строке скрипта.)

Первое, что вы увидите, написанное вашей программой, должно быть набором заголовков HTTP, включая Content-Type , за которым следует пустая строка. Если вы увидите что-то еще, Apache вернет ошибку, Premature end of script headers если вы попытаетесь запустить его через сервер. Дополнительные сведения см. в разделе «Написание CGI-программы» выше.

Журналы ошибок

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

Suexec

Программа поддержки suexec позволяет запускать CGI-программы с разными разрешениями пользователя, в зависимости от того, на каком виртуальном хосте или домашнем каталоге пользователя они расположены. Suexec имеет очень строгую проверку разрешений, и любой сбой в этой проверке приведет к сбою ваших CGI-программ с Premature end of script headers .

Чтобы проверить, используете ли вы suexec, запустите apache2ctl -V и проверьте расположение файла SUEXEC_BIN . Если Apache найдет suexec там бинарный файл при запуске, suexec будет активирован.

Если вы полностью не понимаете suexec, вам не следует его использовать. Чтобы отключить suexec, просто удалите (или переименуйте) suexec двоичный файл, на который указывает SUEXEC_BIN , а затем перезапустите сервер. Если после прочтения о suexec вы все еще хотите его использовать, запустите, suexec -V чтобы найти местоположение файла журнала suexec, и используйте этот файл журнала, чтобы определить, какую политику вы нарушаете.

Что происходит за кулисами?

По мере того, как вы становитесь более продвинутыми в программировании CGI, вам будет полезно узнать больше о том, что происходит за кулисами. В частности, как браузер и сервер взаимодействуют друг с другом. Потому что, хотя написать программу, которая печатает «Hello, World.», очень хорошо, это не особенно полезно.

Переменные среды

Переменные среды — это значения, которые плавают вокруг вас, когда вы используете свой компьютер. Это полезные вещи, такие как ваш путь (где компьютер ищет фактический файл, реализующий команду, когда вы ее вводите), ваше имя пользователя, тип вашего терминала и так далее. Чтобы получить полный список ваших обычных, повседневных переменных среды, введите env в командной строке.

Во время транзакции CGI сервер и браузер также устанавливают переменные среды, чтобы они могли взаимодействовать друг с другом. Это такие вещи, как тип браузера (Netscape, IE, Lynx), тип сервера (Apache, IIS, WebSite), имя выполняемой программы CGI и так далее.

Эти переменные доступны программисту CGI и составляют половину истории взаимодействия клиент-сервер. Полный список необходимых переменных находится в документе Common Gateway Interface RFC.

Эта простая программа Perl CGI будет отображать все передаваемые переменные среды. Две аналогичные программы включены в cgi-bin каталог дистрибутива Apache. Обратите внимание, что некоторые переменные являются обязательными, а другие необязательными, поэтому вы можете увидеть в списке некоторые переменные, которых нет в официальном списке. Кроме того, Apache предоставляет множество различных способов добавления собственных переменных среды к базовым, предоставляемым по умолчанию.

 #!/USR/бен/перл
использовать строгий;
использовать предупреждения;
print "Тип контента: text/html\n\n";
foreach мой ключ $ (ключи %ENV) {
 print "$key --> $ENV{$key}<br>";
} 

STDIN и STDOUT

Другая связь между сервером и клиентом происходит через стандартный ввод ( STDIN ) и стандартный вывод ( STDOUT ). В обычном повседневном контексте STDIN означает клавиатуру или файл, с которым программа работает, и STDOUT обычно означает консоль или экран.

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

«Особый формат» очень прост. Имя поля и его значение соединяются знаком равенства (=), а пары значений объединяются амперсандом (&). Неудобные символы, такие как пробелы, амперсанд и знак равенства, преобразуются в их шестнадцатеричный эквивалент, чтобы не портить работу. Вся строка данных может выглядеть примерно так:

name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey

Иногда вы также увидите этот тип строки, добавленной к URL-адресу. Когда это будет сделано, сервер поместит эту строку в переменную среды с именем QUERY_STRING . Это называется GET запрос. Ваша HTML-форма указывает, используется ли a GET или a POST для доставки данных, путем установки METHOD атрибута в FORM теге.

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

Модули/библиотеки CGI

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

Если вы пишете программы CGI на Perl, модули доступны на CPAN. Наиболее популярным модулем для этой цели является CGI.pm . Вы также можете рассмотреть CGI::Lite , который реализует минимальный набор функций, и это все, что вам нужно в большинстве программ.

Если вы пишете CGI-программы на C, у вас есть множество вариантов. Одной из них является CGIC библиотека с http://www.boutell.com/cgic/.

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

Текущая спецификация CGI доступна в документе RFC Common Gateway Interface.

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

Обратите внимание, что вопросы о проблемах с CGI никогда не следует размещать в базе данных ошибок Apache, если только вы не уверены, что нашли проблему в исходном коде Apache.



 <         > 

Пункты:   49    50      51      52    53    54    55    56  

Рейтинг@Mail.ru