Gunicorn дает сбой при использовании WSGI

Я хочу, чтобы Gunicorn говорил с TileStache через WSGI. Но когда я запускаю эту команду...

gunicorn "TileStache:WSGITileServer('/var/osm/bright/project/OSMBright4/tilestache.cfg')"

... я получаю эти ошибки:

2013-03-30 23:02:41 [14300] [INFO] Starting gunicorn 0.17.2
2013-03-30 23:02:41 [14300] [INFO] Listening at: http://127.0.0.1:8000 (14300)
2013-03-30 23:02:41 [14300] [INFO] Using worker: sync
2013-03-30 23:02:41 [14305] [INFO] Booting worker with pid: 14305
Error loading Tilestache config:
2013-03-30 23:02:41 [14305] [ERROR] Exception in worker process:
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 485, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 100, in init_process
    self.wsgi = self.app.wsgi()
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 103, in wsgi
    self.callable = self.load()
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 25, in load
    return util.import_app(self.app_uri)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 381, in import_app
    app = eval(obj, mod.__dict__)
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/TileStache/__init__.py", line 373, in __init__
    self.config = parseConfigfile(config)
  File "/usr/local/lib/python2.7/dist-packages/TileStache/__init__.py", line 166, in parseConfigfile
    return Config.buildConfiguration(config_dict, dirpath)
  File "/usr/local/lib/python2.7/dist-packages/TileStache/Config.py", line 217, in buildConfiguration
    config.layers[name] = _parseConfigfileLayer(layer_dict, config, dirpath)
  File "/usr/local/lib/python2.7/dist-packages/TileStache/Config.py", line 441, in _parseConfigfileLayer
    layer.provider = _class(layer, **provider_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/TileStache/Mapnik.py", line 81, in __init__
    engine = mapnik.FontEngine.instance()
NameError: global name 'mapnik' is not defined
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/arbiter.py", line 485, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/workers/base.py", line 100, in init_process
    self.wsgi = self.app.wsgi()
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/base.py", line 103, in wsgi
    self.callable = self.load()
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/app/wsgiapp.py", line 25, in load
    return util.import_app(self.app_uri)
  File "/usr/local/lib/python2.7/dist-packages/gunicorn/util.py", line 381, in import_app
    app = eval(obj, mod.__dict__)
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/TileStache/__init__.py", line 373, in __init__
    self.config = parseConfigfile(config)
  File "/usr/local/lib/python2.7/dist-packages/TileStache/__init__.py", line 166, in parseConfigfile
    return Config.buildConfiguration(config_dict, dirpath)
  File "/usr/local/lib/python2.7/dist-packages/TileStache/Config.py", line 217, in buildConfiguration
    config.layers[name] = _parseConfigfileLayer(layer_dict, config, dirpath)
  File "/usr/local/lib/python2.7/dist-packages/TileStache/Config.py", line 441, in _parseConfigfileLayer
    layer.provider = _class(layer, **provider_kwargs)
  File "/usr/local/lib/python2.7/dist-packages/TileStache/Mapnik.py", line 81, in __init__
    engine = mapnik.FontEngine.instance()
NameError: global name 'mapnik' is not defined
2013-03-30 23:02:41 [14305] [INFO] Worker exiting (pid: 14305)
2013-03-30 23:02:41 [14300] [INFO] Shutting down: Master
2013-03-30 23:02:41 [14300] [INFO] Reason: Worker failed to boot.

Кто-нибудь знает, что это значит?

2 ответа

Решение

Задача решена.

Как упомянул Кармель, выяснилось, что проблема заключается в Mapnik и TileStache, а не в Gunicorn.

После некоторых исследований я обнаружил, что в разных версиях имени модуля Python произошли изменения; это было mapnik до версии 2.0, когда она изменилась на mapnik2, а затем вернуться к mapnik снова в версии 2.1. И, очевидно, оказалось, что я установил версию 2.0.

Я полагаю, я мог бы измениться на import mapnik2 в TileStache/mapnik.py, но я подумал, что в будущем будет удобнее удалить Mapnik и затем собрать его из исходного кода. Это заняло некоторое время, но определенно стоило того.

Большое спасибо Karmel за то, что поставил меня на правильный путь!

У вас установлен python-mapnik? Ошибка, кажется, в конфигурации TileStache и mapnik, а не gunicorn или WSGI. Если вы посмотрите на TileStache/Mapknik.py (я смотрю здесь: https://github.com/migurski/TileStache/blob/master/TileStache/Mapnik.py), вы увидите, что первоначальный импорт mapnik проходит с ошибкой:

try:
    import mapnik
except ImportError:
    # can still build documentation
    pass

но это вызовет проблемы в строке 81, когда ожидается присутствие mapnik. Итак, убедитесь, что вы apt-get установили python-mapnik или иным образом убедитесь, что mapnik находится в вашем пути Python.

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