连接到上游时Nginx错误:(13:权限被拒绝)

时间:2014-02-17 03:55:54

标签: nginx flask uwsgi ansible-playbook

我在nginx-error.log文件中收到此错误:

2014/02/17 03:42:20 [crit] 5455#0: *1 connect() to unix:/tmp/uwsgi.sock failed (13: Permission denied) while connecting to upstream, client: xx.xx.x.xxx, server: localhost, request: "GET /users HTTP/1.1", upstream: "uwsgi://unix:/tmp/uwsgi.sock:", host: "EC2.amazonaws.com"

浏览器还显示502 Bad Gateway Error。 curl的输出是相同的,Bad Gateway html

我尝试通过将/tmp/uwsgi.sock的权限更改为777来解决此问题。但这不起作用。我还将自己添加到www-data组(一些看似相似的问题)。此外,没有骰子。

这是我的nginx.conf文件:

nginx.conf

worker_processes 1;
worker_rlimit_nofile 8192;

events {
  worker_connections  3000; 
}

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on; 
    #tcp_nopush     on; 

    keepalive_timeout  65; 

    #gzip  on; 

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

我正在使用Nginsx和Uwsgi运行Flask应用程序,只是为了彻底解释。如果有人有任何想法,我会非常感激他们。


修改

我被要求提供我的uwsgi配置文件。所以,我从未亲自编写过我的nginx或我的uwsgi文件。我按照指南here使用ansible-playbook设置了一切。 nginx.conf文件是自动生成的,但/etc/uwsgi除了READMEapps-enabled文件夹中的apps-available文件外没有任何内容。我是否需要为uwsgi创建自己的配置文件?我的印象是,ansible负责所有这些事情。

我相信ansible-playbook在我运行此命令时发现了我的uwsgi配置

uwsgi -s /tmp/uwsgi.sock -w my_app:app

它启动并输出:

*** Starting uWSGI 2.0.1 (64bit) on [Mon Feb 17 20:03:08 2014] ***
compiled with version: 4.7.3 on 10 February 2014 18:26:16
os: Linux-3.11.0-15-generic #25-Ubuntu SMP Thu Jan 30 17:22:01 UTC 2014
nodename: ip-10-9-xxx-xxx
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /home/username/Project
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 4548
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /tmp/uwsgi.sock fd 3
Python version: 2.7.5+ (default, Sep 19 2013, 13:52:09)  [GCC 4.8.1]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x1f60260
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72760 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 3 seconds on interpreter 0x1f60260 pid: 26790 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 26790, cores: 1)

6 个答案:

答案 0 :(得分:46)

出现权限问题是因为uwsgi将/tmp/uwsgi.sock的所有权和权限重置为755,并且每次uwsgi启动时都会将用户运行uwsgi。

解决问题的正确方法是让uwsgi更改/tmp/uwsgi.sock的所有权和/或权限,以便nginx可以写入此套接字。因此,有三种可能的解决方案。

  1. 运行uwsgi作为www-data用户,以便该用户拥有由其创建的套接字文件。

    uwsgi -s /tmp/uwsgi.sock -w my_app:app --uid www-data --gid www-data
    
  2. 更改套接字文件的所有权,以便www-data拥有它。

    uwsgi -s /tmp/uwsgi.sock -w my_app:app --chown-socket=www-data:www-data
    
  3. 更改套接字文件的权限,以便www-data可以写入。

    uwsgi -s /tmp/uwsgi.sock -w my_app:app --chmod-socket=666
    
  4. 我更喜欢第一种方法,因为它不会让uwsgi以root身份运行。

    前两个命令需要以root用户身份运行。第三个命令不需要以root用户身份运行。

    第一个命令使uwsgi作为www-data用户运行。第二个和第三个命令使uwsgi作为运行命令的实际用户运行。

    第一个和第二个命令只允许www-data用户写入套接字。第三个命令允许任何用户写入套接字。

    我更喜欢第一种方法,因为它不会让uwsgi以root用户身份运行,也不会使套接字文件成为世界可写的。

答案 1 :(得分:5)

虽然接受的解决方案是正确的,但SELinux也可能阻止访问。如果您确实正确设置了权限并仍然获得权限被拒绝的消息,请尝试:

sudo setenforce Permissive

如果它有效则SELinux出错了 - 或者说正在按预期工作!要添加nginx所需的权限,请执行以下操作:

  # to see what permissions are needed.
sudo grep nginx /var/log/audit/audit.log | audit2allow
  # to create a nginx.pp policy file
sudo grep nginx /var/log/audit/audit.log | audit2allow -M nginx
  # to apply the new policy
sudo semodule -i nginx.pp

之后将SELinux策略重置为强制执行:

sudo setenforce Enforcing

答案 2 :(得分:2)

您必须在uWSGI配置中设置这些权限(chmod / chown)。

chmod-socketchown-socket

http://uwsgi-docs.readthedocs.org/en/latest/Options.html#chmod-socket http://uwsgi-docs.readthedocs.org/en/latest/Options.html#chown-socket

答案 3 :(得分:0)

我知道为时已晚,但它可能对其他人有所帮助。我建议您遵循Running flask with virtualenv, uwsgi, and nginx非常简单和甜蜜的文档。

如果您在virtualenv中运行项目,则必须激活您的环境。

这是 yolo.py

from config import application

if __name__ == "__main__":
    application.run(host='127.0.0.1')

在/ tmp /目录中创建uwsgi.sock文件并将其留空。 正如@susanpal的回答所说:“权限问题的发生是因为uwsgi将/tmp/uwsgi.sock的所有权和权限重置为755,并且每次uwsgi启动时用户都会运行uwsgi。”它是正确的。

所以你必须在uwsgi启动时给sock文件授予权限。 所以现在按照下面的命令

uwsgi -s /tmp/uwsgi.sock -w yolo:application -H /var/www/yolo/env --chmod-socket=666 

与@susanpal有点不同的命令。 对于持久连接,只需添加“& ”命令结束

uwsgi -s /tmp/uwsgi.sock -w yolo:app -H /var/www/yolo/env --chmod-socket=666 &

答案 4 :(得分:0)

就我而言,更改一些php权限可以解决问题

sudo chown user:group -R /run/php

我希望这对某人有帮助。

答案 5 :(得分:-1)

你应该为你的应用程序发布nginx和uwsgi配置文件(在/ etc / nginx / sites-enabled /和/ etc / uwsgi / - 或者你把它们放在哪里)。

通常检查您的nginx应用配置中是否有类似于以下内容的行:

uwsgi_pass unix:///tmp/uwsgi.sock;

和uwsgi配置文件中的相同套接字名称:

socket=/tmp/uwsgi.sock