2011-10-12 35 views
1

我有一个web应用程序我正在写mod_perl 2.(这是一个自定义处理程序模块,而不是注册表或perlrun脚本)。我想在服务器上设置几个配置选项初始化,最好来自配置文件。我遇到的问题是,我没有找到一个好的地方为我的应用程序的配置文件传递一个文件名。mod_perl 2环境中的WebApp配置

我第一次尝试加载“./app.conf”,但当前目录不是模块的位置,所以它是不可预测和容易出错的。或者,我必须假设一些相对或绝对的路径。这是不灵活的,如果主机操作系统分布发生更改,则可能会出现问题。我不想硬编码路径(尽管如果没有更好的方法,/ etc中的某些内容可能是可以接受的)。

我也尝试过PerlSetVar,但该值在请求时间之前不可用。虽然这是可行的,但这意味着我可能至少每个子进程(线程)初始化一次从磁盘读配置文件。我宁愿在服务器初始化时加载,并且在创建子进程时拥有不可变的静态哈希,这是生成环境的一部分。

我考虑过使用config.pl,但这意味着我要么有一个config.pl,要么有一个选项来配置在哪里找到app.conf文件,要么将选项本身移动到config.pl中,用户在设置选项时遵守Perl语法。未来的用户将是内部管理员,所以这不是不合理的,但它比我想要的更复杂。

那么我错过了什么?任何好的选择?

回答

0

通常首要任务是避免在可执行文件中包含配置文件。否则,服务器配置错误可能会意外地向全世界显示您的私人配置信息。我把应用程序需要的所有东西放在/srv/app0之下,子目录cfg是包含可执行文件的目录的兄弟。 (More detail.

如果通过PerlPostConfigRequire startup.pl是预加载模块访问mod/startup.pl那么这就是把配置文件位置../cfg/app.cnf最好的地方,你必须重新如何配置存储在内存中的灵活性。另一种方法是PerlModule模块,并在其中一个模块的BEGIN块中加载配置(使用上述相对路径)。

通常处理一个配置文件不会花费大量时间,所以一个流行的选项是延迟加载:如果代码检测到配置丢失,则在继续之前加载它。如果代码需要早于此知道配置,这是没有用的,但它避免了很多问题,特别是在将代码迁移到非modperl env时。