uWSGI与Flask应用程序一起使用时出现“未找到可调用项或导入错误”的问题。

3
我希望使用 Python 3 和 nginx 在虚拟环境中提供一个基本的 Flask 应用程序。但是,当我尝试浏览网页时,出现以下错误:

内部服务器错误

同时,在 /var/log/uwsgi/app/myproj.log 中也看到了错误信息,这让我相信错误出现在我的 uwsgi 配置文件中。nginx 和 uwsgi 似乎通信良好。

这是我的目录结构:

/srv/http/myproj/
             |----- setup.py
             |----- env/
             |----- myproj/
                       |----- __init__.py
                       |----- myproj.py
/etc/uwsgi/apps-enabled/
                 |----- myproj.ini
/etc/nginx/sites-enabled/
                 |----- myproj

这是我在/var/log/uwsgi/app/myproj.log中看到的错误:

Thu Jun  8 00:00:41 2017 - *** Operational MODE: preforking ***
Thu Jun  8 00:00:41 2017 - unable to load app 0 (mountpoint='') (callable not found or import error)
Thu Jun  8 00:00:41 2017 - *** no app loaded. going in full dynamic mode ***
Thu Jun  8 00:00:41 2017 - *** uWSGI is running in multiple interpreter mode ***
Thu Jun  8 00:00:41 2017 - spawned uWSGI master process (pid: 14498)
Thu Jun  8 00:00:41 2017 - spawned uWSGI worker 1 (pid: 14504, cores: 1)
Thu Jun  8 00:00:41 2017 - spawned uWSGI worker 2 (pid: 14505, cores: 1)
Thu Jun  8 00:00:43 2017 - --- no python application found, check your startup logs for errors ---
[pid: 14505|app: -1|req: -1/1] 172.16.72.2 () {46 vars in 726 bytes} [Thu Jun  8 00:00:43 2017] GET / => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0)

这里是/etc/uwsgi/apps-enabled/myproj.ini文件内容:
[uwsgi]
plugins = python3
venv = /srv/http/myproj/env
chdir = /srv/http/myproj
module = myproj:myproj
callable = app

我也尝试将module设置为myproj(在uwsgi日志中没有变化),以及myproj.myproj(不太成功,因为它找不到模块myproj.myproj)。
这是/srv/http/myproj/myproj/myproj.py
import flask
app = flask.Flask(__name__)

这是 /srv/http/myproj/myproj/__init__.py 的内容:
from myproj.myproj import app

这里是 /etc/nginx/sites-enabled/myproj

upstream myproj {
        server unix:///run/uwsgi/app/myproj/socket fail_timeout=0;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        location / {
                uwsgi_pass myproj;
                include /etc/nginx/uwsgi_params;
        }
}

我想我的问题很简单:我做错了什么?
编辑:如果有影响的话:
# lsb_release -d
Description:    Ubuntu 16.04.2 LTS

@Nurzhan 是的,我可以在没有uwsgi的情况下运行Flask应用程序,并通过浏览器访问。 我不太确定您所说的uwsgi指的是什么,但是当我运行“uwsgi --ini /etc/uwsg/apps-available/myproj.ini --socket /run/uwsgi/app/myproj/socket”时,因为“(13:Permission denied) while connecting to upstream”,我从nginx收到了502 Bad Gateway错误。 - Todd
uwsgi确实会随着我之前评论中的命令启动而不是自动结束。输出中也没有明显的错误(它似乎写入到STDOUT而不是日志)。看起来没有错误,但我不熟悉连接到由uwsgi创建的UNIX套接字并手动请求HTTP资源的过程,而没有Web服务器代表客户端发送HTTP GET的程序。我刚刚尝试了socat - UNIX-CONNECT:/run/uwsgi/app/myproj/socketGET / HTTP/1.0,但出现了“Broken pipe”错误。 - Todd
谢谢,我会看一下的,但我认为问题的原因在于我的目录结构与大多数教程(包括您刚刚链接的教程)不同。在您链接的教程中,包含应用程序定义的主Python文件与虚拟环境目录位于同一目录中。而在我的设置中,它被抽象了一个目录。 - Todd
你尝试过使用module = myproj.myproj吗?在其中加入冒号看起来不太对,因为应该是一个模块路径。 - Graham Dumpleton
是的,但我收到了一个错误,它找不到模块 myproj.myproj。你可能错过了,但我在我的问题中包含了它。 - Todd
显示剩余3条评论
2个回答

3

在查看了一个结构类似的项目后,我找到了解决方案。以下是解决问题的新文件:

[uwsgi]
plugins = python3
venv = /srv/http/myproj/env
chdir = /srv/http/myproj/myproj
pythonpath = ..
module = myproj
callable = app

基本上,我需要让我的chdir深入一级(因此模块少了一级)。
编辑:最后,为了使我的项目中的导入正常工作,我还需要添加上述pythonpath行。

0
请检查uwsgi进程对wsgi.py文件是否具有读取权限。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接