部署到生产服务器¶
PyWPS由两个主要部分组成: * PyWPS pywps.app.Service
the main process to accept client requests, * :py:module::pywps.queue 负责以异步模式调用存储的请求。
服务模块¶
这个 pywps.app.Service
班级负责 同步的 请求执行:GetCapabilites、DescribeProcess和Execute同步进行。模式,在这种情况下,服务类将
接受请求
执行请求有两种处理方式:
如果,请求将在 同步的 模式,它将直接执行-同步请求立即执行。
在这种情况下,请求将作为 异步的 模式下,请求将存储在数据库中。
这意味着:异步请求不是由服务类执行的,而是存储在数据库中。
队列模块¶
这个 :py:module::pywps.queue 有一个 JobQueueService 单独启动-它将启动一个进程,该进程将定期检查数据库存储的请求,如果存在某个进程,它将被删除并执行。
服务只启动 parallelprocesses 工艺编号。
服务不接受来自客户端的请求,它只是监视数据库并启动进程作业。
安装¶
正如 安装 第节,在使用基于烧瓶的服务器时,没有针对pywps的特定部署过程。但是这个公式不打算在生产环境中使用。对于生产, sudo service apache2 restartApache httpd 或 nginx 更建议使用服务器。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编写),它:
加载配置文件
服务流程
注意最大并发进程数和类似的
使用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#!/usr/bin/env python3
2
3from pywps.app.Service import Service
4
5# processes need to be installed in PYTHON_PATH
6from processes.sleep import Sleep
7from processes.ultimate_question import UltimateQuestion
8from processes.centroids import Centroids
9from processes.sayhello import SayHello
10from processes.feature_count import FeatureCount
11from processes.buffer import Buffer
12from processes.area import Area
13
14processes = [
15 FeatureCount(),
16 SayHello(),
17 Centroids(),
18 UltimateQuestion(),
19 Sleep(),
20 Buffer(),
21 Area()
22]
23
24# Service accepts two parameters:
25# 1 - list of process instances
26# 2 - list of configuration files
27application = Service(
28 processes,
29 ['/path/to/pywps/pywps.cfg']
30)
在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下可用
备注
请确保 logs , workdir 和 outputpath 目录对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至少有 service 和 request 参数.我们现在可以说,这个pywps实例已经正确地部署在服务器上,因为它返回了正确的异常报告。
我们现在必须通过编辑 pywps.cfg 归档并添加一些进程。