我有一个使用 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
也许你的uWSGI配置(mysite.ini)错误:
改变:
module = wsgi:app
至:
module = projectName.wsgi:application
@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。
好吧抱歉来晚了。我也遇到了这样的错误,这就是我解决我的问题的方法
[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 应用程序。 希望这对某人有帮助
也会发生此问题,因为要使用的 uWSGI python 插件未在 .init 文件中声明。假设您安装了 python3.6 uWSGI python 插件,请在 .ini 文件中添加以下内容
plugins = python36
现在,您将看到其他问题,或者uWSGI将能够加载应用程序0。另外,请确保您处于激活的虚拟环境中,以测试该应用程序是否由uWSGI提供服务。
我在 python 脚本中只做了一个小的更改后就得到了这个错误。 我的案例的原因是: 当我将新脚本复制到服务器时,执行权限丢失了。
我的问题是网站根目录中的某些文件引用了外部库。您需要确保一切都是自包含的。
使用重复的变量名调用 render_template 也可能导致此错误。例如
render_template('my_page.html', var = foo, var = bar)
如果你有一长串变量被传递给 render_template,这可能会很难发现。