【问题标题】:NGINX + Gunicorn + Flask - 502 Bad Gateway - Permission Denied on Socket FileNGINX + Gunicorn + Flask - 502 Bad Gateway - 对套接字文件的权限被拒绝
【发布时间】:2020-09-25 06:22:33
【问题描述】:

我们正在尝试将 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 位虚拟机上运行。

我们在网上看到的所有处理此类权限问题的帖子似乎都指向服务文件中错误的“组”设置,或者指向套接字文件的错误权限。但正如您在下面看到的,我们将组设置为“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.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 的新手,所以我们不太确定问题是什么或如何解决此问题。谁能看到我们在哪里出错了?如果我们可以提供其他信息,请告诉我们。

【问题讨论】:

  • Nginx 是否在 www-data 组中?
  • @Sraw 当我使用getent group www-data 检查谁是 www-data 组的成员时,我得到以下输出:www-data:x:33:。这是你指的吗?感谢您的评论!
  • 我的意思是如果nginx 用户在www-data 组中。嗯,组里好像没有用户。
  • 看起来 nginx 根本不是系统上的用户。
  • 根据您的 Nginx 配置可能会有所不同。如果你使用ps -ef|grep nginx,你会看到有主进程和工作进程。关键是让工作进程能够访问套接字文件。在我的服务器上,worker进程属于nginx用户,在你的服务器上可能不一样,但重点是一样的。

标签: python nginx flask reverse-proxy gunicorn


【解决方案1】:

我刚刚遇到了这个问题。我能够创建 gunicorn 套接字文件,但 nginx 抱怨权限被拒绝。问题是我的套接字文件位于子文件夹中,而根文件夹没有读取或执行权限。因此,即使子文件夹具有正确的权限,根文件夹也会阻止 nginx 进入子文件夹。

解决方案是在根文件夹中添加读取和执行权限:

chmod o+rx /example_root_folder

【讨论】:

    【解决方案2】:

    不要在服务器名称中输入 app.com,而是尝试输入主机的 IP 地址,然后运行以下命令查看它是否适用于机器本身:

    $curl &lt;IP address of the host machine&gt;

    如果还是不行,我已经写了article,尝试用它来实现它,如果它有效,请告诉我!

    希望对您有所帮助! :)

    【讨论】:

      【解决方案3】:

      我们能够通过授予 www-data 组访问完整应用程序文件夹的权限来解决此问题:sudo chgrp www-data ~/app。它已经可以访问特定的套接字文件,但不能访问应用程序文件夹。

      我认为这没有必要,因为我们将 root 用户指定为服务的所有者。 root 用户已经有权访问 app 文件夹,并且我们遵循的说明没有设置组访问权限的步骤。

      我在 Linux 权限/所有权方面没有太多经验,所以这对于大多数有经验的用户来说可能是显而易见的。

      【讨论】:

        猜你喜欢
        • 2020-05-25
        • 2018-08-03
        • 2023-03-20
        • 2014-02-07
        • 2020-12-14
        • 1970-01-01
        • 2016-04-20
        • 2020-09-01
        • 2020-11-28
        相关资源
        最近更新 更多