Запуск веб-сценариев на сервере Apache

Задача
Вы хотите выполнить программы на Perl, PHP или Python в веб-окружении.

Решение
Запустите их при помощи сервера Apache.

Обсуждение
В этом разделе рассказано о том, как настроить Apache для запуска сценариев Perl, PHP и Python, и показаны примеры веб-сценариев на каждом из этих языков.

Корневой каталог Apache (будем считать, что это каталог /usr/local/apache) включает следующие каталоги:

bin
Содержит httpd, то есть сам Apache, а также другие исполняемые программы.conf
Конфигурационные файлы, в том числе httpd.conf, основной файл, используемый Apache.

htdocs
Корень дерева документов.

logs
Лог-файлы.
Чтобы настроить Apache для выполнения сценариев, отредактируйте файл httpd.conf в каталоге conf. Обычно исполняемые сценарии характеризуются либо расположением, либо расширением имени файла. Расположение файла может зависеть или не зависеть от языка.

Конфигурации Apache часто содержат внутри корневого каталога сервера каталог cgi-bin, где устанавливаются сценарии, которые должны запускаться как внешние программы.


Он задается при помощи директивы ScriptAlias:

ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/

Второй аргумент – это фактическое местоположение каталога сценариев в вашей файловой системе, а первый – виртуальное имя, которое соответствует этому каталогу. То есть приведенная директива сопоставляет сценарии, расположенные в каталоге /usr/local/apache/cgi-bin адресам URL, в которых за именем хоста следует cgi-bin. Например, если вы инсталлируете сценарий myscript.py в каталог /usr/local/apache/cgi-bin хоста apache.snake.net, то сможете запустить его, используя такой URL:

http://apache.snake.net/cgi-bin/myscript.py

В такой конфигурации каталог cgi-bin может содержать сценарии, написанные на любом языке. Поэтому каталог нейтрален по отношению к языку, и серверу Apache необходимо как-то понять, какой интерпретатор использовать для выполнения каждого из находящихся в каталоге сценариев. Для обеспечения такой информация первая строка сценария должна начинаться с символов #! и пути к программе, которая выполняет сценарий, а также, возможно, каких-то опций. Например, сценарий, который начинается со строки, приведенной ниже, будет запущен при помощи Perl, а опция -w указывает Perl на необходимость выдачи предупреждений по поводу сомни-
тельных языковых конструкций:

#! /usr/bin/perl -w

В UNIX для корректной работы сценария необходимо сделать сценарий исполняемым (посредством команды chmod +x).


Приведенная строка #! подходит для системы, в которой Perl установлен как /usr/bin/perl. Если интерпретатор Perl установлен в каком-то другом каталоге, измените строку соответствующим образом. Если вы работаете в Windows, и Perl установлен как D:

\Perl\bin\perl.exe, то строка #! должна выглядеть так:

#! D:\Perl\bin\perl -wУ пользователей Windows есть и другая возможность – задать соответствие расширения имени файла .pl интерпретатору Perl. Тогда сценарии могут начинаться так:

#! perl -w
Директива ScriptAlias определяет каталог, который может использоваться для сценариев, написанных на любых языках. Есть также возможность сопоставить каталогу какой-то определенный языковой процессор, тогда любой сценарий каталога будет считаться написанным на данном языке. Например, чтобы назначить каталог /usr/local/apache/cgi-perl каталогом mod_perl, можно сконфигурировать Apache так:


Alias /cgi-perl/ /usr/local/apache/cgi-perl/

SetHandler perl-script
PerlHandler Apache::Registry
PerlSendHeader on
Options +ExecCGI



Тогда можно вызывать расположенные в каталоге сценарии Perl так:

http://apache.snake.net/cgi-perl/myscript.pl

Использование mod_perl выходит за рамки нашего обсуждения, так что не будем о нем больше говорить.


Некоторые источники полезной информации о mod_perl приведены в приложении C.

Каталоги, используемые исключительно для хранения сценариев, обычно располагаются вне дерева документов Apache. Альтернативой использования специальных каталогов для сценариев может служить идентификация сценариев по расширению имени файла: имена с определенным расширением сопоставляются указанному языковому процессору. Тогда такие файлы можно размещать в дереве документов где угодно. Обычно именно так работают с PHP. Например, если ваш сервер Apache сконфигурирован со встроенной поддержкой PHP посредством модуля mod_php, вы можете указать ему, что сценарии, имена которых заканчиваются на .php, должны интерпретироваться как сценарии PHP. Для этого добавим в httpd.conf такую строку:

AddType application/x-httpd-php .php

Если теперь установить сценарий PHP myscript.php в htdocs (корневой каталог документов Apache), то URL для вызова сценария будет таким:

http://apache.snake.net/myscript.php

Если PHP запускается как внешняя автономная программа, необходимо сообщить Apache, где ее следует искать. Например, если вы работаете в Windows, а PHP инсталлирован как D:\Php\php.exe, поместите в httpd.conf сле-дующие строки (обратите внимание на использование в путях символов прямого слэша, а не обратного):

ScriptAlias /php/ "D:/Php/"
AddType application/x-httpd-php .php
Action application/x-httpd-php /php/php.exe

Приводя URL в примерах, я буду считать, что сценарии Perl и Python находятся в каталоге cgi-bin, а сценарии PHP – в каталоге mcb вашего дерева документов, и имеют расширение .php. То есть URL сценариев на этих языках будут выглядеть так:

http://apache.snake.net/cgi-bin/myscript.pl
http://apache.snake.net/cgi-bin/myscript.py
http://apache.snake.net/mcb/myscript.php

Если вы планируете использовать подобные настройки, убедитесь в том, что в вашем корневом каталоге Apache есть каталог cgi-bin, а в корневом каталоге документов Apache – каталог mcb. Затем для работы с веб-сценариями Perl или Python следует скопировать их в cgi-bin, а сценарии PHP – в mcb.Если вы обращаетесь к веб-сценарию, а в ответ получаете страницу с ошибкой, обратитесь к логу ошибок Apache, из которого можно получить важную информацию о том, почему сценарий не работает. Обычно лог ошибок хранится в файле error_log каталога logs. Если вы не нашли такой файл, посмотрите в конфигурационном файле httpd.conf, как установлена директива ErrorLog.

Сконфигурировав Apache для выполнения сценариев, вы можете приступить к их написанию для генерации веб-страниц. В оставшейся части данного раздела рассказывается, как это сделать на Perl, PHP и Python. В примерах для каждого из языков устанавливается соединение с сервером MySQL, выполняется запрос SHOW TABLES и результат отображается на веб-странице.

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

Perl
Ниже приведен наш первый веб-сценарий на Perl, show_tables.pl. Он создает заголовок в соответствии с указанным Content-Type:, пустую строку, отделяющую заголовок от тела страницы, и начальную часть страницы. Затем сценарий получает и отображает список таблиц базы данных cookbook. После списка таблиц выводятся завершающие HTML-теги, закрывающие страницу:

#! /usr/bin/perl -w
# show_tables.pl - Выполнить запрос SHOW TABLES и показать результат,
# генерируя непосредственно HTML
use strict;
use lib qw(/usr/local/apache/lib/perl);
use Cookbook;
# Вывести заголовок, пустую строку и начало страницы
print < Content-Type: text/html


Tables in cookbook Database

Tables in cookbook database:


EOF
# Соединиться с БД, показать список таблиц, отключиться
my $dbh = Cookbook::connect ();
my $sth = $dbh->prepare ("SHOW TABLES");
$sth->execute ();
while (my @row = $sth->fetchrow_array ())
{
print "$row[0]
\n";}
$dbh->disconnect ();
# Вывести завершающие теги
print <

EOF
exit (0);

Для проверки сценария поместите его в каталог cgi-bin и вызовите из броузера так:

http://apache.snake.net/cgi-bin/show_tables.pl

В сценарии show_tables.pl HTML генерируется включением в операторы вывода литералов, представляющих теги. Другой подход к генерации веб-страниц реализован в модуле CGI.pm, который упрощает создание веб-сценариев, не требуя буквального написания тегов. Модуль CGI.pm предлагает как объектно-ориентированный, так и функциональный интерфейс, позволяя создавать веб-страницы любым из этих методов. Сценарий show_tables_oo.pl использует объектно-ориентированный интерфейс для создания того же отчета, что и show_tables.pl:

#! /usr/bin/perl -w
# show_tables_oo.pl - Выполнить запрос SHOW TABLES и показать результат,
# используя объектно-ориентированный интерфейс CGI.pm
use strict;
use lib qw(/usr/local/apache/lib/perl);
use CGI;
use Cookbook;
# Создать CGI объект для доступа к методам CGI.pm
my $cgi = new CGI;
# Вывести заголовок, пустую строку и начало страницы
print $cgi->header ();
print $cgi->start_html (-title => "Tables in cookbook Database", -bgcolor => "white");
print $cgi->p ("Tables in cookbook database:");
# Соединиться с БД, показать список таблиц, отключиться
my $dbh = Cookbook::connect ();
my $sth = $dbh->prepare ("SHOW TABLES");
$sth->execute ();
while (my @row = $sth->fetchrow_array ())
{
print $row[0] . $cgi->br ();
}
$dbh->disconnect ();# Вывести завершающие теги
print $cgi->end_html ();
exit (0);

Сценарий включает модуль CGI.pm, используя директиву use CGI, затем создает CGI-объект $cgi, с помощью которого обращается к различным методам генерации HTML. Метод header() создает заголовок Content-Type:, а метод start_html() формирует начальную часть страницы вплоть до открывающего тега (body). После создания первой части страницы сценарий получает информацию с сервера базы данных и отображает ее. Имя каждой таблицы сопровождается тегом
, формируемым вызовом метода br(). Метод end_html() выводит завершающие теги и . Установив сценарий в каталог cgi-bin и вызвав его из броузера, вы увидите, что он генерирует такую же страницу, как и show_tables.pl.

Функции CGI.pm могут принимать множество параметров, часть которых необязательны. Чтобы позволить вам указывать только необходимые параметры, CGI.pm разрешает использовать в списке параметров нотацию -имя => значение. Например, в вызове start_html() параметр title назначает заголовок страницы, а bgcolor – цвет фона. Нотация -имя => значение позволяет указывать параметры в любом порядке, так что два следующих предложения эквиваленты:

print $cgi->start_html (-title => "My Page Title", -bgcolor => "white");
print $cgi->start_html (-bgcolor => "white", -title => "My Page Title");

Чтобы использовать функциональный, а не объектно-ориентированный интерфейс CGI.pm, следует немного изменить сценарии. Строка use, ссылающаяся на CGI.pm, импортирует названия методов в пространство имен сценария, и вы можете вызывать их как функции, не создавая объект CGI. Например, чтобы импортировать наиболее распространенные методы, сценарий должен содержать такое предложение:

use CGI qw(:standard);

Сценарий show_tables_fc.pl – это эквивалент только что рассмотренного show_tables_oo.pl, но написанный с использованием вызовов функций. Применяются те же методы CGI.pm, но вызываются они как автономные функции, а не через объект $cgi:

#! /usr/bin/perl -w
# show_tables_fc.pl - Выполнить запрос SHOW TABLES и показать результат,
# используя функциональный интерфейс CGI.pm
use strict;
use lib qw(/usr/local/apache/lib/perl);
use CGI qw(:standard); # импортировать имена стандартных методов
# в пространство имен сценария
use Cookbook;
# Вывести заголовок, пустую строку и начало страницы
print header ();print start_html (-title => "Tables in cookbook Database", -bgcolor => "white");
print p ("Tables in cookbook database:");
# Соединиться с БД, показать список таблиц, отключиться
my $dbh = Cookbook::connect ();
my $sth = $dbh->prepare ("SHOW TABLES");
$sth->execute ();
while (my @row = $sth->fetchrow_array ())
{
print $row[0] . br ();
}
$dbh->disconnect ();
# Вывести завершающие теги
print end_html ();
exit (0);

Поместите сценарий show_tables_fc.pl в каталог cgi-bin и убедитесь в том, что он формирует такой же вывод, как и show_tables_oo.pl.

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

% perldoc CGI
% perldoc CGI::Carp

Другие источники информации об этом модуле, как печатные, так и доступные в Интернете, приведены в приложении C.

PHP
Как это ни удивительно для веб-ориентированного языка, PHP не предоставляет возможностей сокращенного задания тегов. Но поскольку PHP является встраиваемым языком, вы можете просто буквально писать HTML в сценарии, не пользуясь предложением print. Рассмотрим сценарий show_tables.php, который переключается между режимами HTML и PHP:

# show_tables.php - Выполнить запрос SHOW TABLES и показать результат
include "Cookbook.php";
?>


Tables in cookbook Database

(body bgcolor="white")

Tables in cookbook database:

# Соединиться с БД, показать список таблиц, отключиться
$conn_id = cookbook_connect ();
$result_id = mysql_query ("SHOW TABLES", $conn_id);
while (list ($tbl_name) = mysql_fetch_row ($result_id))
print ("$tbl_name
\n");
mysql_free_result ($result_id);
mysql_close ($conn_id);
?>
(/body)


Чтобы протестировать сценарий, поместим его в каталог mcb дерева документов веб-сервера и вызовем его так:

http://apache.snake.net/mcb/show_tables.php

В отличие от Perl-версий сценариев вывода списка таблиц MySQL, сценарий PHP не содержит кода для вывода заголовка Content-Type:, так как PHP формирует его автоматически. (Если вас не устраивает такое положение дел, и вы хотите выводить свои заголовки, обратитесь к описанию функции header() в руководстве по PHP.)

Если не считать тегов переноса строки, все содержимое HTML в сценарии show_tables.php размещается за пределами тегов , так что интерпретатор PHP просто выводит его без интерпретирования. Приведем версию сценария, которая формирует весь HTML при помощи предложений print:

# show_tables_print.php - Выполнить запрос SHOW TABLES и показать результат,
# используя print() для формирования всего HTML
include "Cookbook.php";
print ("\n");
print ("\n");
print ("Tables in cookbook Database\n");
print ("\n");
print ("\n");
print ("

Tables in cookbook database:

\n");
# Соединиться с БД, показать список таблиц, отключиться
$conn_id = cookbook_connect ();
$result_id = mysql_query ("SHOW TABLES", $conn_id);
while (list ($tbl_name) = mysql_fetch_row ($result_id))
print ("$tbl_name
\n");
mysql_free_result ($result_id);
mysql_close ($conn_id);
print ("\n");
print ("\n");
?>

Иногда разумно применить один подход, иногда – другой, а иногда даже оба сразу в одном и том же сценарии. Если раздел HTML не ссылается ни на какие значения переменных и выражений, то, вероятно, предпочтительнее записать его в режиме HTML. В противном случае лучше использовать предложение print или echo, чтобы избежать частого переключения между режимами HTML и PHP.

Python
Стандартная инсталляция Python включает полезные для веб-программирования модули cgi и urllib. Однако на самом деле они нам пока не нужны, поскольку единственное, что будет делать наш первый веб-сценарий на Python, – генерация простого HTML-кода. Напишем на Python версию сценария, выводящего список таблиц MySQL:

#! /usr/bin/python
# show_tables.py - Выполнить запрос SHOW TABLES и показать результат
import sys
sys.path.insert (0, "/usr/local/apache/lib/python")
import MySQLdb
import Cookbook
# Вывести заголовок, пустую строку и начало страницы
print """Content-Type: text/html


Tables in cookbook Database

(body bgcolor="white")

Tables in cookbook database:


"""
# Соединиться с БД, показать список таблиц, отключиться
conn = Cookbook.connect ()
cursor = conn.cursor ()
cursor.execute ("SHOW TABLES")
for (tbl_name, ) in cursor.fetchall ():
print tbl_name + "
"
cursor.close ()
conn.close ()
# Вывести завершающие теги
print """
(/body)

"""

Поместите сценарий в каталог Apache cgi-bin и вызовите его так:

http://apache.snake.net/cgi-bin/show_tables.py

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Запуск веб-сценариев на сервере Tomcat
Кодирование специальных символов для Web
Основы формирования веб-страницы

Вернуться в раздел: MySQL / 16. Знакомство с MySQL для Web