apxs — это утилита для сборки и установки модулей для HTTP сервера Apache. Apxs создает динамически-загружаемые объекты (DSO) из одного или нескольких файлов исходного кода или объектных файлов, которые затем могут загружаться в сервер Apache с помощью директивы LoadModule модуля mod_so.
Данная статья впервые была опубликова в 8 номере рассылки «Информационный бюллетень от ApacheDev.ru на Subscribe.ru».
Чтобы использовать этот механизм расширения функциональности сервера, ваша платформа должна поддерживать DSO, а ваш сервер Apache должен быть собран с модулем mod_so. Утилита apxs автоматически проверит данные требования. Также вы сами можете проверить это с помощью команды:
$ httpd -l
Модуль mod_so должен быть в этом списке.
Если эти требования соблюдены, то вы легко сможете расширить функциональность вашего сервера собственными модулями с помощью утилиты 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/httpd.conf] $ apachectl restart /path/to/apache/sbin/apachectl 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/apachectl restart: httpd started $ _
Аргумент files может содержать файлы исходных текстов на Си (.c), объектные файлы (.o) или файлы библиотек (.a). Утилита apxs автоматически распознает эти файлы и скомпилирует Си файлы, а объектные файлы и файлы архивов только скомпонует. Но, если вы используете объектные файлы, то убедитесь, что их код скомпилирован как независимый от расположения (position independent code (PIC)). Это обязательное условия для их динамической загрузки. Например, в компиляторе GCC для этого необходимо использовать параметр -fpic. Если вы используете другой Си компилятор, то поищите описание этой возможности в документации.
Для дополнительной информации о поддержки DSO в Apache прочитайте документацию модуля mod_so или ознакомьтесь с исходным кодом модуля в файле src/modules/standard/mod_so.c.
Синтаксис
apxs -g [ -S name=value ] -n modname apxs -q [ -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
При использовании опции -g она обязательна, а при использовании -i, если n не задана, тогда утилита apxs попытается определить имя модуля из исходного кода или из имени файла.
Опции запроса
-q
Опции конфигурации
-S name=value
1 | -S CFLAGS="`$APXS -q CFLAGS`" |
Опции генерации шаблона
-g
Опции компиляции DSO
-q
-o dsofile
-D name=value
-I incdir
-L libdir
-l libname
-Wc,compiler-flags
-Wl,linker-flags
Установка DSO и опции конфигурации
-i
-a
-A
1 | # |
-e
Примеры
Предположим, что имя файла нашего модуля Apache — mod_foo.c. Прежде всего надо скомпилировать исходный С файл в DSO файл, который можно будет загрузить в сервер 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 сама устанавливает созданные объекты в каталог модулей и соответственно обновляет файл httpd.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/httpd.conf] $ _
Эта команда добавит следующую строку в файл httpd.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/httpd.conf] apachectl restart /path/to/apache/sbin/apachectl 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/apachectl restart: httpd started $ _
Источник: httpd.apache.org