如何诊断Python Flask应用程序中仅在应用程序使用uWSGI运行时出现的问题?

如何诊断Python Flask应用程序中仅在应用程序使用uWSGI运行时出现的问题?,python,python-3.x,nginx,uwsgi,wsgi,Python,Python 3.x,Nginx,Uwsgi,Wsgi,我已经编写了一个web应用程序,使用运行在uWSGI服务器上的Python应用程序控制LED条带。前端和后端组件似乎工作正常,但在我使用uWSGI运行程序时,而不是在使用Flask dev Web服务器时,程序会出现问题,我不确定如何对其进行诊断。wsgi似乎有问题的代码的两部分是python日志模块(因此我很难诊断问题)和LED本身的操作。我已经在下面列出了我的配置文件,并且很乐意提供可能有用的任何其他信息 虽然开发过程中涉及的所有文件都已包含在中,但代码并不处于可以轻松安装到另一个系统上的状

我已经编写了一个web应用程序,使用运行在uWSGI服务器上的Python应用程序控制LED条带。前端和后端组件似乎工作正常,但在我使用uWSGI运行程序时,而不是在使用Flask dev Web服务器时,程序会出现问题,我不确定如何对其进行诊断。wsgi似乎有问题的代码的两部分是python日志模块(因此我很难诊断问题)和LED本身的操作。我已经在下面列出了我的配置文件,并且很乐意提供可能有用的任何其他信息

虽然开发过程中涉及的所有文件都已包含在中,但代码并不处于可以轻松安装到另一个系统上的状态。这包括Python后端代码、HTML+CSS和其余的配置文件。预期的平台是在Raspberry Pi模型3A+上运行的Raspbian Linux

/etc/lights/lights.ini(uWSGI)

/etc/nginx/sites enabled/lights(nginx)

日志问题似乎就在这里。只有当程序作为主Python脚本执行时,才设置日志记录,但不用于Python导入。UWSGI使用Python C API调用此函数,因此永远不会执行
main
方法

这也解释了为什么它与Flask开发服务器一起工作,因为您作为Python脚本执行,而不是导入模块


要解决此问题,您只需将日志记录设置移到主模块级别,您应该很好。

您是否在uWsgi服务器上看到错误代码?如果不调试实时服务器应用程序。基本上,它可以让你像处理flask应用程序一样处理服务器,并在“生产”中进行调试,但你需要确保在完成调试后将其删除。我在uWSGI服务器上没有看到任何错误代码,日志中也没有弹出任何内容,但我将尝试使用该选项,看看是否可以找到任何有用的内容,感谢您提供有关
/var/log/lights/lights.log
的任何信息?您是否尝试过在没有服务的情况下运行uWSGI,例如
systemctl stop lights.service
然后
/usr/bin/uWSGI--ini/etc/lights/lights.ini
?在没有
systemd.service
daemonize
config选项的CLI中运行时,应将uWSGI输出运行到标准输出。关于你的问题,我怀疑权限有问题,但需要更多的信息。@mforsetti我必须重新组装项目以进行检查,因为我现在已经打包好了(我将很快解包并检查),但据我所知,
/var/log/lights/lights.log根本没有输出,而且我似乎不记得从CLI或更高权限运行时有任何问题。这很完美,非常感谢。我已将日志文件中的错误标识为“ws2811_init失败,代码为-13(无法初始化SPI)”。我怀疑这是一个权限问题,因为它看起来与我尝试在没有提升权限的情况下直接使用Python运行脚本时的错误相同。即使以root用户身份运行,uwsgi是否也会在内部放弃特权?如果是,您知道如何配置uwsgi以使用正确的权限运行脚本吗?
即使以root用户身份运行,uwsgi是否会在内部删除权限?
这将取决于配置,但最有可能的情况是,如果您已通过发行版安装uwsgi。最简单的验证方法是运行
ps aux | grep uwsgi
。很可能是www数据。如果使用ps aux,可能还会显示额外的配置路径。您可以使用
uid
gid
设置来覆盖此权限行为。
[uwsgi]
module = lights:app

chdir = /var/lights/
logto = /var/log/lights/lights.log
master = true
processes = 5
enable-threads = true
threads = 10

socket = lights.sock
chmod-socket = 666
vacuum = true

die-on-term = true

plugin = /usr/lib/uwsgi/plugins/python3_plugin.so
server {
    listen 80;
    server_name 192.168.1.79;
    
    access_log /var/log/nginx/lights_access.log;
    error_log /var/log/nginx/lights_error.log;

    root /var/lights/;

    location / {
        include uwsgi_params;
        uwsgi_pass unix:///var/lights/lights.sock;
    }
}
def main():
    logging.basicConfig(level=logging.INFO, format=logFormat)
    application = app
    app.run()

if __name__ == "__main__":
    main()