uWSGI / Flask:“找不到 python 应用程序,请检查启动日志是否有错误”

问题描述 投票:0回答:7

我有一个使用 NGINX + uWSGI + Flask 运行的网站。

该网站大部分时间都运行良好,但是时不时地会进入 nginx 返回的页面仅显示“内部服务器错误”的状态。如果我在执行此操作时查看 uWSGI 日志,我会看到以下内容:

[pid: 1580|app: -1|req: -1/37] 69.162.124.228 () {46 vars in 716 bytes} [Sat May 12 10:25:13 2018] GET / => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0)
--- no python application found, check your startup logs for errors ---

它可能会处于这种状态很长时间,但如果我做了一些看似无关的事情,比如对 Flask 应用程序进行任意更改,那么一切都会重新开始工作。然后它将继续工作,直到一段随机的时间后再次开始给出“内部服务器错误”,而不进行任何代码更改。

我尝试直接运行uWSGI应用程序,它运行没有任何错误。

我尝试在我的 Flask 应用程序上安装 Sentry 来捕获任何错误,但发生这种情况时什么也没有显示。

  • 我该如何诊断?

  • 我还可以查看哪些其他日志文件?

  • 可能是什么原因造成的?

我已经这样做了一个多星期了,并且阅读了几乎所有相关的问题。 我已经没有想法了,如果我无法弄清楚发生了什么,我几乎要放弃这个项目。 任何帮助将不胜感激。

这是我的文件:

uWSGI 配置(mysite.ini)

[uwsgi]
module = wsgi:app

master = true
processes = 5

socket = mysite.sock
chmod-socket = 660
vacuum = true

die-on-term = true

logto = /var/log/uwsgi/%n.log

wsgi.py

from tunnelling.python.flask_app import app as application

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

nginx:

server {
    listen 80;
    server_name www.mysite.com;
    server_name mysite.com;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/home/dimraft/mysite/mysite.sock;
    }

   listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/mysite.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}

系统文件:

[Unit]
Description=uWSGI instance to serve mysite
After=network.target

[Service]
User=dimraft
Group=www-data
WorkingDirectory=/home/dimraft/mysite
Environment="PATH=/home/dimraft/mysite/mysiteenv/bin"
ExecStart=/home/dimraft/mysite/mysiteenv/bin/uwsgi --ini mysite.ini

[Install]
WantedBy=multi-user.target
nginx flask uwsgi
7个回答
14
投票

也许你的uWSGI配置(mysite.ini)错误:

改变:

module = wsgi:app

至:

module = projectName.wsgi:application

4
投票

@John 在这一点上基本上是正确的,但是,为了清楚起见,我想详细说明。

我在一个具有基本相同设置的项目中遇到了同样的问题,解决这个问题的方法是将我的 uwsgi.py 模块移动到我的 Flask 应用程序包中,如下所示

myprojectname/
    __init__.py
    uwsgi.py

然后将 uwsgi.ini 中的模块定义更改为 module=myprojectname.uwsgi:application ,如下所示:

[uwsgi]
 module=myprojectname.uwsgi:application
 master=true
 processes=2

 socket=myprojectname.sock
 chmod-socket=660
 logto=/var/log/uwsgi/uwsgi.log
 die-on-term=true

还要确保指定可调用对象被命名为 application,就像原始发布的代码示例中的情况一样。 uWSGI默认寻找这个名为object的应用程序,我真的很难让它工作,命名它为其他任何东西,比如app。


3
投票

好吧抱歉来晚了。我也遇到了这样的错误,这就是我解决我的问题的方法

[uwsgi]
chdir = /home/goodnews/myproject
home = /home/goodnews/myproject/venv
module = wsgi:app
master = true
processes = 5

#socket = myproject.sock
socket = :5000
protocol = http
chmod-socket = 666
vaccum = true
die-on-term = true

在我的例子中,我正在本地虚拟机上工作(运行 Ubuntu 终端),这就是原因

socket = :5000

我正在使用 ssh 连接到 Ubuntu 服务器来测试 Web 应用程序。 希望这对某人有帮助


1
投票

也会发生此问题,因为要使用的 uWSGI python 插件未在 .init 文件中声明。假设您安装了 python3.6 uWSGI python 插件,请在 .ini 文件中添加以下内容

plugins = python36
现在,您将看到其他问题,或者uWSGI将能够加载应用程序0。另外,请确保您处于激活的虚拟环境中,以测试该应用程序是否由uWSGI提供服务。


0
投票

我在 python 脚本中只做了一个小的更改后就得到了这个错误。 我的案例的原因是: 当我将新脚本复制到服务器时,执行权限丢失了。


0
投票

我的问题是网站根目录中的某些文件引用了外部库。您需要确保一切都是自包含的。


0
投票

使用重复的变量名调用 render_template 也可能导致此错误。例如

render_template('my_page.html', var = foo, var = bar)

如果你有一长串变量被传递给 render_template,这可能会很难发现。

© www.soinside.com 2019 - 2024. All rights reserved.