我有一个运行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
答案 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 提供服务。