Пункт 66. Страница руководства: апкс
apxs
— это инструмент для создания и установки модулей расширения для сервера Apache HyperText Transfer Protocol (HTTP). Это достигается путем создания динамического общего объекта (DSO) из одного или нескольких исходных или объектных файлов , которые затем могут быть загружены на сервер Apache во время выполнения с помощью LoadModule
директивы from mod_so
.
Таким образом, чтобы использовать этот механизм расширения, ваша платформа должна поддерживать функцию DSO, и ваш httpd
двоичный файл Apache должен быть собран с
mod_so
модулем. Инструмент apxs
автоматически жалуется, если это не так. Вы можете проверить это самостоятельно, запустив вручную команду
$ httpd -l
Модуль mod_so
должен быть частью отображаемого списка. Если эти требования выполнены, вы можете легко расширить функциональность вашего сервера Apache, установив собственные модули с механизмом DSO с помощью этого apxs
инструмента:
$ apxs -i -a -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
cp mod_foo.so /path/to/apache/modules/mod_foo.so
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module `foo' in /path/to/apache/etc/apache2.conf]
$ apache2ctl restart
/path/to/apache/sbin/apache2ctl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/path/to/apache/sbin/apache2ctl restart: httpd started
$ _
Файлы аргументов могут быть любым исходным файлом C (.c), объектным файлом (.o) или даже библиотечным архивом (.a). Инструмент apxs
автоматически распознает эти расширения и автоматически использует исходные файлы C для компиляции, а объектные и архивные файлы используются только на этапе компоновки. Но при использовании таких предварительно скомпилированных объектов убедитесь, что они скомпилированы для позиционно-независимого кода (PIC), чтобы их можно было использовать для динамически загружаемого общего объекта. Например, с GCC вам всегда просто нужно использовать -fpic
. Для других компиляторов C обратитесь к его справочной странице или просмотрите флаги, apxs
используемые для компиляции объектных файлов.
Для получения более подробной информации о поддержке DSO в Apache прочитайте документацию
mod_so
или, возможно, даже прочитайте
src/modules/standard/mod_so.c
исходный файл.
Синопсис
apxs -g
[ -S name=value ]
-n modname
apxs -q
[ -v ]
[ -S name=value ]
query ...
apxs -c
[ -S name=value ]
[ -o dsofile ]
[ -I incdir ]
[ -D name=value ]
[ -L libdir ]
[ -l libname ]
[ -Wc,compiler-flags ]
[ -Wl,linker-flags ]
files ...
apxs -i
[ -S name=value ]
[ -n modname ]
[ -a ]
[ -A ]
dso-file ...
apxs -e
[ -S name=value ]
[ -n modname ]
[ -a ]
[ -A ]
dso-file ...
Параметры
Общие параметры
-
-n modname
- Это явно задает имя модуля для опций
-i
(установка) и -g
(генерация шаблона). Используйте это, чтобы явно указать имя модуля. Для option -g
это обязательно, для option -i
инструмент apxs
пытается определить имя из источника или (в качестве запасного варианта) хотя бы угадывая его из имени файла.
Параметры запроса
-
-q
- Выполняет запрос переменных и параметров среды, используемых для построения
httpd
. При вызове без параметров запроса он печатает все известные переменные и их значения. Необязательный -v
параметр форматирует вывод списка.
Используйте это, чтобы вручную определить параметры, используемые для сборки,
httpd
которые будут загружать ваш модуль. Например, используйте
INC=-I`apxs -q INCLUDEDIR`
внутри ваших собственных файлов Makefile, если вам нужен ручной доступ к файлам заголовков Apache C.
Параметры конфигурации
-
-S name=value
- Этот параметр изменяет настройки apxs, описанные выше.
Параметры генерации шаблона
-
-g
- При этом создается имя подкаталога (см. вариант
-n
) и два файла: Исходный файл примера модуля с именем
, который можно использовать в качестве шаблона для создания собственных модулей или в качестве быстрого старта для работы с механизмом apxs. И соответствующий для еще более легкой сборки и установки этого модуля. mod_name.c
Makefile
Параметры компиляции DSO
-
-c
- Это указывает на операцию компиляции. Сначала он компилирует исходные файлы C (.c) файлов в соответствующие объектные файлы (.o), а затем создает динамически разделяемый объект в dsofile , связывая эти объектные файлы с остальными объектными файлами (.o и .a)
файлов . Если
-o
параметр не указан, выходной файл угадывается по первому имени файла в файлах и, таким образом, по умолчанию обычно имеет значение . mod_name.so
-
-o dsofile
- Явно указывает имя файла созданного динамически общего объекта. Если не указано и имя не может быть угадано из
списка файлов
mod_unknown.so
, используется резервное имя .
-
-D name=value
- Эта опция напрямую передается командам компиляции. Используйте это, чтобы добавить свои собственные определения в процесс сборки.
-
-I incdir
- Эта опция напрямую передается командам компиляции. Используйте это, чтобы добавить свои собственные включаемые каталоги для поиска в процессе сборки.
-
-L libdir
- Этот параметр напрямую передается команде компоновщика. Используйте это, чтобы добавить свои собственные каталоги библиотек для поиска в процессе сборки.
-
-l libname
- Этот параметр напрямую передается команде компоновщика. Используйте это, чтобы добавить свои собственные библиотеки для поиска в процессе сборки.
-
-Wc,compiler-flags
- Эта опция передает флаги компилятора как дополнительные флаги команде
libtool --mode=compile
. Используйте это, чтобы добавить локальные специфичные для компилятора параметры.
-
-Wl,linker-flags
- Этот параметр передает флаги компоновщика в качестве дополнительных флагов для
libtool --mode=link
команды. Используйте это, чтобы добавить параметры, специфичные для локального компоновщика.
-
-p
- Этот параметр заставляет apxs связываться с библиотеками apr/apr-util. Это полезно при компиляции вспомогательных программ, использующих библиотеки apr/apr-util.
Варианты установки и настройки DSO
-
-i
- Это указывает на операцию установки и устанавливает один или несколько динамически совместно используемых объектов в каталог модулей сервера
.
-
-a
- Это активирует модуль, автоматически добавляя соответствующую
LoadModule
строку в файл конфигурации Apache
apache2.conf
или активируя его, если он уже существует.
-
-A
- То же, что и вариант
-a
, но созданная LoadModule
директива имеет префикс решётки ( #
), т. е . модуль просто подготовлен для последующей активации, но изначально отключен.
-
-e
- Это указывает на операцию редактирования, которую можно использовать с параметрами
-a
и -A
аналогично
-i
операции редактирования apache2.conf
файла конфигурации Apache без попытки установить модуль.
Примеры
Предположим, у вас есть доступный модуль Apache mod_foo.c
, который должен расширять функциональные возможности сервера Apache. Для этого вам сначала нужно скомпилировать исходный код C в общий объект, подходящий для загрузки на сервер Apache во время выполнения с помощью следующей команды:
$ apxs -c mod_foo.c
/path/to/libtool --mode=compile gcc ... -c mod_foo.c
/path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
$ _
Затем вам нужно обновить конфигурацию Apache, убедившись, что
LoadModule
присутствует директива для загрузки этого общего объекта. Для упрощения этого шага apxs
предусмотрен автоматический способ установки общего объекта в его каталог «modules» и apache2.conf
соответствующего обновления файла. Этого можно достичь, запустив:
$ apxs -i -a mod_foo.la
/path/to/instdso.sh mod_foo.la /path/to/apache/modules
/path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules
...
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module `foo' in /path/to/apache/conf/apache2.conf]
$ _
Таким образом, строка с именем
LoadModule foo_module modules/mod_foo.so
добавляется в файл конфигурации, если его еще нет. Если вы хотите, чтобы это было отключено по умолчанию, используйте опцию -A
,
т.е.
$ apxs -i -A mod_foo.c
Для быстрого тестирования механизма apxs вы можете создать образец шаблона модуля Apache и соответствующий Makefile с помощью:
$ apxs -g -n foo
Creating [DIR] foo
Creating [FILE] foo/Makefile
Creating [FILE] foo/modules.mk
Creating [FILE] foo/mod_foo.c
Creating [FILE] foo/.deps
$ _
Затем вы можете сразу скомпилировать этот образец модуля в общий объект и загрузить его на сервер Apache:
$ cd foo
$ make all reload
apxs -c mod_foo.c
/path/to/libtool --mode=compile gcc ... -c mod_foo.c
/path/to/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
apxs -i -a -n "foo" mod_foo.la
/path/to/instdso.sh mod_foo.la /path/to/apache/modules
/path/to/libtool --mode=install cp mod_foo.la /path/to/apache/modules
...
chmod 755 /path/to/apache/modules/mod_foo.so
[activating module `foo' in /path/to/apache/conf/apache2.conf]
apache2ctl restart
/path/to/apache/sbin/apache2ctl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/path/to/apache/sbin/apache2ctl restart: httpd started
$ _