NGINX + Gunicorn + Flask - 502 错误网关 - 套接字文件权限被拒绝
NGINX + Gunicorn + Flask - 502 Bad Gateway - Permission Denied on Socket File
我们正在尝试将 NGINX 设置为我们的 Gunicorn Python 应用程序的反向代理。我们一直在关注来自 Digital Ocean (https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-16-04#create-a-systemd-unit-file) 的指南。 Gunicorn 和 NGINX 都是 运行 在同一个 Ubuntu 16.04 32 位虚拟机上。
我们在网上看到的所有处理此类权限问题的帖子似乎都指向服务文件中的错误 "Group" 设置,或者指向套接字文件的错误权限。但是正如您在下面看到的,我们将组设置为 "www-data"。套接字文件似乎具有必要的权限,并且 www-data 是所有者。
我们目前设置的内容(我已经用 "app" 替换了我们的应用程序名称):
run.py
from flask import current_app
import os
from os import path
from application import app
from instance.config import Config
if __name__ == '__main__':
conf = Config()
app.run(host='0.0.0.0', debug=False, threaded=True)
/etc/systemd/system/app.服务
[Unit]
Description=Application
After=network.target
[Service]
User=<root>
Group=www-data
WorkingDirectory=/home/<root>/app
Environment="PATH=/home/<root>/venv/bin"
ExecStart=/home/<root>/venv/bin/gunicorn --workers 3 --bind unix:app.sock -m 007 run:app
[Install]
WantedBy=multi-user.target
/etc/nginx/sites-available/app
server {
listen 80;
server_name app.com;
location / {
include proxy_params;
proxy_pass http://unix:/home/<root>/app/app.sock;
}
}
/var/log/nginx/error.log
2020/06/05 16:49:22 [crit] 2176#2176: *1 connect() to unix:/home/<root>/app/app.sock failed (13: Permission denied) while connecting to upstream, client: 10.0.2.2, server: app.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/<root>/app/app.sock:/", host: "app.com"
这里是套接字文件的权限:
gsi@ubuntu:~/app$ ls -l app.sock
srwxrwx--- 1 <root> www-data 0 Jun 5 16:10 app.sock
我们是 NGINX 的新手,所以我们不太确定问题是什么或如何解决这个问题。任何人都可以看到我们哪里出错了吗?如果我们可以提供其他信息,请告诉我们。
不要在服务器名称中输入 app.com,而是尝试输入主机的 IP 地址,然后通过 运行:
查看是否可以在机器本身上运行
$curl <IP address of the host machine>
如果还是不行,我已经写了一个article,试着用它来实现它,如果可行的话告诉我!
希望对您有所帮助! :)
我们可以通过授予 www-data 组访问完整应用程序文件夹的权限来解决此问题:sudo chgrp www-data ~/app
。它已经可以访问特定的套接字文件,但不能访问应用程序文件夹。
我认为没有必要,因为我们将 root 用户指定为服务的所有者。 root 用户已经可以访问应用程序文件夹,而我们遵循的说明没有设置组访问权限的步骤。
虽然我在 Linux permissions/ownership 方面经验不多,但对于大多数有经验的用户来说这可能是显而易见的。
我刚 运行 遇到这个问题。我能够创建 gunicorn 套接字文件,但 nginx 抱怨权限被拒绝。问题是我的套接字文件位于子文件夹中,而根文件夹没有读取或执行权限。因此,即使子文件夹具有正确的权限,根文件夹也会阻止 nginx 进入子文件夹。
解决方案是为根文件夹添加读取和执行权限:
chmod o+rx /example_root_folder
我们正在尝试将 NGINX 设置为我们的 Gunicorn Python 应用程序的反向代理。我们一直在关注来自 Digital Ocean (https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-16-04#create-a-systemd-unit-file) 的指南。 Gunicorn 和 NGINX 都是 运行 在同一个 Ubuntu 16.04 32 位虚拟机上。
我们在网上看到的所有处理此类权限问题的帖子似乎都指向服务文件中的错误 "Group" 设置,或者指向套接字文件的错误权限。但是正如您在下面看到的,我们将组设置为 "www-data"。套接字文件似乎具有必要的权限,并且 www-data 是所有者。
我们目前设置的内容(我已经用 "app" 替换了我们的应用程序名称):
run.py
from flask import current_app
import os
from os import path
from application import app
from instance.config import Config
if __name__ == '__main__':
conf = Config()
app.run(host='0.0.0.0', debug=False, threaded=True)
/etc/systemd/system/app.服务
[Unit]
Description=Application
After=network.target
[Service]
User=<root>
Group=www-data
WorkingDirectory=/home/<root>/app
Environment="PATH=/home/<root>/venv/bin"
ExecStart=/home/<root>/venv/bin/gunicorn --workers 3 --bind unix:app.sock -m 007 run:app
[Install]
WantedBy=multi-user.target
/etc/nginx/sites-available/app
server {
listen 80;
server_name app.com;
location / {
include proxy_params;
proxy_pass http://unix:/home/<root>/app/app.sock;
}
}
/var/log/nginx/error.log
2020/06/05 16:49:22 [crit] 2176#2176: *1 connect() to unix:/home/<root>/app/app.sock failed (13: Permission denied) while connecting to upstream, client: 10.0.2.2, server: app.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/<root>/app/app.sock:/", host: "app.com"
这里是套接字文件的权限:
gsi@ubuntu:~/app$ ls -l app.sock
srwxrwx--- 1 <root> www-data 0 Jun 5 16:10 app.sock
我们是 NGINX 的新手,所以我们不太确定问题是什么或如何解决这个问题。任何人都可以看到我们哪里出错了吗?如果我们可以提供其他信息,请告诉我们。
不要在服务器名称中输入 app.com,而是尝试输入主机的 IP 地址,然后通过 运行:
查看是否可以在机器本身上运行$curl <IP address of the host machine>
如果还是不行,我已经写了一个article,试着用它来实现它,如果可行的话告诉我!
希望对您有所帮助! :)
我们可以通过授予 www-data 组访问完整应用程序文件夹的权限来解决此问题:sudo chgrp www-data ~/app
。它已经可以访问特定的套接字文件,但不能访问应用程序文件夹。
我认为没有必要,因为我们将 root 用户指定为服务的所有者。 root 用户已经可以访问应用程序文件夹,而我们遵循的说明没有设置组访问权限的步骤。
虽然我在 Linux permissions/ownership 方面经验不多,但对于大多数有经验的用户来说这可能是显而易见的。
我刚 运行 遇到这个问题。我能够创建 gunicorn 套接字文件,但 nginx 抱怨权限被拒绝。问题是我的套接字文件位于子文件夹中,而根文件夹没有读取或执行权限。因此,即使子文件夹具有正确的权限,根文件夹也会阻止 nginx 进入子文件夹。
解决方案是为根文件夹添加读取和执行权限:
chmod o+rx /example_root_folder