Что есть модули Apache2 под Microsoft Windows


Сегодня хочу предложить вам статью читателя сайта ApacheDev.ru, в которой изложен его личный опыт в исследовании структуры модуля Apache 2. Статья будет интересна в первую очередь новичкам в области разработки модулей, так как в ней подробно рассмотрен процесс создания модуля Apache для ОС Windows с помощью Microsoft Visual C++ .NET. Приятного чтения.

В этой статье я попытаюсь ответить на этот вопрос, который меня начал волновать не так давно и впрочем, волнует и сейчас, т.е. содержимое этого текста не является завершенным.
Для этого я скачал и установил Apache2 (apache_2.2.4-win32-x86-no_ssl.msi).
В директории \modules содержатся исполняемые файлы модулей, файлы модулей имеют расширение *.so (насколько я знаю, в unix-подобных ОС такое расширение файлов имеют исполняемые модули с бинарным кодом, скорее всего в формате elf).
Так же были взяты на рассмотрение исходные коды примеров модулей.

Исследование модуля Apache2

Просматривая исходники в httpd-2.2.4\modules, я мало что понял.
Понятно, что общее для всех модулей это код:

module AP_MODULE_DECLARE_DATA logio_module;

module AP_MODULE_DECLARE_DATA logio_module =
{
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config */
NULL, /* merge per-dir config */
NULL, /* server config */
NULL, /* merge server config */
NULL, /* command apr_table_t */
register_hooks /* register hooks */
};
Где register_hooks функция обратного вызова, которая регистрирует функции обратного вызова, вызываемые при определенных условиях, той частью, которую некоторые зовут «ядром апача»
Но как проходит взаимодействие, как построена плагинная (модульная система) Apache2?
Как компилировать модули? И многие другие вопросы остались неясны.
Поэтому, был взят первый попавшийся модуль для Apache2 (мне попался mod_status.so) и был подвергнут препарации, посредством замечательной утилиты IDA Pro.
Выяснено, что модуль mod_status.so ни что иное как DLL, в которой присутствуют секции: релокации, данных, кода, ресурсов (где собственно и определена версия, которую видно на рисунке 1) импорта, экспорта.
Данные DLL модуля Apache
Рисунок 1. Свойства mod_status.so
Зачем нужны эти секции и что такое можно, почитать в гугле, так как это выходит за рамки содержания этого текста.
Итак, у DLL mod_status.so есть точка входа DllMain (на самом деле это не настоящая точка входа этого модуля, так как в нем используется CRT и реальная точка входа вызывает __CRT_INIT, что это такое и что она делает опять-таки можно почитать в гугле)
А чем же занимается DllMain в данном модуле?
Да собственно ничем:
Модуль Apache с точки зрения IDA
Рисунок 2. Модуль Apache2 с точки зрения IDA
Эта точка входа вызывается при событиях:
  • загрузки процессом этой DLL (DLL_PROCESS_ATTACH),
  • выгрузки DLL процессом (DLL_PROCESS_DETACH),
  • создание процессом нового потока (DLL_THREAD_ATTACH),
  • завершением потока процессом (DLL_THREAD_DETACH)
Вызов DisableThreadLibraryCalls() запрещает вызов DllMain при событиях связанных с созданием и удалением потоков процессом. Сделано это для оптимизации.
Просмотрев секцию импорта, определено что, модуль статически импортирует функции из:
  • KERNEL32.DLL
  • MSVCRT.DLL
  • LIBAPR-1.DLL
  • LIBAPRUTILS-1.DLL
  • LIBHTTPD.DLL
Что это за библиотеки, я думаю, читающий понимает.
Просматривание секции экспорта дало вот что: каждый модуль экспортирует некую переменную name_module, где name – имя модуля, например status_module
А эта переменная – указатель на структуру module, определенную в файле http_config.h:
/**
* Module structures. Just about everything is dispatched through
* these, directly or indirectly (through the command and handler
* tables).
*/

typedef struct module_struct module;
struct module_struct {
/** API version, *not* module version; check that module is
* compatible with this version of the server.
*/

int version;
/** API minor version. Provides API feature milestones. Not checked
* during module init */

int minor_version;
/** Index to this modules structures in config vectors. */
int module_index;
/** The name of the module’s C file */
const char *name;
/** The handle for the DSO. Internal use only */
void *dynamic_load_handle;
/** A pointer to the next module in the list
* @defvar module_struct *next */

struct module_struct *next;
/** Magic Cookie to identify a module structure; It’s mainly
* important for the DSO facility (see also mod_so). */

unsigned long magic;
/** Function to allow MPMs to re-write command line arguments. This
* hook is only available to MPMs.
* @param The process that the server is running in.
*/

void (*rewrite_args) (process_rec *process);
/** Function to allow all modules to create per directory configuration
* structures.
* @param p The pool to use for all allocations.
* @param dir The directory currently being processed.
* @return The per-directory structure created
*/

void *(*create_dir_config) (apr_pool_t *p, char *dir);
/** Function to allow all modules to merge the per directory configuration
* structures for two directories.
* @param p The pool to use for all allocations.
* @param base_conf The directory structure created for the parent directory.
* @param new_conf The directory structure currently being processed.
* @return The new per-directory structure created
*/

void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf);
/** Function to allow all modules to create per server configuration
* structures.
* @param p The pool to use for all allocations.
* @param s The server currently being processed.
* @return The per-server structure created
*/

void *(*create_server_config) (apr_pool_t *p, server_rec *s);
/** Function to allow all modules to merge the per server configuration
* structures for two servers.
* @param p The pool to use for all allocations.
* @param base_conf The directory structure created for the parent directory.
* @param new_conf The directory structure currently being processed.
* @return The new per-directory structure created
*/

void *(*merge_server_config) (apr_pool_t *p, void *base_conf,
void *new_conf);
/** A command_rec table that describes all of the directives this module
* defines. */

const command_rec *cmds;

/** A hook to allow modules to hook other points in the request processing.
* In this function, modules should call the ap_hook_*() functions to
* register an interest in a specific step in processing the current
* request.
* @param p the pool to use for all allocations
*/

void (*register_hooks) (apr_pool_t *p);
Теперь примерно ясно, как работают модули:
Apache из файла httpd.conf, выбирает записи типа LoadModule actions_module modules/mod_actions.so, где modules/mod_actions.so – путь к модулю, а actions_module – имя экспортируемой модулем mod_actions.so переменной, в которой содержится структура module, ну а далее думаю все понятно.
Подведем итоги:
Модуль для Apache2 под Microsoft Windows – это DLL, экспортирующая указатель на переменную типа module, корректно заполненную, модуль может использовать функции из DLL:
  • LIBAPR-1.DLL
  • LIBAPRUTILS-1.DLL
  • LIBHTTPD.DLL
которые импортируются им статически.

Создание модуля Apache2 с помощью Microsoft Visual C++ .NET

Ну теперь пример модуля, который можно собрать с помощью Microsoft Visual C++ .NET:
1.Создаем новый проект:
Новый проект для модуля Apache 2
Рисунок 3. Новый проект для модуля Apache 2
Какой тип приложения мы выберем, не имеет значения, потому что это DLL. Но выбирать что-то надо, поэтому выбираем Console. Далее указываем:
Выбираем тип приложения для модуля Apache 2
Рисунок 4. Выбираем тип приложения для модуля
2. Далее добавляем новый файл, где будет размещаться исходный код:
Добавляем файлы приложения
Рисунок 5. Добавляем файлы приложения
Далее размещаем наш исходный код в нем.
3. Настраиваем созданный проект:
Указываем включаемые файлы:
Указываем включаемые файлы
Рисунок 6. Указываем включаемые файлы
Указать, где находятся DLL, используемые этим модулем:
Указываем импортируемые библиотеки
Рисунок 7. Указываем импортируемые библиотеки
Так же можно указать расширение исполняемого файла:
Указываем расширение исполняемого файла
Рисунок 8. Указываем расширение исполняемого файла
Если вы создали cpp файл, то следует указать компилятору, что его нужно компилировать как c-файл:
Устанавливаем параметры сборки
Рисунок 9. Устанавливаем параметры сборки
И собираем модуль
В архиве содержится пример такого модуля, для компиляции которого вам необходимо указать путь к включаемым файлам и библиотекам статической линковки.
Автор: unknow [regiomontanus(at)mail(dot)ru]
Источник: ApacheDev.ru

Опубликовано в: Разработка модулей Март 24, 2007

67 Комментариев »

  1. спасибо, очень позновательно

    Комментарий от LesHka — Май 5, 2007 @ 2:19 pm

  2. Пример скомпилировал. Но Апач 2.4.4 на WinXP при загрузке модуля выдает исключение: “unknown software exception (0×80000003) в приложении по адресу 0×10011f6e” и дальше не грузится.
    Что делать?

    Комментарий от Филипп — Июль 11, 2007 @ 6:31 am

  3. 0×80000003 это int3
    возможно Вы или автор забыли убрать breakpoint:)

    Комментарий от unknow — Июль 14, 2007 @ 10:52 pm

  4. Да нет, брэкпоинты убраны.

    Комментарий от Филипп — Июль 19, 2007 @ 5:24 am

  5. 80000003 для виндавс это таки int3, а энто 10011f6e
    таки адрес прендлежэащий ДЛЛ

    Комментарий от unknow — Август 5, 2007 @ 8:18 pm

  6. Спасибо за информацию, мне будет полезно …

    Комментарий от Ferh — Июнь 26, 2008 @ 4:39 pm

  7. жду завершения,т к заинтересовался)

    Комментарий от Зима — Июль 26, 2008 @ 2:08 pm

  8. У меня тоже такая же ошибка.
    Блин не знаю что делать.
    Может это винда глючнаяч?

    Комментарий от Sam — Август 26, 2008 @ 10:14 pm

  9. Может и винда Поставь все обновления(сервиспаки), а еще лучше переставь виндовс и поставь все заново,
    У меня когда-то была похожая проблема из-за глюка винды..

    Комментарий от Alex — Август 27, 2008 @ 12:52 am

  10. МЕГА Полезно!!! Спасибо огромное!!!
    _____________
    /go.php?url=/go.php?url=/go.php?url=http://torip.ru/

    Комментарий от андрюха — Август 29, 2008 @ 2:00 pm

  11. За статью спасибо, полезная вещь…Респект!!!!

    Комментарий от yahud — Сентябрь 3, 2008 @ 5:58 pm

  12. ДА СОГЛАСЕН! СТАТЬЯ СУПЕРСКАЯ!!!
    _____________________________
    /go.php?url=/go.php?url=/go.php?url=http://sporeco.ru/

    Комментарий от чувак — Сентябрь 10, 2008 @ 8:46 pm

  13. оч классная инфа! респект!!
    ___________________________
    /go.php?url=/go.php?url=/go.php?url=http://www.stroymaterials.com/

    Комментарий от чувак — Сентябрь 12, 2008 @ 9:10 pm

  14. ничего такого чего я не знал!!!
    ___________________________
    /go.php?url=/go.php?url=/go.php?url=http://www.fastmed.ru/

    Комментарий от чувак — Сентябрь 12, 2008 @ 9:13 pm

  15. ОЧень классная статья! Супер! 5 балов!!
    _________________________
    /go.php?url=/go.php?url=http://omnigo.ru/

    Комментарий от иванов@!!! — Сентябрь 18, 2008 @ 4:44 pm

  16. Да не плохо! 4
    _____________________
    /go.php?url=/go.php?url=http://wowing.ru/

    Комментарий от вадик — Сентябрь 18, 2008 @ 4:47 pm

  17. ма коменты где?

    Комментарий от Голосочек — Сентябрь 20, 2008 @ 1:35 am

  18. Поставьте себе облако тегов. Будет намного проще ориентироваться в Ваших записях. Кстати, могу посоветовать плагин для WordPress, называется “WP Cumulus” - очень прикольное облако получается в форме шара из меток. Ссылку давать не буду, гугл поможет)

    Комментарий от Kolchin — Октябрь 10, 2008 @ 11:47 pm

  19. Без помощи тут не разберешься.

    Комментарий от Жанна — Октябрь 16, 2008 @ 11:03 pm

  20. Спасибо за содержательную инфу.Мне она оень пригодится

    Комментарий от Berman — Октябрь 17, 2008 @ 2:24 pm

  21. В мануалах, по-моему, об этом написано…

    Комментарий от Анна — Октябрь 28, 2008 @ 1:25 pm

  22. за картинки отдельное спасиба, все сразу понятно.

    Комментарий от Мартин — Ноябрь 8, 2008 @ 12:15 pm

  23. Спасибо за инструкцию!

    Комментарий от Тамара — Ноябрь 8, 2008 @ 4:42 pm

  24. неплохая инструкция,спасибо!

    Комментарий от Валерия — Ноябрь 8, 2008 @ 4:50 pm

  25. Вот я новичок в этом, но блин так и не разобрался…
    Судя по не которым комментам, даже у более опытных траблы с этим модулем.

    Комментарий от Потолков — Ноябрь 15, 2008 @ 3:03 pm

  26. Не могли бы вы выложить готовые исходники?

    Комментарий от Hitro — Декабрь 3, 2008 @ 12:42 am

  27. Это всё конечно хорошо, но что мне делать на висте ? там же через Ж всё

    Комментарий от Василь Иваныч — Декабрь 4, 2008 @ 2:15 am

  28. Я в сети видел что есть такие инстракшны для висты..погуглите Василь

    Комментарий от Балчик — Декабрь 4, 2008 @ 7:49 pm

  29. Не вижу смысла использовать Апач под Виндой..ставьте линукс и не парьтесь

    Комментарий от Справочник — Декабрь 5, 2008 @ 10:58 pm

  30. Почему то при установке модулей,вылазеет ошибка…!!!

    Комментарий от Настасья — Декабрь 7, 2008 @ 8:18 pm

  31. Какая? Что за вопрос блин - “Выскакивает ошибка”, и что теперь ?

    Комментарий от Пал Палыч — Декабрь 18, 2008 @ 11:30 pm

  32. Спасибо за инструкцию!

    Комментарий от ПОТОЛКОВ — Декабрь 24, 2008 @ 1:58 pm

  33. Добавил в закладки

    Комментарий от Заработок в Интернете — Декабрь 27, 2008 @ 10:02 am

  34. Спасибо за инструкцию, пишу курсак по Апачу, надеюсь, поможет.

    Комментарий от Lass — Январь 9, 2009 @ 6:09 pm

  35. большое спасибо, наконец-то нашел то что искал :)

    Комментарий от Антон М. — Январь 23, 2009 @ 5:30 pm

  36. По в……у з……….. н………. не ………….. и…….., ………….?

    Комментарий от givi — Январь 26, 2009 @ 2:47 pm

  37. У меня во время компиляции выскакивает ошибка
    \include\ap_config.h(20) : fatal error C1083: Не удается открыть файл include: apr.h: No such file or directory
    исходники apache скачивал под win32 вроде кнонибуть знает вчем проблема

    Комментарий от fantasma — Январь 29, 2009 @ 5:15 pm

  38. Да, то что нужно.

    Комментарий от pizzdozz — Февраль 3, 2009 @ 3:12 am

  39. А да, спасибо за тему!

    Комментарий от ivan76 — Февраль 3, 2009 @ 3:13 am

  40. Вы говорите, что статья незавершена. Когда продолжение?

    Комментарий от Вероника — Февраль 12, 2009 @ 10:22 am

  41. Верунь, по ходу еже никогда. Блог заброшен..

    Комментарий от Звезда — Февраль 12, 2009 @ 10:25 am

  42. А примеры создания таких модулей с помощью с помощью языков, отличных от с++ будут?

    Комментарий от Май — Февраль 12, 2009 @ 1:26 pm

  43. Вот это да! как раз то что искал!!

    Комментарий от deggit — Март 2, 2009 @ 10:03 pm

  44. проблема в 3 пункте.. не вижу файла, что делать?

    Комментарий от Юлия — Март 3, 2009 @ 10:03 am

  45. Зачем нужны эти секции и что такое можно, почитать в гугле, так как это выходит за рамки содержания этого текста.

    Комментарий от Алёна — Март 5, 2009 @ 8:47 pm

  46. Модуль для Apache2 под Microsoft Windows – это DLL, экспортирующая указатель на переменную типа module, корректно заполненную, модуль может использовать функции из DLL:

    Комментарий от Антон — Март 7, 2009 @ 8:09 pm

  47. Вроде сайт программиста а засрали((((

    Комментарий от Олег — Март 9, 2009 @ 9:00 am

  48. DLL mod_status.so есть точка входа DllMain (на самом деле это не настоящая точка входа этого модуля, так как в нем используется CRT и реальная точка входа вызывает __CRT_INIT, что это такое и что она делает опять-таки можно почитать в гугле)

    Комментарий от Даниил — Март 17, 2009 @ 9:55 am

  49. у вас очень хорошие статьи. и такие интересные.

    Комментарий от Аркадий — Март 20, 2009 @ 2:21 pm

  50. Спама у вас в комментариях очень много, а блог чисто технический, поставили бы капчу!

    Комментарий от Roma — Март 26, 2009 @ 9:40 am

  51. люди хватит спамить блоги

    Комментарий от экономика недвижимости — Апрель 1, 2009 @ 2:20 am

  52. Про спам в блогах, кто бы говорил, ник у Вас интересный как то не вяжется с именем(

    Комментарий от Alsu — Апрель 2, 2009 @ 1:32 pm

  53. Спасибо, начинаю осваивать создание модулей, статья очень пригодилась.

    Комментарий от Тектоник — Апрель 6, 2009 @ 8:31 am

  54. Может пора сменить капчу, много спама в комментариях, мне кажется проходят автоботы

    Комментарий от Kostya — Апрель 7, 2009 @ 8:36 am

  55. Жаль такой хороший блог а задыхается от спама

    Комментарий от Andrey — Апрель 8, 2009 @ 8:45 am

  56. Отлино пишете!!!

    Комментарий от Serg — Апрель 9, 2009 @ 2:45 pm

  57. Всегда можно заработать на вашем блоге, жаль что он загибается от спама

    Комментарий от Serg — Апрель 10, 2009 @ 12:04 am

  58. Спама у вас в комментариях очень много, а блог чисто технический

    Комментарий от Инга — Апрель 13, 2009 @ 12:08 pm

  59. Спасибо, начинаю осваивать создание модулей, статья очень пригодилась.

    Комментарий от Мартин — Апрель 13, 2009 @ 12:10 pm

  60. Почему бы не рассмотреть последнюю часть поста подробнее

    Комментарий от тут менеджмент читают — Апрель 15, 2009 @ 11:31 am

  61. Для меня это очень сложно, не проще ли заказать профессионалу, например вам, как можно с вами связаться?

    Комментарий от Ольга — Апрель 16, 2009 @ 10:54 am

  62. Я бы тоже заказал профессионалу.

    Комментарий от Сергей — Апрель 16, 2009 @ 8:13 pm

  63. Работу должен делать тот, кто умеет это делать хорошо, а не всякие шарлотаны или испытатели. Так что тут много желающий найдется я уверен.

    Комментарий от Виталий Игоревич — Апрель 17, 2009 @ 6:46 am

  64. у меня в моем браузере (safari) левая колонка куда то съезжает, проверьте разметку лекции по инвестциям тут

    Комментарий от инвестиции тут — Апрель 17, 2009 @ 12:12 pm

  65. А вы не пользуйтесь броузерами сторонних производителей и не будет ничего съезжать.

    Комментарий от Лариса — Апрель 18, 2009 @ 5:47 am

  66. >А вы не пользуйтесь броузерами сторонних производителей и не будет ничего съезжать.
    а что значит сторонних разработчиков? Вроде сафари браузер нормальный не сторонний :)

    Комментарий от авто — Апрель 18, 2009 @ 6:12 pm

  67. Я к нормальным отношу только оперу и мозилу. Остальные - отстой.

    Комментарий от Венеция — Апрель 20, 2009 @ 2:38 pm

Оставить комментарий

You must be logged in to post a comment.

© apachedev.ru, 2005-2011