问题 uwsgi:没有加载app。进入完全动态模式


在我的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

我的app结构如下所示:

/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 参数:字符串

加载WSGI模块作为应用程序。模块(sans .py)必须是   可进口的,即。在PYTHONPATH。

可以从命令行使用-w设置此选项。

可调用 参数:字符串默认值:应用程序

设置默认的WSGI可调用名称。


11194
2017-09-11 23:40


起源

您当前的配置似乎没有 module 要么 wsgi 关键...... - Sean Vieira


答案:


Python中的模块映射到磁盘上的文件 - 当您有这样的目录时:

/some-dir
    module1.py
    module2.py

如果在当前工作目录中启动python解释器 /some-dir 您将能够导入每个模块:

some-dir$ python
>>> import module1, module2
# Module1 and Module2 are now imported

Python搜索 sys.path (以及其他一些事情, 看到文档 import 了解更多信息)对于与您尝试导入的名称匹配的文件。 uwsgi使用Python的导入过程来加载包含WSGI应用程序的模块。

可赎回

WSGI PEP(333 和 3333)指定一个WSGI应用程序 是一个可调用的,它接受两个参数并返回一个产生字节串的迭代

# 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')

TL; PC(太长;首选代码)

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)

8
2017-09-12 04:09



应该的 module 我的定义 uwsgi 配置文件是包含的python文件 simple_app wgs​​i申请?它不起作用,但我不确定如何 uwsgi 找到它在错误中引用的应用, no app loaded。 - Rose Perrone
@RosePerrone - 据我所知,是的 module 应该与要导入的磁盘上的文件名匹配。错误消息不是指应用程序,它指的是 缺乏 一个,它只使用通用名称。 - Sean Vieira


对于遇到此问题的其他人,如果您确定配置正确,则应检查您的uWSGI版本。

Ubuntu 12.04 LTS提供1.0.3。删除它并使用pip安装2.0.4解决了我的问题。


6
2018-05-03 15:11





首先,检查您的配置是否正确。

我的 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,并升级点,然后安装 uwsgi 包。所以,我删除了 venv,并重新初始化我的虚拟环境。


0
2018-05-11 06:48