Запуск двух приложений 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 и оставьте его по умолчанию для глобального корня документа или установите для него указатель на пустой каталог. Таким образом, если вы что-то запутаете, вы не рискуете загрузить исходный код.

Другие вопросы по тегам