On this page
Apache 模块 mod_so
Description: | 在启动或重启时将可执行代码和模块加载到服务器中 |
---|---|
Status: | Extension |
Module Identifier: | so_module |
Source File: | mod_so.c |
Compatibility: | 这是 Windows 上的基本模块(始终包括在内) |
Summary
在选定的 os 上,此模块可用于在运行时通过动态共享对象(DSO)机制将模块加载到 Apache HTTP Server 中,而无需重新编译。
在 Unix 上,加载的代码通常来自共享对象文件(通常带有.so
extensions),在 Windows 上,它可以是.so
或.dll
extensions。
Warning
为一个主要版本的 Apache HTTP Server 构建的模块通常无法在另一个主要版本上使用。 (例如 1.3 与 2.0 或 2.0 与 2.2 的对比),一个主要版本与另一个主要版本之间通常会进行 API 更改,因此需要修改模块才能与新版本一起使用。
为 Windows 创建可加载模块
Note
在 Windows 上,可加载文件的文件 extensions 通常为.dll
,Apache httpd 模块称为mod_whatever.so
,就像在其他平台上一样。但是,您可能会遇到 continue 使用.dll
约定的第三方模块(例如 PHP)。
尽管mod_so
仍使用ApacheModuleFoo.dll
名称加载模块,但最好使用新的命名约定。如果您要将可装载模块转换为 2.0,请将该名称固定为该 2.0 约定。
在 Unix 和 Windows 版本之间,Apache httpd 模块 API 保持不变。许多模块将在 Windows 上运行,与 Unix 相比几乎没有变化,尽管其他模块依赖于 Windows 中不存在的 Unix 体系结构,并且将无法正常工作。
模块工作时,可以通过以下两种方法之一将其添加到服务器。与 Unix 一样,它可以编译到服务器中。因为 Windows 的 Apache httpd 没有 Unix 的 Apache httpd Configure
程序,所以必须将模块的源文件添加到 ApacheCore 项目文件中,并且必须将其符号添加到os\win32\modules.c
文件中。
第二种方法是将模块编译为 DLL,这是一个共享库,可以使用LoadModule
指令在运行时将其加载到服务器中。这些模块 DLL 可以在 Windows 安装的任何 Apache httpd 上分发和运行,而无需重新编译服务器。
要创建模块 DLL,需要对模块的源文件进行一些小的更改:必须从 DLL 中导出模块记录(稍后将创建 DLL;请参见下文)。为此,请将AP_MODULE_DECLARE_DATA
(在 Apache httpd 头文件中定义)添加到模块的模块记录定义中。例如,如果您的模块具有:
module foo_module;
将以上内容替换为:
module AP_MODULE_DECLARE_DATA foo_module;
请注意,这只会在 Windows 上激活,因此如果需要,该模块可以 continue 与 Unix 一起使用,而无需更改。另外,如果您熟悉.DEF
文件,则可以使用该方法导出模块记录。
现在,创建一个包含您的模块的 DLL。您需要将其链接到编译 libhttpd.dll 共享库时创建的 libhttpd.lib 导出库。您可能还必须更改编译器设置,以确保正确找到 Apache httpd 头文件。您可以在服务器根目录的 modules 目录中找到此库。最好从树中获取一个现有的模块.dsp 文件,以确保正确配置了构建环境,或者交替比较编译器和链接选项与.dsp。
这将创建模块的 DLL 版本。现在,只需将其放置在服务器根目录的modules
目录中,然后使用LoadModule
指令加载它即可。
LoadFile Directive
Description: | 链接到命名的对象文件或库 |
---|---|
Syntax: | LoadFile filename [filename] ... |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_so |
启动或重新启动服务器时,LoadFile
伪指令链接到命名的目标文件或库中。这用于加载某些模块可能需要的其他代码。 文件名是绝对路径或相对于ServerRoot的相对路径。
For example:
LoadFile "libexec/libxmlparse.so"
LoadModule Directive
Description: | 链接到目标文件或库中,并添加到活动模块列表中 |
---|---|
Syntax: | LoadModule module filename |
Context: | 服务器配置,虚拟主机 |
Status: | Extension |
Module: | mod_so |
LoadModule
伪指令链接目标文件或库* filename ,并将名为 module *的模块结构添加到活动模块列表中。 * Module *是文件中module
类型的外部变量的名称,并在模块文档中列为Module Identifier。
For example:
LoadModule status_module "modules/mod_status.so"
从 ServerRoot 的 modules 子目录中加载命名模块。