我对Linux很陌生。昨天设置了VPS,安装了Apache2,PHP5和MySQL。
当我apache2 -l
时,我得到了这个:
Compiled in modules: core.c mod_log_config.c mod_logio.c prefork.c http_core.c mod_so.c
当我sudo a2enmod rewrite
时,我得到了这个:
Module rewrite already enabled
而rewrite.load
位于/etc/apache2/mods-enabled
。
任何人都可以说出错了吗?
答案 0 :(得分:3)
这真的属于ServerFault,但由于它最终可能会被迁移,所以我会继续说,编译成Apache的模块和动态加载的模块之间存在差异。
Apache能够以两种不同的方式加载模块。 “更简单”的方法是将模块静态编译到服务器中。这意味着可执行文件apache2
字面上包含模块的代码。这种方法的优点是模块始终可用,Apache不需要做任何特殊的操作来访问其代码,但另一方面,如果要添加,删除或更新静态编译的模块,你必须重新编译所有的Apache。另外,静态编译的模块越多,可执行文件就越大。由于这些原因,该列表通常只包含一些最重要的模块,基本上是Apache运行所需的最小模块。这几个模块是您在运行apache2 -l
时看到的列表中显示的模块。
Apache使用的所有其他模块(包括mod_rewrite
)都是动态加载的。也就是说,它们的代码存储为单独的文件,Apache在启动后找到并读入。这消除了静态编译方法的缺点:由于模块存储在单独的文件中,如果要添加/删除/更改一个,您只需要重新启动服务器,而不是重新编译它。您可以通过将LoadModule
指令放在Apache配置文件中来告诉Apache要加载哪些模块。这基本上是a2enmod
的作用:它向配置文件添加LoadModule
指令。 (实际上它将存根配置文件符号链接到由主配置提供的目录中)
如果要查看已加载模块的完整列表,包括动态加载的模块,可以运行
apache2 -M
但是,您必须确保以与Ubuntu的init脚本相同的方式运行Apache。系统在启动Apache之前读取配置文件或其他东西是很常见的,如果你不这样做,它可能会改变加载的模块集。