在我的uwsgi配置中,我有以下选项:
[uwsgi]
chmod-socket = 777
socket = 127.0.0.1:9031
plugins = python
pythonpath = /adminserver/
callable = app
master = True
processes = 4
reload-mercy = 8
cpu-affinity = 1
max-requests = 2000
limit-as = 512
reload-on-as = 256
reload-on-rss = 192
no-orphans
vacuum
我的应用结构如下所示:
/adminserver
app.py
...
我的app.py
有这些代码:
app = Flask(__name__)
...
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5003, debug=True)
结果是,当我尝试卷曲服务器时,我收到此错误:
Wed Sep 11 23:28:56 2013 - added /adminserver/ to pythonpath.
Wed Sep 11 23:28:56 2013 - *** no app loaded. going in full dynamic mode ***
Wed Sep 11 23:28:56 2013 - *** uWSGI is running in multiple interpreter mode ***
module
和callable
选项有何作用?文档说:
模块,wsgi 参数:string
加载WSGI模块作为应用程序。模块(sans .py)必须是 可进口的,即。在PYTHONPATH。
可以从命令行使用-w设置此选项。
callable 参数:字符串默认值:application
设置默认的WSGI可调用名称。
答案 0 :(得分:9)
Python中的模块映射到磁盘上的文件 - 当你有这样的目录时:
/some-dir
module1.py
module2.py
如果在当前工作目录为/some-dir
时启动python解释器,则可以导入每个模块:
some-dir$ python
>>> import module1, module2
# Module1 and Module2 are now imported
Python搜索sys.path
(以及其他一些内容see the docs on import
for more information),查找与您要导入的名称相匹配的文件。 uwsgi使用Python的导入过程来加载包含WSGI应用程序的模块。
WSGI PEP(333和3333)指定WSGI应用程序is a callable that takes two arguments and returns an iterable that yields bytestrings:
# simple_wsgi.py
# The simplest WSGI application
HELLO_WORLD = b"Hello world!\n"
def simple_app(environ, start_response):
"""Simplest possible application object"""
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [HELLO_WORLD]
uwsgi需要知道模块内部符号的名称,该符号映射到可调用的WSGI应用程序,因此它可以传入环境并且start_response
可调用 - 实际上,它需要能够执行以下内容:
wsgi_app = getattr(simple_wsgi, 'simple_app')
uwsgi正在做的简单平行:
# Use `module` to know *what* to import
import simple_wsgi
# construct request environment from user input
# create a callable to pass for start_response
# and then ...
# use `callable` to know what to call
wsgi_app = getattr(simple_wsgi, 'simple_app')
# and then call it to respond to the user
response = wsgi_app(environ, start_response)
答案 1 :(得分:6)
对于遇到此问题的其他人,如果您确定配置正确,则应检查您的uWSGI版本。
Ubuntu 12.04 LTS提供1.0.3。删除它并使用pip安装2.0.4解决了我的问题。
答案 2 :(得分:0)
首先,检查您的配置是否正确。
我的uwsgi.ini
配置:
[uwsgi]
chdir=/home/air/repo/Qiy
uid=nobody
gid=nobody
module=Qiy.wsgi:application
socket=/home/air/repo/Qiy/uwsgi.sock
master=true
workers=5
pidfile=/home/air/repo/Qiy/uwsgi.pid
vacuum=true
thunder-lock=true
enable-threads=true
harakiri=30
post-buffering=4096
daemonize=/home/air/repo/Qiy/uwsgi.log
然后使用uwsgi --ini uwsgi.ini
运行uwsgi。
如果不起作用,则rm -rf
venv
目录,并重新初始化venv,然后重新尝试我的步骤。
我重新初始化venv
解决了我的问题,似乎问题是当我pip3 install
某些requirements.txt
个软件包,然后升级pip,然后安装uwsgi
软件包。所以,我删除venv
,并重新初始化我的虚拟环境。