我有一个 Python 3 bottle.py 应用程序,我将其安装到虚拟环境中(让 pip 自动获取依赖项)。我试图让它在我的 raspberry pi 上的 nginx 和 uwsgi 下运行。
当我运行 nginx 和 uwsgi 时,访问http://localhost/icecrate
结果为“uWSGI 错误 Python 应用程序未找到”。我猜想这意味着 nginx 正确连接到 uwsgi,而 uwsgi 找不到该应用程序。
但是,如果我运行该应用程序,uwsgi --http 0.0.0.0:8080 /etc/uwsgi/apps-enabled/icecrate.ini
则http://localhost:8080
会给我该应用程序,这表明 uwsgi 配置至少是足够的。
我在 Google 和文档中搜索了几个小时以寻找解决方案。我不知道我在这里做错了什么。
/etc/nginx/sites-available/icecrate
server {
listen 80;
server_name raspberrypi;
access_log /home/icecrate/logs/access.log;
error_log /home/icecrate/logs/error.log;
location /icecrate {
uwsgi_pass unix:///tmp/icecrate.sock;
include uwsgi_params;
}
}
/etc/uwsgi/apps-available/icecrate.ini
[uwsgi]
vhost = true
plugins = python3
socket = /tmp/icecrate.sock
master = true
enable-threads = false
processes = 1
# this just imports the app callable and renames it to application
wsgi-file = /home/icecrate/nginx.py
# I get the same results using this method
#module = icecrate.web
#callable = app
virtualenv = /home/icecrate/env
touch-reload = /home/icecrate/reload
答案1
我最终放弃了尝试和所有配置,重新开始,但我想我已经弄清楚了。我相当确定这是一个权限问题。
默认情况下,nginx.conf 指定www-data
为其运行的用户,而之前的尝试没有处理这个问题。所有文件都归我所有。我没有更改默认用户,而是为创建了一个主文件夹www-data
,现在它包含 icecrate 虚拟环境。在设置应用程序时,我曾经sudo -s -u www-data
创建过所有文件,因此所有文件都有适当的所有者和权限。
Nginx 配置基本相同,只是 virtualenv 文件夹现在充当套接字和日志的主目录:
server {
listen 80;
server_name = raspberrypi;
access_log /home/www-data/icecrate/logs/access.log;
error_log /home/www-data/icecrate/logs/error.log;
location /icecrate {
uwsgi_pass unix:///home/www-data/icecrate/icecrate.sock;
include uwsgi_params;
}
}
在重建 uwsgi 应用程序 ini 时,我跳过了一些看起来对问题不重要的内容,但本质上也是一样的:
[uwsgi]
plugins = python3
socket = /home/www-data/icecrate/icecrate.sock
module = icecrate.web:app
virtualenv = /home/www-data/icecrate
touch-reload = /home/www-data/icecrate/reload
# like ngnix, uwsgi should be www-data.
uid = www-data
gid = www-data
# don't think this works, though
logto = /home/www-data/icecrate/logs/uwsgi.log
分别将配置文件放入sites-enabled
和后apps-enabled
,我启动nginx
和uwsgi
并将浏览器指向,http://localhost/icecrate
结果出现了 bottle.py 404 错误。我想我这辈子从来没有看到 404 错误这么高兴过。