在同一台服务器上运行两个 wsgi 应用程序,apache2/modwsgi 出现 gdal org 异常

在同一台服务器上运行两个 wsgi 应用程序,apache2/modwsgi 出现 gdal org 异常

我正在努力奔跑wsgi 应用程序,一个 django 和另一个 tilestache 使用同一个服务器。

tilestache 服务器通过 django 访问数据库以查询数据库。在提供图块的过程中,它对传入的执行转换bbox,在此过程中出现以下错误。从 python shell 手动运行时,转换对特定 bbox 多边形有效,不会出现错误:

 Traceback (most recent call last):
    File "/usr/lib/python2.7/dist-packages/TileStache/__init__.py", line 325, in __call__
     mimetype, content = requestHandler(self.config, environ['PATH_INFO'], environ['QUERY_STRING'])
   File "/usr/lib/python2.7/dist-packages/TileStache/__init__.py", line 231, in requestHandler
     mimetype, content = getTile(layer, coord, extension)
   File "/usr/lib/python2.7/dist-packages/TileStache/__init__.py", line 84, in getTile
     tile = layer.render(coord, format)
   File "/usr/lib/python2.7/dist-packages/TileStache/Core.py", line 295, in render
     tile = provider.renderArea(width, height, srs, xmin, ymin, xmax, ymax, coord.zoom)
   File "/var/www/tileserver/providers.py", line 59, in renderArea
     bbox.transform(METERS_SRID)
   File "/usr/local/lib/python2.7/dist-packages/django/contrib/gis/geos/geometry.py", line 520, in transform
     g = gdal.OGRGeometry(self.wkb, srid)
   File "/usr/local/lib/python2.7/dist-packages/django/contrib/gis/gdal/geometries.py", line 131, in __init__
     self.__class__ = GEO_CLASSES[self.geom_type.num]
   File "/usr/local/lib/python2.7/dist-packages/django/contrib/gis/gdal/geometries.py", line 245, in geom_type
     return OGRGeomType(capi.get_geom_type(self.ptr))
   File "/usr/local/lib/python2.7/dist-packages/django/contrib/gis/gdal/geomtype.py", line 43, in __init__
     raise OGRException('Invalid OGR Integer Type: %d' % type_input)
 OGRException: Invalid OGR Integer Type: 1987180391

我觉得我已经达到了非线程安全GDAL 问题,在 django 网站上提到. 有没有什么方法可以配置它以使其工作?

Apache 版本:

Apache/2.2.22 (Ubuntu) mod_wsgi/3.3 Python/2.7.3 已配置

阿帕奇apache2/sites-available/default

<VirtualHost *:80>
        ServerAdmin ironman@localhost
        DocumentRoot /var/www/bin
        LogLevel warn
        WSGIDaemonProcess lbs processes=2 maximum-requests=500 threads=1
        WSGIProcessGroup lbs
        WSGIScriptAlias / /var/www/bin/apache/django.wsgi
        Alias /static /var/www/lbs/static/
</VirtualHost>
<VirtualHost *:8080>
        ServerAdmin ironman@localhost
        DocumentRoot /var/www/bin
        LogLevel warn
        WSGIDaemonProcess tilestache processes=1 maximum-requests=500 threads=1
        WSGIProcessGroup tilestache
        WSGIScriptAlias / /var/www/bin/tileserver/tilestache.wsgi
</VirtualHost>

Django 版本:1.4

httpd.conf:

Listen 8080
NameVirtualHost *:8080

更新

我添加了一个test.wsgi脚本来确定 GLOBAL 解释器设置是否正确,如 Graham 所述并在此处描述:

http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Sub_Interpreter_Being_Used

它似乎显示了预期的结果:

[2012 年 8 月 14 日星期二 10:32:01] [通知] Apache/2.2.22 (Ubuntu) mod_wsgi/3.3 Python/2.7.3 已配置 - 恢复正常操作

[2012 年 8 月 14 日星期二 10:32:01] [信息] mod_wsgi (pid=29891): 附加解释器“”。

我已经暂时解决了这个问题,方法是改变安全标准在数据库中使用,因此不需要进行转换蒂尔斯塔什应用程序。我不明白为什么该transform()方法在调用时django应用程序可以运行,但随后蒂尔斯塔什应用程序失败。

tilestache.wsgi

#!/usr/bin/python
import os
import time
import sys
import TileStache

current_dir = os.path.abspath(os.path.dirname(__file__))
project_dir = os.path.realpath(os.path.join(current_dir, "..", ".."))
sys.path.append(project_dir)
sys.path.append(current_dir)

os.environ['DJANGO_SETTINGS_MODULE'] = 'bin.settings'
sys.stdout = sys.stderr

# wait for the apache django lbs server to start up, 
# --> in order to retrieve the tilestache cfg
time.sleep(2)

tilestache_config_url = "http://127.0.0.1/tilestache/config/"
application = TileStache.WSGITileServer(tilestache_config_url)

更新2

所以事实证明我确实需要在数据库中使用除 google (900913) 之外的投影。所以我之前的解决方法失败了。

虽然我想修复此问题,但我决定通过创建执行所需转换的 Django 视图来解决此类问题。因此,现在 tilestache 通过 Django 应用程序而不是内部请求数据。

答案1

您的配置已经是单线程的,这就是守护进程的“threads=1”的作用。尝试通过添加以下内容强制使用主解释器:

WSGIApplicationGroup %{GLOBAL}

一些 Python 包在子解释器中无法正常工作。

还要注意,将 DocumentRoot 设置为源代码所在位置的父目录是一种不安全的做法。保留 DocumentRoot 并将其默认为全局文档根目录,或将其设置为指向一个空目录。这样,如果您在某个时候搞砸了,您的源代码就不会有被下载的风险。

相关内容