Я пытаюсь бежать два wsgi, один django и другой tilestache, использующие один и тот же сервер.
Сервер tilestache обращается к базе данных через django для запроса базы данных. В процессе обслуживания тайлов он выполняет преобразование входящих bbox
, и в этом процессе возникает следующая ошибка. Преобразование работает без ошибок для конкретного многоугольника bbox при запуске вручную из оболочки python:
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 настроен
Apache 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, как упомянул Грэм и описал здесь:
http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Sub_Interpreter_Being_Used
Вроде показывает ожидаемый результат:
[Вт, 14 августа, 10:32:01 2012] [уведомление] Apache / 2.2.22 (Ubuntu) mod_wsgi / 3.3 Python / 2.7.3 настроен - возобновление нормальной работы
[Вт, 14 августа, 10:32:01 2012] [info] mod_wsgi (pid = 29891): Присоединить интерпретатор ».
На данный момент я решил проблему, изменив srs используется в базе данных, поэтому преобразование не требуется в кафель приложение. Я не понимаю, почему transform()
метод, когда вызывается в джанго приложение работает, но тогда в кафель приложение не работает.
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, а не внутри.
Ваша конфигурация уже является однопоточной, это то, что делает «thread = 1» для процессов демона. Вместо этого попробуйте принудительно использовать основной интерпретатор, добавив:
WSGIApplicationGroup %{GLOBAL}
Некоторые пакеты Python некорректно работают во вспомогательных интерпретаторах.
Также имейте в виду, что с точки зрения безопасности не рекомендуется устанавливать DocumentRoot в качестве родительского каталога, в котором находится ваш исходный код. Оставьте DocumentRoot и оставьте его по умолчанию как глобальный корень документа или установите его так, чтобы он указывал на пустой каталог. Таким образом, если в какой-то момент вы что-то перепутаете, вы не рискуете загрузить исходный код.