Запуск двух приложений wsgi на одном сервере исключение gdal org с apache2/modwsgi
Я пытаюсь запустить два 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 настроен
апаш 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>
Джанго версия: 1.4
httpd.conf:
Listen 8080
NameVirtualHost *:8080
ОБНОВИТЬ
Я добавил test.wsgi
скрипт для определения правильности настройки интерпретатора GLOBAL, как было сказано Грэмом и описано здесь:
http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation
Кажется, чтобы показать ожидаемый результат:
[Вторник, 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, используемые в БД, так что преобразование не требуется в приложении tilestache. Я не понимаю, почему transform()
метод, когда вызывается в приложении django, работает, но затем в приложении tilestache происходит сбой.
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 и оставьте его по умолчанию для глобального корня документа или установите для него указатель на пустой каталог. Таким образом, если вы что-то запутаете, вы не рискуете загрузить исходный код.