主管下的nginx无法打开conf文件

时间:2018-09-13 23:35:33

标签: nginx supervisord selinux rhel7

这很令人困惑:

我使用RHEL 7.5,试图在Supervisor 3.3.4下运行Nginx 1.14.0。最终目的是为Django网站服务。

我的“ /etc/init.d/supervisord”看起来像这样:

#!/bin/sh
...
# Source init functions
. /etc/rc.d/init.d/functions

prog="supervisord"
prog_bin="/bin/supervisord -c /etc/supervisord.conf"
PIDFILE="/var/run/$prog.pid"

start()
{
   echo -n $"Starting $prog: "
   daemon $prog_bin --pidfile $PIDFILE
   sleep 1
   [ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog startup"
   echo
}
... # "stop", "restart" functions, etc.

“ / etc / supervisord.conf”看起来像这样:

[unix_http_server]
file=/var/run//supervisor.sock 

[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = 
supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run//supervisor.sock

[include]
files = /etc/supervisor/conf.d/*.conf

“ / etc / supervisor / conf.d /”中只有一个文件:nginx.conf:

[program:nginx]
user=root
command=/usr/sbin/nginx -c /path/to/site/etc/nginx.conf
autostart=true
autorestart=true
startretries=3
redirect_stderr=True

直接用sudo /usr/sbin/nginx -c /path/to/site/etc/nginx.conf &调用上述命令成功。它开始启动,我可以看到带有ps -ef

的nginx进程

但是,如果我像这样启动主管d:

$ sudo /etc/init.d/supervisord restart

它无法启动Nginx:

$ sudo cat /var/log/supervisor/nginx-stdout---supervisor-tqI97D.log
nginx: [emerg] open() "/path/to/site/etc/nginx.conf" failed (13: Permission denied)

读取该文件的权限一直都很好。当然,该路径并不是实际上称为“ /path/to/site/etc/nginx.conf”,但是每个目录上的所有用户都有一个“ x”,而所有目录都有一个“ r” conf文件本身上的用户:

$ namei -om /path/to/site/etc/nginx.conf
f: /path/to/site/etc/nginx.conf
 dr-xr-xr-x root    root   /
 drwxr-xr-x root    root   path
 drwxr-xr-x root    root   to
 drwxrwxr-x user1   group1 site
 drwxrwxr-x user1   group1 etc
 -rw-r--r-- root    group1 nginx.conf

此文件的“ open()”操作如何出错?我尝试将“用户”更改为“ /etc/supervisor/conf.d/nginx.conf”和/或“ /etc/supervisord.conf”的根目录,但结果始终相同。

这是SELinux会有所作为吗?当前已激活。

$ getenforce
Enforcing

如果有帮助,则无法打开的nginx.conf文件如下所示:

user  nginx;
daemon off;

error_log  /path/to/site/var/log/nginx-error.log warn;
pid        /path/to/site/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  /path/to/site/var/log/nginx-access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream app_server {
        server unix:/path/to/site/var/run/my-django.socket fail_timeout=0;
    }

    server {
        listen 8000;
        server_name xxx.xxx.xxx.xxx;
        charset utf-8;

        location /media  {
            alias /path/to/site/htdocs/media;
        }

        location /static {
            alias /path/to/site/htdocs/static;
        }

        location / {
            uwsgi_pass  app_server;
            include     /path/to/site/etc/uwsgi_params;
        }
    }
}

有人有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在启用SELinux的系统上,进程和文件具有安全标签。 SELinux策略包含这些标签之间允许的访问模式。如果没有允许访问的规则,则拒绝访问。

您的nginx文件上的安全标签似乎不正确:AVC错误消息表明,httpd_t域中试图访问带有default_t标签的文件的进程拒绝了访问。要允许访问,您需要为nginx文件分配适当的安全上下文。 httpd_selinux man page中记录了可能的上下文。对于配置文件,适当的上下文为httpd_config_t,对于用户内容可能为httpd_user_content_t

您可以使用chcon工具将新的安全上下文手动应用于文件。确定要使用的安全上下文后,应使用semanage将其保存在文件上下文数据库中。否则,自动重新标记会错误地标记文件。

对于有关Unix和Linux堆栈交换的问题Configure SELinux to allow daemons to use files in non-default locations,我已经写了一个更详细的答案。