部署

MaXOXY实现了Python的Web服务器网关接口(WSGi),Servlet API是Java的。部署WSGi Web应用程序有不同的方法。

maproxy附带了一个简单的HTTP服务器,该服务器易于启动,足以进行本地测试,请参见 测试 . 对于生产和负载测试,建议选择 production setups .

测试

这个 serve-develop 子命令 mapproxy-util 启动HTTP服务器进行本地测试。它将现有的maproxy配置文件作为参数::

mapproxy-util serve-develop mapproxy.yaml

如果配置或任何maproxy代码更改,服务器将自动重新加载。

--bind, -b

设置mapproxy应该监听的套接字。默认为 localhost:8080 . 接受端口号或 hostname:portnumber .

--debug

在调试模式下启动maproxy。如果已安装 Werkzeug, 对于任何未处理的异常(内部错误),您将在Web浏览器中获得交互式跟踪。

注解

此服务器足以进行配置的本地测试,但它是 not 对于生产或负载测试稳定。

这个 serve-multiapp-develop 子命令 mapproxy-util 类似于 serve-develop 但是需要一个maproxy配置目录。见 MultiMapProxy .

生产

在生产环境中部署maproxy有两种常见方法。

嵌入在HTTP服务器中

您可以直接将maproxy集成到Web服务器中。Apache可以将python Web服务与 mod_wsgi 例如,扩展。

在HTTP服务器或代理之后

您可以在现有Web服务器之后作为单独的本地HTTP服务器运行maproxy。 (nginx, Apache等)或HTTP代理 (Varnish, 鱿鱼等)。

这两种方法都需要一个将您的maproxy配置映射到maproxy应用程序的配置。您可以为此编写一个小脚本文件。

服务器脚本

您需要一个脚本,使配置的maproxy可用于python wsgi服务器。

可以使用创建基本脚本 mapproxy-util ::

mapproxy-util create -t wsgi-app -f mapproxy.yaml config.py

该脚本包含以下行,并使配置的maproxy可用为 application ::

from mapproxy.wsgiapp import make_wsgi_app
application = make_wsgi_app('examples/minimal/etc/mapproxy.yaml')

这足以嵌入maproxy mod_wsgi 或者用python http服务器启动它,比如 waitress (见下文)。您可以将此脚本扩展到设置日志或设置环境变量。

如果配置更改,您可以启用maproxy自动重新加载配置::

from mapproxy.wsgiapp import make_wsgi_app
application = make_wsgi_app('examples/minimal/etc/mapproxy.yaml', reloader=True)

阿帕奇莫迪WSGI

ApacheHTTP服务器可以直接将python应用程序与 mod_wsgi 延伸。好处是您不必启动其他服务器。读 mod_wsgi installation 详细说明。

mod_wsgi 需要一个服务器脚本,该脚本将配置的wsgi函数定义为 application . 见 above .

你需要修改你的Apache httpd.conf 如下:

# if not loaded elsewhere
LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias /mapproxy /path/to/mapproxy/config.py

<Directory /path/to/mapproxy/>
  Order deny,allow
  Allow from all
</Directory>

mod_wsgi has a lot of options for more fine tuning. WSGIPythonHome or WSGIPythonPath lets you configure your virtualenv and WSGIDaemonProcess/WSGIProcessGroup 允许您启动多个进程。见 mod_wsgi configuration directives documentation . 使用mapnik还需要 WSGIApplicationGroup 选择权。

注解

仅在Windows上 WSGIPythonPath 支持选项。Linux/Unix支持 WSGIPythonPathWSGIPythonHome . 也见 mod_wsgi documentation for virtualenv 有关使用多个virtualenv时的详细信息。

更完整的配置可能如下所示:

# if not loaded elsewhere
LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias /mapproxy /path/to/mapproxy/config.py
WSGIDaemonProcess mapproxy user=mapproxy group=mapproxy processes=8 threads=25
WSGIProcessGroup mapproxy
# WSGIPythonHome should contain the bin and lib dir of your virtualenv
WSGIPythonHome /path/to/mapproxy/venv
WSGIApplicationGroup %{GLOBAL}

<Directory /path/to/mapproxy/>
  Order deny,allow
  # For Apache 2.4:
  Require all granted
  # For Apache 2.2:
  # Allow from all
</Directory>

在HTTP服务器或代理之后

有可用的python http服务器可以直接运行maproxy。它们中的大多数都是健壮和高效的,但是有一些奇怪的HTTP客户机(mis)以各种方式解释HTTP标准。因此,建议将成熟且广泛部署的HTTP服务器或代理放在前面(如 Apache, Nginx, 等等)。

python HTTP服务器

启动时需要在后台启动这些服务器。建议从systemd或upstart启动。

Waitress

Waitress 是一个产品级的纯pythonwsgi服务器,具有非常可接受的性能。它运行在Unix和Windows上。

您需要一个创建maproxy应用程序的服务器脚本(请参见 above )脚本需要位于从中开始的目录中 waitress 它需要以 .py .

启动MapProxy时使用服务员和我们的服务器脚本(没有 .py ):

cd /path/of/config.py/
waitress --listen 127.0.0.1:8080 config:application

UWSGI

uWSGI是另一个生产质量的WSGI服务器。它是高度可配置的,并提供高性能(通过在多个处理器上运行)。

这个 uWSGI documentation provides a quickstart .

HTTP代理

您可以使用专用的HTTP代理,例如 Varnish 或具有代理功能的通用HTTP Web服务器,如Apache with mod_proxy 在Maproxy前面。

您需要设置一些HTTP头,以便maproxy可以使用代理的URL而不是maproxy应用程序的本地URL生成功能文档。

  • Host –是客户端用于访问mapproxy(即代理)的主机名

  • X-Script-Name – path of MapProxy when the URL is not / (e.g. `` /MeXXY’

  • X-Forwarded-Host – alternative to HOST

  • X-Forwarded-Proto -应该是 https 当客户端连接到HTTPS时

Nginx

下面是一个例子 Nginx 包含代理模块的Web服务器。它将所有请求转发到 example.org/mapproxylocalhost:8181/ ::

server {
  server_name example.org;
  location /mapproxy {
    proxy_pass http://localhost:8181;
    proxy_set_header Host $http_host;
    proxy_set_header X-Script-Name /mapproxy;
  }
}

阿帕奇

下面是一个例子 Apache 包含的Web服务器 mod_proxymod_headers 模块。它将所有请求转发到 example.org/mapproxylocalhost:8181/

<IfModule mod_proxy.c>
  <IfModule mod_headers.c>
        <Location /mapproxy>
                ProxyPass http://localhost:8181
                ProxyPassReverse  http://localhost:8181
                RequestHeader add X-Script-Name "/mapproxy"
        </Location>
  </IfModule>
</IfModule>

您需要确保两个模块都已加载。这个 Host 默认情况下已设置为正确的值。

性能

由于python在计算重应用程序(如maproxy wms)时处理线程的方式,您应该选择使用多个进程(基于预复刻)以获得最佳性能的服务器。

上面的示例都是最少的,您应该阅读组件的文档,以获得安装程序的最佳性能。

负载平衡和高可用性

您可以轻松地并行运行多个maproxy实例,并使用负载均衡器在所有实例之间分发请求,但是当实例与NFS或其他网络文件系统共享同一个tile缓存时,有一些事情需要考虑。

maproxy使用文件锁来防止多个进程从一个源请求同一个映像两次。当maproxy并行处理两个或多个丢失的图块请求,并且这些图块属于同一个元图块时,通常会发生这种情况。如果不锁定,maproxy将为每个请求请求元数据块。有了锁,只有第一个进程才能获得锁并请求元数据块。其他进程将等待,直到第一个进程释放锁,然后使用新创建的图块。

由于文件锁定在大多数网络文件系统上都不起作用,所以当maproxy在网络文件系统上写入这些文件时,很可能会出错。您应该将maproxy配置为在本地文件系统上写入所有锁文件,以防止发生这种情况。见 globals.cache.lock_dirglobals.cache.tile_lock_dir .

使用此设置,只有当对同一元图块的图块的并行请求转到同一个maproxy实例时,锁定才会有效。因为这些请求通常是从同一个客户机发出的,所以应该启用 粘性会话 在您的负载均衡器中,当您提供平铺服务(wmts/tms/kml)时。

登录

maproxy使用python日志库来报告运行时信息、错误和警告。您可以使用python代码或ini样式配置来配置日志记录。阅读 logging documentation for more information .

伐木工人

maproxy对系统的不同部分使用多个记录器。记录器构建一个层次结构,并以点式表示法命名。 mapproxy 是一切的记录者, mapproxy.source 是所有资源的记录器, mapproxy.source.wms 是所有WMS源等的记录器。如果在记录器上配置(例如 mapproxy )然后所有子记录器也将使用此配置。

以下是最重要的记录员:

mapproxy.system

记录有关系统和安装的信息(例如使用的投影库)。

mapproxy.config

记录有关配置的信息。

mapproxy.source.XXX

记录服务的错误和警告 XXX .

mapproxy.source.request

将所有请求记录到具有URL、大小(KB)和持续时间(毫秒)的源。持续时间是接收响应头所用的时间。实际请求持续时间可能更长,尤其是对于较大的图像或网络带宽有限的情况下。

启用日志记录

这个 test server 已配置为将所有消息记录到控制台 (stdout )其他部署选项需要日志配置。

服务器脚本

您可以使用python日志API或加载 .ini 配置,如果您有 server script 用于部署。

使用创建的示例脚本 mapproxy-util create -t wsgi-app 已包含要加载的代码 .ini 文件。您只需要取消这些行的注释并创建一个 log.ini 文件。您可以创建一个示例 log.ini 用:

mapproxy-util create -t log-ini log.ini

MultiMapProxy

1.2.0 新版功能.

您可以使用multimaproxy应用程序在一个进程中运行多个maproxy实例(配置)。

multimaproxy可以动态加载配置。您可以将所有配置放在一个目录中,并将每个文件映射到一个URL: conf/proj1.yaml 可在 http://hostname/proj1/ .

每个配置都将按需加载,并且maproxy缓存每个加载的实例。如果文件更改,将重新加载配置。

多映射代理作为以下选项:

config_dir

maproxy应查找配置的目录。

allow_listing

如果设置为 true ,mapproxy将在mapproxy的根URL中列出所有可用的配置。默认为 false .

服务器脚本

有一个 make_wsgi_app 功能在 mapproxy.multiapp 创建配置的multimaproxy wsgi应用程序的包。替换 application 脚本中的定义如下:

from mapproxy.multiapp import make_wsgi_app
application = make_wsgi_app('/path/to.projects', allow_listing=True)