Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Books
  Краткое описание
 Linux
 W. R. Стивенс TCP 
 W. R. Стивенс IPC 
 A.Rubini-J.Corbet 
 K. Bauer 
 Gary V. Vaughan 
 Д Вилер 
 В. Сталлинг 
 Pramode C.E. 
 Steve Pate 
 William Gropp 
 K.A.Robbins 
 С Бекман 
 Р Стивенс 
 Ethereal 
 Cluster 
 Languages
 C
 Perl
 M.Pilgrim 
 А.Фролов 
 Mendel Cooper 
 М Перри 
 Kernel
 C.S. Rodriguez 
 Robert Love 
 Daniel Bovet 
 Д Джеф 
 Максвелл 
 G. Kroah-Hartman 
 B. Hansen 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 MINIX...3057 
 Solaris...2933 
 LD...2906 
 Linux Kernel 2.6...2486 
 William Gropp...2182 
 Rodriguez 6...2016 
 C++ Templates 3...1946 
 Trees...1938 
 Kamran Husain...1866 
 Secure Programming for Li...1792 
 Максвелл 5...1711 
 DevFS...1695 
 Part 3...1684 
 Stein-MacEachern-> Час...1632 
 Go Web ...1627 
 Ethreal 4...1619 
 Стивенс 9...1607 
 Arrays...1607 
 Максвелл 1...1593 
 FAQ...1539 
 
  01.01.2024 : 3621733 посещений 

iakovlev.org

Chapter 2 - A First Module
 Apache Web Server

  Вам нужна рабочая версия самого апача , желательно последняя 
  (для подготовки этой книги была использована версия 1.3.4). 
 Его можно загрузить отсюда : http://www.apache.org/.
 Пользователи NT могут загрузить откомпилированные бинарники.
 Для этого вам нужно 2 компонента: 
 сам сервер на http://www.apache.org/dist/ApacheModulePerl.dll.
 Последний можно найти на Comprehensive Perl Archive Network (CPAN) 
 в каталоге authors/Jeffrey_Baker/.
 Этот модуль можно откомпилировать с помощью Microsoft Visual C++ .
 

C-компилятор и утилита make

Для использования C API вам нужен C-компилятор и утилиты. GNU gcc компилятор доступен например с веб-сайта http://www.gnu.org/.

Perl

Для использования Perl API вам нужен Perl не ниже 5.004 . Его можно найти например на CPAN .

Последние версии CGI.pm и LWP

CGI.pm - коллекция прикладных утилит . Рекомендованная версия - не ниже 2.42 . LWP (Library for WWW access in Perl) - коллекция модулей для создания веб-роботов , агентов , броузеров на перл . LWP необходим для создания прокси . mod_perl использует LWP во время инсталляции. Рекомендуемая версия LWP - не ниже 5.36 . CGI.pm и LWP можно найти на CPAN, в каталоге modules/by-module/CGI и modules/by-module/LWP.

Структура директорий

 Server root directory 
   В нее входят , как правило , /bin-каталог с самим httpd и apachectl-утилитой;
 конфигурация и логи лежат в /conf и /logs;
 каталог для CGI-скриптов - /cgi-bin;
 каталог для динамически загружаемых модулей -  /libexec;
 хидеры для C - /include;
 доки -  /htdocs.
  Собственно сам default server root каталог , как правило , лежит в  /usr/local/apache .
 В дальнейшем этот каталог мы будем условно называть ~www.
 На Win32-системах этот каталог обычно C:\Program Files\Apache Group\Apache.
 
  Document root directory 
 Это каталог по умолчанию , который получается , если вызвать  http://your.site/.
 
 Apache и mod_perl build 
 Это каталог , в котором вы компилите сам апач и mod_perl из исходников .
 Здесь не бывает стандартов и кто во что горазд : /usr/src, /usr/build, /usr/tmp.
 Все же рекомендуется ~www/build . 
 
 httpd.conf, srm.conf, access.conf 
  Это 3 важнейших апачевских конфига .
 Их разделение обусловлено исторически для поддержки NCSA httpd. 
 Некоторые сайты насильственно обьединяют все в один конфиг httpd.conf .
 Кстати , такая же настройка по умолчанию и в 1.3.4 Apache.
 Другие сайты для каждого хоста имеют свой отдельный конфиг , который  загружается
 с помощью директивы  Include .
  В книге используется следующий метод : все основные директивы хранятся в httpd.conf,
 включая виртуальные хосты . Apache Perl API директивы помещаются в отдельный файл
 perl.conf , который загружается при старт-апе так: 
 	<IfModule mod_perl.c>
 	Include conf/perl.conf
 	</IfModule>
 Директива <IfModule> позволяет нам использовать единый httpd.conf
 для добавления перлового embedded-интерпретатора .
 
 .htaccess 
  Этот файл можно использовать для изменения конфигурации , не затрагивая основной конфиг .
 Он может носить другое название . 
 
 cgi-bin 
  Скриптовый каталог обычно лежит в ~www/cgi-bin. 
 
 perl 
  Каталог перловых скриптов , выполняемых под mod_perl Apache::Registry модулем .
 По умолчанию это ~www/perl
 
 Module library tree 
  Необходимо выделить специальное место под модули , написанные как на перл , так и 
 на С (файлы с расширением .o и .so ). Обычно это  ~www/ libexec .
 Чисто перловые модули хранятся в  ~www/lib/perl .
 
 "Perl module" и "Apache Perl module" 
  Когда мы говорим - "module" , мы обычно подразумеваем модуль , написанный на Perl API.
 Perl при работе использует при работе целую библиотеку модулей (.pm) .
 Нужно различать "Perl module" , которые веб-серверу не нужны , и  "Apache Perl module" ,
 которые написаны на Apache Perl API и вызываются сервером . 
 Apache Perl modules обычно начинаются с префикса "Apache::". 
 Пример: 

 
Тип модуля
Пример
 
Apache module
mod_mime, mod_rewrite
 
Apache Perl module
Apache::AuthenDBI, Apache::Traffic
 
Perl module
Text::ParseWords, IO::File
Perl library tree Включает Perl-модули, Plain Old Documentation (POD), loadable library objects, и хидеры для компиляции перловых модулей . Расположение этих каталогов может быть неожиданным , но в основном это /usr/lib/perl5, /usr/local/lib/perl5. Installing mod_perl Прежде чем использовать Perl API, нужно загрузить и поинсталлировать mod_perl. Его можно взять на www.apache.org . На моем АСП 9.2 конфигурация у апача 2.0 следующая : основной исполняющий файл лежит в /usr/sbin/httpd утилиты лежат в /usr/bin библиотеки .so лежат в /usr/lib/httpd/modules документация лежит в /usr/share/doc , /usr/share/man конфиги лежат в /etc/httpd , /etc/logrotate.d логи лежат в подкаталогах каталога /var мануал лежит в /var/www/manual главный start-up-конфиг лежит в /etc/rc.d/init.d/httpd После закачки и распаковки архива mod_perl-2.0.0-RC3tar.gz я выполнил следующее : perl Makefile.PL # run installation script make # make httpd executable make test # run tests (optional) make install # install mod_perl После чего 2.5-метровый mod_perl.so лег на моей машине в каталог /usr/lib/httpd/modules/mod_perl.so Необходимо в httpd.conf добавить строку : LoadModule perl_module modules/mod_perl.so Для того чтобы получить полный доступ к Apache API , нужно запустить конфигурацию так perl Makefile.PL EVERYTHING=1 APACHE_PREFIX=/usr/sbin/httpd Опция EVERYTHING=1 позволяет использовать такие фичи , как поддержка хэндлеров , включение SSI на Perl , Perl-секции в конфигах апача .
 "Hello World" with the Perl API 
 
  Теперь необходимо придумать каталог для модулей , которые мы будем писать .
 Я организовал его в /usr/lib/perl5/5.8.1/Apache .
 Ложим в этот каталог файл Hello.pm следующего содержания :
 package Apache::Hello;
 # File: Apache/Hello.pm
 use strict;
 use Apache::Constants qw(:common);
 sub handler {
    my $r = shift;
    $r->content_type('text/html');
    $r->send_http_header;
    my $host = $r->get_remote_host;
    $r->print(<<END);
 <HTML>
 <HEAD>
 <TITLE>Hello There</TITLE>
 </HEAD>
 <BODY>
 <H1>Hello $host</H1>
 Who would take this book seriously if the first example didn't 
say "hello world"? </BODY> </HTML> END return OK; } 1;
В этом модуле всего одна подпрограмма с именем handler(). Добавим в httpd.conf директиву <Location> следующего содержания : <Location /hello> SetHandler perl-script PerlHandler Apache::Hello </Location> Перезапустив httpd и набрав URL http://localhost/hello , получим соответствующий контент . "Hello , World" с помощью C API В этой секции напишем модуль "Hello World" с использованием C API. Создадим подкаталог с именем site в подкаталоге modules . Полный путь должен выглядеть аналогично ~www/src/modules/site Создадим файл с именем Makefile.tmpl. Если модуль состоит из одного файла , Makefile.tmpl может быть пустым . Создадим файл с именем mod_hello.c со следующим содержанием : #include "httpd.h" #include "http_config.h" #include "http_core.h" #include "http_log.h" #include "http_protocol.h" /* file: mod_hello.c */ /* here's the content handler */ static int hello_handler(request_rec *r) { const char* hostname; r->content_type = "text/html"; ap_send_http_header(r); hostname = ap_get_remote_host(r->connection,r->per_dir_config,REMOTE_NAME); ap_rputs("<HTML>\n" ,r); ap_rputs("<HEAD>\n" ,r); ap_rputs("<TITLE>Hello There</TITLE>\n" ,r); ap_rputs("</HEAD>\n" ,r); ap_rputs("<BODY>\n" ,r); ap_rprintf(r,"<H1>Hello %s</H1>\n" ,hostname); ap_rputs("Who would take this book seriously if the first example didn't\n",r);
  ap_rputs("say \"hello world\"?\n"             ,r);
  ap_rputs("</BODY>\n"                          ,r);
  ap_rputs("</HTML>\n"                          ,r);
   return OK;
 }
 /* Make the name of the content handler known to Apache */
 static handler_rec hello_handlers[] =
 {
    {"hello-handler", hello_handler},
    {NULL}
 };
 /* Tell Apache what phases of the transaction we handle */
 module MODULE_VAR_EXPORT hello_module =
 {
   STANDARD_MODULE_STUFF,
   NULL,               /* module initializer                 */
   NULL,               /* per-directory config creator       */
   NULL,               /* dir config merger                  */
   NULL,               /* server config creator              */
   NULL,               /* server config merger               */
   NULL,               /* command table                      */
   hello_handlers,     /* [9]  content handlers              */
   NULL,               /* [2]  URI-to-filename translation   */
   NULL,               /* [5]  check/validate user_id        */
   NULL,               /* [6]  check user_id is valid *here* */
   NULL,               /* [4]  check access by host address  */
   NULL,               /* [7]  MIME type checker/setter      */
   NULL,               /* [8]  fixups                        */
   NULL,               /* [10] logger                        */
   NULL,               /* [3]  header parser                 */
   NULL,               /* process initialization             */
   NULL,               /* process exit/cleanup               */
   NULL                /* [1]  post read_request handling    */
 };
  Основная работа здесь выполняется в подпрограмме hello_handler() ,
 которая получает запрос апача и возвращает целое число . 
 content_type становится равным  text/html, затем вызывается ap_send_http_header().
   hello_handler() вычисляет DNS-имя удаленного хоста вызовом ap_get_remote_host() . 
 Далее строится HTML путем серии вызовов ap_rputs() и ap_rprintf(). 
 Они работают аналогично printf().
  В модуле mod_hello интерес представляют 9 фаз транзакции .
 Комментарий показывает , в каком порядке они вызываются , хотя вызываются они не все . 
 Этот модуль необходимо сконфигурировать . Для этого у апача есть специальный конфиг-скрипт .
 Аргумет activate-module используется для добавления модуля .
 Его аргументом является путь к файлу , в нашем случае это src/modules/site/mod_hello.c.
 Аргумент enable-module достаточно активировать 1 раз. 
 Из головного апачевского каталога , который включает файл ABOUT_APACHE , 
 нужно набрать команду :
  ./configure --activate-module=src/modules/site/mod_hello.c  --enable-module=hello
 Мы должны увидеть примерно следующий вывод :
 Configuring for Apache, Version 1.3.3
 + activated hello module (modules/site/mod_hello.c)
 Creating Makefile
 Creating Configuration.apaci in src
 Creating Makefile in src
 + configured for Linux platform
 + setting C compiler to gcc
 + adding selected modules
 + checking for system header files
 + doing sanity check on compiler and options
 Creating Makefile in src/support
 Creating Makefile in src/main
 Creating Makefile in src/ap
 Creating Makefile in src/regex
 Creating Makefile in src/os/unix
 Creating Makefile in src/modules/standard
   После чего запускаем make .
 Будет построена статическая библиотека libsite.a. 
 Добавим в конфиг секцию  <Location> : 
 <Location /hey/there>
   SetHandler  hello-handler
 </Location>
   Перезапускаем апач и набираем в броузере URI http://your.site/hey/there 
   и смотрим на приветствие .
 
  Динамически загружаемые модули 
  В апаче реализованы динамически загружаемые модули .
 Иногда апач нужно перекомпилировать , потому что зачастую такая загрузка 
 по умолчанию выключена .
 Для этого нужно набрать :
 	./configure --enable-module=so --enable-module=other_module ...
 Теперь нужно собрать mod_hello.so. Это можно сделать 2 путями .
 Один путь с помощью configure скрипта : все из того же каталога набираем  
 ./configure --activate-module=src/modules/site/mod_hello.c --enable-shared=hello
  Теперь запускаем make для создания src/modules/site/mod_hello.so.
 Полученный файл .so копируем в каталог libexec:
 В httpd.conf добавляем строку с именем модуля и путем : 
 LoadModule hello_module libexec/mod_hello.so
   Второй путь для получения динамического модуля - утилита apxs , 
   т.н. "APache eXtenSion"-утилита : 
 	~www/bin/apxs -c -i -a mod_hello.c
 Вывод : 
 	gcc -DLINUX=2 -DHAS_BOOL -DUSE_HSREGEX -I/usr/local/apache/include
 	-c mod_hello.c -o mod_hello.so mod_hello.o
 	cp mod_hello.so /usr/local/apache/libexec/mod_hello.so
 	chmod 644 /usr/local/apache/libexec/mod_hello.so
 	[activating module 'hello' in /usr/local/apache/conf/httpd.conf]
 Утилита apxs позволяет хранить модуль где угодно .
 Перезапускаем httpd  и смотрим в логи , если что-то не так .
 
 
 Instant-модули и Apache::Registry
  При использовании Apache API обычно возникает проблема .
 При внесении изменений в Perl API модуль для эффекта нужно перезапускать апач .
 При использовании C API надо перестроить библиотеку .
 Модуль Apache::Registry является частью mod_perl и призван 
 решать эту проблему .
 Он отслеживает изменения в CGI-скриптах , перекомпилировает их на ходу 
 без перезапуска апача .
 Этот модуль имеет отношение только к Perl CGI-скриптам .
 Для инсталляции Apache::Registry нужно создать каталог 
 для управляемых скриптов .
 Рекомендуется ~www/perl. В апачевском конфиге необходимо набрать :
  Alias /perl/ /usr/local/apache/perl/
 <Location /perl>
   SetHandler     perl-script
   PerlHandler    Apache::Registry
   PerlSendHeader On
   Options        +ExecCGI
 </Location>
 
 Напишем скрипт hello.pl , положим его в ~www/perl/ , и наберем в броузере
 http://your.site/perl/hello.pl. 
 	

#!/usr/local/bin/perl
 	# file: hello.pl
 	print "Content-Type: text/html\n\n";
 	print <<END;
 	<HTML>
 	<HEAD>
 	<TITLE>Hello There</TITLE>
 	</HEAD>
 	<BODY>
 	<H1>Hello $ENV{REMOTE_HOST}</H1>
          Hello !!!	 
 	</BODY>
 	</HTML>
 	END
 
  Если сделать изменения в таком скрипте , они вступят в силу немедленно .
 Такой скрипт постоянно висит в памяти и загружается быстрее . 
 С помощью Apache::Registry можно генерировать веб-формы :
 	#!/usr/local/bin/perl
 	use CGI qw(:standard);
 	use strict;
 	my $name = param('name') || 'Anonymous';
 	print header(),
 		start_html(-title=>'Yo!',-bgcolor=>'white'),
 		h1("Hello $name"),
 		p(
 		"To change your name, enter it into the text field below and press",
 		em("change name.")
 		),
 		start_form(),
 		"Name: ",textfield(-name=>'name',-value=>'Anonymous'),
 		submit(-value=>'Change Name'),
 		end_form(),
 		hr(),
 		end_html();
 
 
 
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье