Running two wsgi applications on the same server gdal org exception with apache2/modwsgi

Posted by monkut on Server Fault See other posts from Server Fault or by monkut
Published on 2012-08-01T08:12:50Z Indexed on 2012/10/05 3:40 UTC
Read the original article Hit count: 678

Filed under:
|
|

I'm trying to run two wsgi applications, one django and the other tilestache using the same server.

The tilestache server accesses the db via django to query the db. In the process of serving tiles it performs a transform on the incoming bbox, and in this process hit's the following error. The transform works without error for the specific bbox polygon when run manually from the python shell:

 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

I think I've hit the non thread safe issue with GDAL, metioned on the django site. Is there a way I could configure this so that it would work?

Apache Version:

Apache/2.2.22 (Ubuntu) mod_wsgi/3.3 Python/2.7.3 configured

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 Version: 1.4

httpd.conf:

Listen 8080
NameVirtualHost *:8080

UPDATE

I've added the a test.wsgi script to determine if the GLOBAL interpreter setting is correct, as mentioned by graham and described here:

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

It seems to show the expected result:

[Tue Aug 14 10:32:01 2012] [notice] Apache/2.2.22 (Ubuntu) mod_wsgi/3.3 Python/2.7.3 configured -- resuming normal operations

[Tue Aug 14 10:32:01 2012] [info] mod_wsgi (pid=29891): Attach interpreter ''.

I've worked around the issue for now by changing the srs used in the db so that the transform is unnecessary in tilestache app. I don't understand why the transform() method, when called in the django app works, but then in the tilestache app fails.

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)

UPDATE 2

So it turned out I did need to use a projection other than the google (900913) one in the db. So my previous workaround failed.

While I'd like to fix this issue, I decided to work around the issue this type by making a django view that performs the transform needed. So now tilestache requests the data through the django app and not internally.

© Server Fault or respective owner

Related posts about ubuntu

Related posts about django