Apache模块 mod_so
说明 | 允许运行时加载DSO模块 |
---|---|
状态 | 扩展(E) |
模块名 | so_module |
源文件 | mod_so.c |
兼容性 | 在Windows上这是一个基本模块(始终包含) |
概述
该模块在支持动态链接机制的操作系统上可以用来在Apache启动和重启时加载DSO模块,而不用重新编译。
在Unix上,被加载的可执行代码通常来自于共享对象文件(一般以.so
为扩展名),在Windows上则为.so
或.dll
扩展名。
警告
用于Apache1.3的模块不能直接用于Apache2.0 。
为Windows创建可加载模块
注意
从Apache1.3.15开始,Windows上的模块名规则发生了变化,现在使用mod_foo.so格式的名字。
Apache模块的API对于Unix和Windows是一样的。许多模块在这两个平台间移植几乎不需要什么修改,除非那些依赖于Unix特定属性而Windows没有提供的模块。
如果一个模块可用,那么有两种方法使用它。在Unix上,可以被静态编译进服务器。因为用于Windows的Apache并没有相应于Unix下的Configure
编译配置程序,模块的源文件必须被加进ApacheCore项目文件,并且它的符号(symbols)必须被添加到os\win32\modules.c
文件。
第二种方法是编译为一个动态链接库(DLL),以便在运行期间使用LoadModule
指令加载。这些模块DLL在Apache安装期间就已经安装好了,不需要你自己去编译。
为了将模块编译为DLL,需要对模块的源文件做一个小小的修改:模块记录(module record)必须从DLL导出(稍后将会创建,见下)。为了达到这个目的,请将AP_MODULE_DECLARE_DATA
(在Apache头文件中定义的)添加到你的模块记录(module record)定义中。比如,如果你的模块有:
module foo_module;
将上述内容替换为:
module AP_MODULE_DECLARE_DATA foo_module;
注意,这仅在Windows上有效,因此该模块可以不加修改的直接在Unix上使用。另外,如果你对.DEF
文件很熟悉,你也可以使用它代替前面的方法导出该模块。
要创建一个包含该模块的DLL文件,你还必须将它连接到在编译libhttpd.dll共享库时创建的libhttpd.lib导出库。你还可能需要修改编译器设置以确保Apache头文件被正确的加载了。这些库位于服务器根目录下的"modules"目录中。最好是从中抓出一个已经存在的模块.dsp文件来看看以确保编译环境配置无误,或者按照.dsp文检查编译器和连接器的选项也可。
这样将会为你的模块创建一个DLL版本。只要将它放置到modules
目录下,并使用LoadModule
指令加载即可。
LoadFile 指令
说明 | 加载已命名的目标文件或库 |
---|---|
语法 | LoadFile _filename_ [_filename_] ... |
作用域 | server config |
状态 | 扩展(E) |
模块 | mod_so |
该指令用于在服务器启动或者重启时加载已命名目标文件或库,以用于加载需要被某些模块使用的额外代码。Filename可以是一个绝对路径或者相对于ServerRoot
的相对路径。
例如:
LoadFile libexec/libxmlparse.so
LoadModule 指令
说明 | 加载目标文件或库,并将其添加到活动模块列表 |
---|---|
语法 | LoadModule _module filename_ |
作用域 | server config |
状态 | 扩展(E) |
模块 | mod_so |
该指令加载目标文件或库filename并将模块结构名module添加到活动模块列表。module就是源代码文件中用于拼写module
的外部变量名,并作为模块标识符(Module Identifier)列在模块文档中。例如:
LoadModule status_module modules/mod_status.so
加载了位于ServerRoot
下模块目录中指定的模块。