我正在努力奔跑二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 并将其默认为全局文档根目录,或将其设置为指向一个空目录。这样,如果您在某个时候搞砸了,您的源代码就不会有被下载的风险。