MS RFC 135:MapServer 8.0配置文件

作者

史蒂夫·莱姆

联系

steve.lime@state.mn.us

作者

杰夫麦克纳

联系

jmckenna@gatewaygeomatics.com

状态

正在进行中

最后更新

2021-08-30

版本

MapServer 8.0版

概述

保护MapServer CGI应用程序需要在Web服务器级别设置环境变量。虽然不是特别困难,但它确实需要访问Web服务器配置文件,而且不同平台的方法可能会有很大差异。FastCGI实现对环境变量的支持参差不齐,这种方法将使事情标准化。此外,还可以通过允许站点管理员在站点级别设置限制来提高 Mapfile 级别的总体MapServer安全性。例如:

  • 可以集中定义插件注册表,以限制可以在映射文件中指定的内容

  • 所有映射文件都可以定义为不可变的,因此站点范围内不允许运行时更改

  • 常见属性的验证模式,以确保一致性

虽然这在很大程度上可以通过环境变量来完成,但这样做会变得很麻烦,而且容易出错。这种方法在很大程度上放弃了环境变量,但有一个值得注意的例外,如下所述。

建议的方法

我们建议引入一个MapServer配置文件(基本上是一个 ini 文件),它由MapServer CGI在运行时加载,并提供与映射文件不同的站点级配置。

识别配置文件

目前,单一的环境变量 (MAPSERVER_CONFIG_FILE )以确定要加载的配置文件。虽然建议使用环境变量来指定避免设置环境变量的配置文件有点讽刺,但在这种情况下,这种方法允许同一服务器上的不同部署(Vhost)在不同的配置下运行。

此外,默认位置/文件名(例如 ${{install dir}}/etc/mapserver.conf ),并在编译时设置。这可以由用户在编译时使用 -DMAPSERVER_CONFIG_FILE 旗帜。优先级是环境变量,然后是缺省值。如果两者都不可用(且有效,见下文),则MapServer将拒绝运行。

正在处理配置文件

配置文件看起来类似于一个包含熟悉的映射文件 SECTION ... END 构造。事实上,我们可以使用现有的词法分析器来处理文件,而不会产生添加另一个解析器的开销或对其他库的依赖。这个 configObj 结构基本上只是一系列散列 (hashObj )用于对相似的配置元素进行分组。目前,它包括:

  • ENV

    对当前支持的各种环境变量的引用(例如 MS_MAP_NO_PATH )

  • MAPS

    由键标识的可用映射文件的经过管理的列表。如果 MS_MAP_NO_PATH 则只有这些键才能与CGI映射参数一起使用。目前,这是通过环境变量支持的。

  • PLUGINS

    由关键字标识的插件列表的精选插件列表。这是新功能。

其他部分可能包括 METADATAVALIDATION ,它们是保存通用配置信息的地方。

与映射文件的关系

当前的概念验证实施需要配置文件。成功加载配置文件和映射文件后, configObj 被添加到 mapObj 作为只读成员,以便可以在必要时引用它。摧毁了 mapObj 不会破坏 configObj ,这是单独完成的。

一个挑战是,并不是所有的MapServer代码都引用了环境变量(例如 msFontCacheSetup() 在fontcache.c中)可以访问 mapObj 。使用 CPLSetConfigOption()/CPLGetConfigOption() 可能是一种解决方案(甚至感谢!)。

文件定义

#
# Example Config File
#
CONFIG
  ENV
    # Available variables (https://mapserver.org/environment_variables.html):
    #   MS_MAP_PATTERN - regex used to validate map variable values
    #   MS_MAPFILE - default mapfile if no value is passed in the map variable
    #   MS_MAP_NO_PATH - limits access to a curated set of maps (by key)
    MS_MAP_NO_PATH "true"
  END
  MAPS
    MAP1 "/opt/mapserver/myapp/map1.map"
    MAP2 "/opt/mapserver/myapp/map2.map"
  END
END

MapScrip支持

这主要是一个支持配置MapServer CGI应用程序的资源。但是,在某些情况下,MapScript利用该配置可能是有意义的。例如,如果我们需要在配置文件中注册插件,那么使用插件的应用程序就必须引用该资源。配置文件可以携带任意 name:value 对,并且对于跨脚本共享信息可能很有用。因此,我们建议提供一个简单的MapScript包装类,可以根据需要进行实例化。最初,配置文件成员只是散列,因此MapScrip hashObj 方法适用。因此,例如:

# Perl Syntax
$config = new mapscript::configObj('path to config file'); # could also read from the environment
$mapfile = $config->{map}->get('mymapfile'); # grab value from configuration
$map = new mapscript::mapObj($mapfile, $config); # $config is optional

新的源文件

  • Mapserv-config.cpp/mapserv-config.h

    核心实现,定义加载函数和助手函数(如msConfigGetEnv())。

源文件已更改

  • mapserv.c

    加载配置文件,如果未找到则中止。

  • mapserver.h

    将配置成员添加到mapObj结构。

  • mapfile.c

    将mapObj结构的配置成员初始化为空。

  • mapservutil.c

    MsCGILoadMap()使用msConfigGetEnv()而不是getenv();添加对mapObj的configObj引用。

  • mapscript/swiginc/config.i

    用于配置对象的基本Swig包装器。

  • mapscript/swiginc/map.i

    扩展mapObj构造函数以获取可选的figObj。

生成文件已更改

  • CMakeLists.txt

    典型的新源文件集成。

限制/注意事项

  • TBD

向后兼容性问题

该建议要求对所有CGI/FastCGI执行使用配置文件。这将略微改变安装和设置过程。然而,功能变化应该是相对有限的。

回归测试套件 msautotest 现在还包括一个配置文件:

/msautotest/etc/mapserv.conf

安全注意事项

这样做的目的是提高整体安全性和配置简便性。配置文件需要存储在受信任的位置,只有适当的个人才能访问。

性能影响

必须读取和处理配置文件,这会产生一些开销。尽管考虑到与典型的MapServer请求相关联的I/O,我们预计其影响相对较小。

票证ID和引用