lighttpd + webpy + fastCGI + python3 Как это работает?

История: я написал приложение python3 с фреймворком web.py (некоторый парсер). Нравится, но не справляется с нагрузкой (какое-то ограничение на 10 воркеров). Я нашел решение из документации web.py — Webpy + LightTTPD с FastCGi.

Когда я пытаюсь использовать его и запускаю lighttpd с приложением python3, у меня возникает ошибка:

     File "code.py", line 18, in <module>
if __name__ == '__main__':application.run()
File "/usr/local/lib/python3.6/site-packages/web/application.py", line 341, in run
return wsgi.runwsgi(self.wsgifunc(*middleware))
File "/usr/local/lib/python3.6/site-packages/web/wsgi.py", line 34, in runwsgi
or 'SERVER_SOFTWARE') in os.environ:
File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_collections_abc.py", line 666, in __contains__
self[key]
File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/os.py", line 666, in __getitem__
value = self._data[self.encodekey(key)]
File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/os.py", line 744, in encode
raise TypeError("str expected, not %s" % type(value).__name__)
TypeError: str expected, not bool

Затем я попытался запустить приложение python2, это lighttpd.conf:

server.modules              = (
        "mod_access",
        "mod_alias",
        "mod_accesslog",
        "mod_compress"
        )

server.port = 8081
server.document-root = "/python/metrics_interlayer/"
server.errorlog = "/python/metrics_interlayer/light_error.log"
accesslog.filename          =    "/python/metrics_interlayer/light_access.log"

server.modules += ("mod_fastcgi", "mod_rewrite")

fastcgi.server = ( "/code.py" =>
(
"python-fcgi" =>
(
  "socket" => "/tmp/fastcgi.python.socket",
  "bin-path" => "/python/metrics_interlayer/code.py",
  "max-procs" => 1
))
)

url.rewrite-once = (
 "^/(.*)$" => "/code.py/$1"
)

И мое «приложение» (на самом деле оно работает хорошо, если я запускаю его так: python code.py):

    #!/usr/bin/env python

    import web

    urls = ('/(.*)', 'Index')

    application = web.application(urls, globals())
    web.config.debug = True

    class Index:

        def GET(self, name=''):
            return 'Hello World'

        def POST(self, name=''):
            return 'Hello World'

    if __name__ == '__main__':application.run()

Когда я пытаюсь открыть любую ссылку, я ничего не получаю - просто загружаю страницу, а затем получаю ошибку 500. Журналы ошибок ничего не показывают.

Должен ли я запускать fastCGI раньше или lighttpd должен сделать это сам? Я думаю, что этот раздел (fastcgi.server) не работает (флуп уже установлен)


person Alexander Rainchik    schedule 30.05.2018    source источник


Ответы (1)


Вот строки 33 и 34 из файла web/wsgi.py, который я только что скачал с http://webpy.org/. :

if (os.environ.has_key('PHP_FCGI_CHILDREN') #lighttpd fastcgi
  or os.environ.has_key('SERVER_SOFTWARE')):

Это отличается от того, что показывает вам ваш TypeError сверху. Может быть, это была просто ошибка в старой версии webpy, которая теперь исправлена? Попробуйте обновить его.

person Jeronimo    schedule 30.05.2018
comment
Да, идеально. Я устанавливал из pip - и там без последних фиксов. Теперь это работает. - person Alexander Rainchik; 31.05.2018