部署到生产服务器

PyWPS由两个主要部分组成: * PyWPS pywps.app.Service the main process to accept client requests, * :py:module::pywps.queue 负责以异步模式调用存储的请求。

服务模块

这个 pywps.app.Service 班级负责 同步的 请求执行:GetCapabilites、DescribeProcess和Execute同步进行。模式,在这种情况下,服务类将

  1. 接受请求

  2. 执行请求有两种处理方式:

  1. 如果,请求将在 同步的 模式,它将直接执行-同步请求立即执行。

  2. 在这种情况下,请求将作为 异步的 模式下,请求将存储在数据库中。

这意味着:异步请求不是由服务类执行的,而是存储在数据库中。

队列模块

这个 :py:module::pywps.queue 有一个 JobQueueService 单独启动-它将启动一个进程,该进程将定期检查数据库存储的请求,如果存在某个进程,它将被删除并执行。

服务只启动 parallelprocesses 工艺编号。

服务不接受来自客户端的请求,它只是监视数据库并启动进程作业。

安装

正如 安装 第节,在使用基于烧瓶的服务器时,没有针对pywps的特定部署过程。但是这个公式不打算在生产环境中使用。对于生产, sudo service apache2 restartApache httpdnginx 更建议使用服务器。PyWPS作为 WSGI 这些服务器上的应用程序。pywps依赖于 Werkzeug 用于此目的的库。

然后作业队列服务也必须启动。

部署单个pywps实例

PYWPS应该安装在您的计算机中(根据 安装 部分)。接下来,您可以创建wps服务器的多个实例。

建议每个pywps实例都有自己的目录,wsgi文件和可用进程应该位于该目录中。因此,为pywps实例创建一个新目录:

$ sudo mkdir /path/to/pywps/

# create a directory for your processes too
$ sudo mkdir /path/to/pywps/processes

注解

在这个配置示例中,假设服务器上只有一个pywps实例。

每个实例都由一个 WSGI 脚本(用python编写),它:

  1. 加载配置文件

  2. 服务流程

  3. 注意最大并发进程数和类似的

使用Werkzeug启动PyWPS

PyWPS有一个命令行界面,可以使用Werkzeug启动PyWPS实例,以便于开发。你需要一个配置文件 `pywps.cfg 指向可用进程:

[server]
processes = myapp.processes.processes

使用以下命令启动pywps::

$ export PYTHONPATH=/path/to/myapp # add myapp to Python modules
$ pywps -c pywps.cfg start

您还可以将pywps服务和作业队列作为单独的进程启动:

$ pywps -c pywps.cfg start --no-jobqueue
$ pywps -c pywps.cfg jobqueue

创建pywps WSGI 实例

示例wsgi脚本与pywps flask服务一起分发,如 安装 部分。这个脚本实际上很简单——事实上,它只是PYWPS服务器的一个包装器,包含作为参数传递的进程和配置文件列表。下面是pywps wsgi脚本的示例:

$ $EDITOR /path/to/pywps/pywps.wsgi
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env python3

from pywps.app.Service import Service

# processes need to be installed in PYTHON_PATH
from processes.sleep import Sleep
from processes.ultimate_question import UltimateQuestion
from processes.centroids import Centroids
from processes.sayhello import SayHello
from processes.feature_count import FeatureCount
from processes.buffer import Buffer
from processes.area import Area

processes = [
    FeatureCount(),
    SayHello(),
    Centroids(),
    UltimateQuestion(),
    Sleep(),
    Buffer(),
    Area()
]

# Service accepts two parameters:
# 1 - list of process instances
# 2 - list of configuration files
application = Service(
    processes,
    ['/path/to/pywps/pywps.cfg']
)

注解

wsgi脚本假设已经有一些进程可以直接包含在手边。它还假设配置文件已经存在,但现在还不是这样。

配置将在下一章中介绍 (配置 )以及流程创建和部署 (过程

在Apache2 HttpD服务器上部署

首先,必须安装并启用wsgi模块:

$ sudo apt-get install libapache2-mod-wsgi
$ sudo a2enmod wsgi

然后可以编辑站点配置文件 (/etc/apache2/sites-enabled/yoursite.conf )并添加以下内容:

# PyWPS
WSGIDaemonProcess pywps home=/path/to/pywps user=www-data group=www-data processes=2 threads=5
WSGIScriptAlias /pywps /path/to/pywps/pywps.wsgi process-group=pywps

<Directory /path/to/pywps/>
    WSGIScriptReloading On
    WSGIProcessGroup pywps
    WSGIApplicationGroup %{GLOBAL}
    Require all granted
</Directory>

注解

WSGIScriptAlias 指向 pywps.wsgi 之前创建的脚本-它将在url http://localhost/pywps下可用

注解

请确保 logsworkdiroutputpath 目录对apache用户是可写的。这个 outputpath 还需要从中提到的url访问目录 outputurl 配置。

当然,重新启动服务器:

$ sudo service apache2 restart

nginx gunicorn上的部署

注解

我们将使用greenunicorn部署pywps,因为配置服务器非常简单。

有关wsgi服务器之间的差异,请参阅: WSGI comparison .

Uwsgu比Gunicorn更受欢迎,最好的文档可以在 Readthedocs .

我们需要nginx和gunicorn服务器:

$ apt install nginx-full
$ apt install gunicorn3

假设pywps已安装在您的系统中(如果没有,请参阅:ref:installation),我们将使用pywps flask作为安装示例。

首先,将pywps flask示例克隆到根(运行示例需要是sudoer或root)::

$ cd /
$ git clone https://github.com/geopython/pywps-flask.git

其次,为gunicorn准备wsgi脚本。有必要通过gunicorn将位于pywps flask服务中的wsgi脚本标识为python模块,这可以通过创建指向wsgi文件的.py扩展名的链接来完成:

$ cd /pywps-flask/wsgi
$ ln -s ./pywps.wsgi ./pywps_app.py

可以通过在命令选项上设置python path来测试gunicorn::

$ gunicorn3 -b 127.0.0.1:8081  --workers $((2*`nproc --all`)) --log-syslog  --pythonpath /pywps-flask wsgi.pywps_app:application

该命令将在本地主机IP和端口8081上启动一个gunicorn实例,使用pywps process folder/pywps flask/processs登录到syslog(/var/log/syslog),并加载wsgi.pywps_app模块和wsgi的对象/函数应用程序。

注解

Gunicorn使用一个prefork模型,其中主进程分叉将接受传入连接的进程(workers)。--workers标志设置进程数,默认值为1,但建议值为CPU核心数的2或4倍。

下一步是配置nginx,方法是通过更改默认站点文件的位置路径来指向wsgi服务器,但编辑启用的文件/etc/nginx/sites,如下所示:

server {
     listen 80 default_server;
     listen [::]:80 default_server;
     server_name _;

     #better to redirect / to wps application
     location / {
     return 301 /wps;
     }

     location /wps {
             # with try_files active there will be problems
             #try_files $uri $uri/ =404;

             proxy_set_header Host $host;
             proxy_redirect          off;
             proxy_set_header        X-NginX-Proxy true;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_pass http://127.0.0.1:8081;
             }

}

很可能已经在文件/etc/nginx/proxy.conf上设置了部分代理配置。

$ service nginx restart

该服务现在将在服务器或本地主机的IP上可用:

http://localhost/wps?request=GetCapabilities&service=wps

当前的Gunicorn实例已由用户启动。在生产服务器中,必须将Gunicorn设置为服务

在ubuntu 16.04上,systemcltd系统需要一个启动gunicorn3服务的服务文件。服务文件(/lib/systemd/system/gunicorn.service)必须配置如下:

[Unit]
Description=gunicorn3 daemon
After=network.target

[Service]
User=www-data
Group=www-data
PIDFile=/var/run/gunicorn3.pid
Environment=WORKERS=3
ExecStart=/usr/bin/gunicorn3 -b 127.0.0.1:8081   --preload --workers $WORKERS --log-syslog --pythonpath /pywps-flask wsgi.pywps_app:application
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

然后启用该服务,然后重新加载systemctl守护进程:

$ systemctl enable gunicorn3.service
$ systemctl daemon-reload
$ systemctl restart gunicorn3.service

检查一切正常:

$ systemctl status gunicorn3.service

注解

TOdo ngix+Uwsgi公司

正在启动作业队列

必须从命令行启动作业队列:

pywps jobqueue --config /path/to/configuration/pywps.cfg

测试pywps实例的部署

注解

在本文档中,假设您已经使用 localhost 服务器域名。

如前所述,pywps应该在http://localhost/pywps上可用,我们现在可以访问url(或使用 wget ):

# the --content-error parameter makes sure, error response is displayed
$ wget --content-error -O - "http://localhost/pywps"

结果应该是XML编码的错误消息。

<?xml version="1.0" encoding="UTF-8"?>
<ows:ExceptionReport xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd" version="1.0.0">
    <ows:Exception exceptionCode="MissingParameterValue" locator="service">
        <ows:ExceptionText>service</ows:ExceptionText>
    </ows:Exception>
</ows:ExceptionReport>

服务器以 pywps.exceptions.MissingParameterValue 异常,告诉我们参数 service 未设置。这符合ogc wps标准,因为每个请求mast至少有 servicerequest 参数.我们现在可以说,这个pywps实例已经正确地部署在服务器上,因为它返回了正确的异常报告。

我们现在必须通过编辑 pywps.cfg 归档并添加一些进程。