【问题标题】:WebApp configuration in mod_perl 2 environmentmod_perl 2 环境中的 WebApp 配置
【发布时间】:2011-12-05 17:49:24
【问题描述】:

我有一个使用 mod_perl 2 编写的 Web 应用程序。(它是一个自定义处理程序模块,而不是注册表或 perlrun 脚本。)我想在服务器初始化时设置几个配置选项,最好是从配置文件。我遇到的问题是我还没有找到一个为我的应用程序的配置文件传递文件名的好地方。

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

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

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

那么我错过了什么?有什么好的选择吗?

【问题讨论】:

    标签: perl configuration-files mod-perl2


    【解决方案1】:

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

    如果您通过PerlPostConfigRequire startup.pl 预加载模块以访问mod/startup.pl,那么这是放置配置文件位置../cfg/app.cnf 的最佳位置,并且您可以完全灵活地将配置存储在内存中。另一种方法是 PerlModule 您的模块并在其中一个模块内的 BEGIN 块中加载配置(使用上述相对路径)。

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

    【讨论】:

      猜你喜欢
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      • 2016-11-29
      • 2017-10-22
      相关资源
      最近更新 更多