Gunicorn Nginx在连接上游时被拒绝

时间:2018-04-04 09:21:59

标签: nginx gunicorn selinux

使用gunicorn& amp;设置django站点nginx的

项目的gunicorn设置:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=username
Group=nginx
WorkingDirectory=/home/username/my_project
ExecStart=/home/username/my_project/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/username/my_project/my_project.sock my_project.wsgi:application

[Install]
WantedBy=multi-user.target

项目的Nginx配置文件:

user nginx;

server {
    listen       80;
        server_name  192.168.66.106;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location = /favicon.ico { access_log off; log_not_found off; }
        location /static {
            alias /home/username/my_project;
        }

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://unix:/home/username/my_project/my_project.sock;
       }
    }

我拥有项目的这些许可

drwxrwxr-x. 5 username nginx 4.0K Apr  4 10:20 modulo1
-rwxrwxr-x. 1 username nginx  823 Apr  4 10:13 manage.py
drwxrwxr-x. 4 username nginx 4.0K Apr  4 10:20 modulo2
drwxrwxr-x. 2 username nginx  249 Apr  4 10:29 my_project
srwxrwxrwx. 1 username nginx    0 Apr  4 10:47 my_project.sock
-rw-rw-r--. 1 username nginx  565 Apr  4 10:13 README.md
-rw-rw-r--. 1 username nginx  228 Apr  4 10:14 requirements.txt
drwxrwxr-x. 5 username nginx   38 Apr  4 10:13 static
drwxrwxr-x. 3 username nginx   88 Apr  4 10:14 templates

这是来自/var/log/nginx/error.log

的日志错误
2018/04/04 10:54:03 [crit] 14238#0: *4 connect() to unix:/home/username/my_project/my_project.sock failed (13: Permission denied) while connecting to upstream client: 192.168.66.50, server: 192.168.66.106, request: "GET / HTTP/1.1", upstream: "http://unix:/home/username/my_project/my_project.sock:/", host: "192.168.66.106"

2 个答案:

答案 0 :(得分:2)

我有一个centos 7操作系统,无论如何我解决了安装问题:

sudo yum install policycoreutils-python 
sudo semanage permissive -a httpd_t 

答案 1 :(得分:0)

为了补充答案,基于CentOS / RHEL的Linux操作系统具有 默认 的SELinux(安全增强型Linux )。

  

SELinux可以处于启用或禁用状态。禁用时   仅使用DAC规则。启用后,SELinux可以在其中一个中运行   以下模式:

     
      
  • 强制执行:强制执行SELinux政策。 SELinux基于SELinux策略规则拒绝访问。这是默认。在强制执行模式下,如果某些内容违反了已定义的策略,则该操作将被阻止并记录。 因此,您面临的权限被拒绝
  •   
  • 许可:未强制执行SELinux政策。 SELinux不拒绝访问,但会记录拒绝操作   如果以强制模式运行,则被拒绝。
  •   

注意:以下操作将在 root

时执行

选项1

  • 使用 getenforce 实用程序查看当前的SELinux模式
  • 使用 setenforce 实用程序在强制模式和许可模式之间切换。
    • 使用setenforce 1进入强制执行模式。 [默认
    • 使用setenforce 0进入许可模式

选项2 : 使用utils创建策略,例如 policycoreutils-python

  

policycoreutils-python提供semanage等实用程序,   audit2allow,audit2why和chcat,用于操作和管理SELinux。

编辑

  • 通常创建一个特定的策略,如下所示(我使用的是uwsgi套接字):
  

policy_name.te

module <NAME_OF_THE_POLICY> 1.0;

require {
    type var_run_t;
    type httpd_t;
    type initrc_t;
    class sock_file write;
    class unix_stream_socket connectto;
}

#============= httpd_t ==============
allow httpd_t initrc_t:unix_stream_socket connectto;

#!!!! This avc is allowed in the current policy
allow httpd_t var_run_t:sock_file write;

然后从te:

创建pp模块
  

checkmodule -M -m -o policy_name.mod /path/to/your/policy/policy_name.te

一旦我们从policy_name.te配置创建了模块policy_name.mod,运行以下命令来创建已编译的SE模块

  

semodule_package -m policy_name.mod -o policy_name.pp

最后,使用以下命令安装编译SE Module policy_name.pp:

  

semodule -i policy_name.pp