这很令人困惑:
我使用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
但是,如果我像这样启动主管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;
}
}
}
有人有什么想法吗?
答案 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,我已经写了一个更详细的答案。