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.