uWSGI / Flask:“找不到python应用程序,检查启动日志中的错误”

时间:2018-05-12 11:20:20

标签: nginx flask uwsgi

我有一个运行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 ---

它可以处于这种状态多年,但如果我做一些看似无关的事情,比如对烧瓶应用进行任意改变,那么一切都将重新开始。然后,它将继续工作,直到它再次开始发出“内部服务器错误”,而不会进行任何代码更改。

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

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

  • 我如何诊断?

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

  • 可能导致这种情况的原因是什么?

我已经在这一个星期待了一个多星期,并阅读了几乎所有与SO有关的问题。 如果我不知道发生了什么,我已经没有想法,而且几乎放弃了这个项目。 任何帮助将不胜感激。

以下是我的文件:

uWSGI config(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
}

systemd文件:

[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

4 个答案:

答案 0 :(得分:0)

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

更改:

protected $middleware = [
 \App\Http\Middleware\ModifyViewFolder::class,    
];

收件人:

module = wsgi:app

答案 1 :(得分:0)

@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的应用程序,而我真的很难使它正常工作以将其命名为其他任何应用程序。

答案 2 :(得分:0)

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

[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 应用程序。 希望这对某人有帮助

答案 3 :(得分:0)

这个问题也会发生,因为要使用的 uWSGI python 插件没有在 .init 文件中声明。假设您安装了 python3.6 uWSGI python 插件,在 .ini 文件中添加以下内容 plugins = python36 现在,您将看到其他问题或 uWSGI 将能够加载应用程序 0。此外,请确保您处于激活的虚拟环境中以测试该应用程序是否由 uWSGI 提供服务。