[英]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#创建系统单元文件)。 Gunicorn 和 NGINX 都在同一个 Ubuntu 16.04 32 位虚拟机上运行。
我们在网上看到的所有处理此类权限问题的帖子似乎都指向服务文件中错误的“组”设置,或套接字文件上的错误权限。 但正如您在下面看到的,我们将组设置为“www-data”。 套接字文件似乎具有必要的权限,并且 www-data 是所有者。
我们当前设置的内容(我已将我们的应用名称替换为“app”):
运行.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.service
[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>
如果它仍然不起作用,我已经写了一篇文章,尝试使用它来实现它并让我知道它是否有效!
希望能帮助到你: :)
我们能够通过授予 www-data 组访问完整应用程序文件夹的权限来解决此问题: sudo chgrp www-data ~/app
。 它已经可以专门访问套接字文件,但不能访问应用程序文件夹。
我认为这没有必要,因为我们将 root 用户指定为服务的所有者。 root 用户已经有权访问 app 文件夹,并且我们遵循的说明没有设置组访问权限的步骤。
我对 Linux 权限/所有权没有太多经验,所以这对于大多数有经验的用户来说可能是显而易见的。
我刚刚遇到了这个问题。 我能够创建 gunicorn 套接字文件,但 nginx 抱怨权限被拒绝。 问题是我的套接字文件位于子文件夹中,而根文件夹没有读取或执行权限。 因此,即使子文件夹具有正确的权限,根文件夹也会阻止 nginx 进入子文件夹。
解决方案是向根文件夹添加读取和执行权限:
chmod o+rx /example_root_folder
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.