今天配置完 nginx,改了一下默认的日志输出目录,然后照例检查 nginx 配置文件,结果检查不通过,提示如下错误:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [emerg] open() "/data/log/www.cmiinv.com.access.log" failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed

第一反应是文件目录权限出了问题,看了下目录有读写权限,遂怀疑是 selinux 的问题,查看相关目录的安全上下文信息,结果如下:

root@VM-Nginx conf.d]#  ls -Z -d /data/log/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /data/log/

再对比正常的信息:

[root@VM-Nginx conf.d]# ls -Z -d /var/log/nginx/
drwxr-xr-x. root root system_u:object_r:httpd_log_t:s0 /var/log/nginx/

以上通过“:”划分成了四段,第一段代表的是用户,第二段 object_r 表示的是角色,第三段是SELinux中最重要的信息,httpd_log_t 表示的是类型,最后一段 s0 是跟MLS、MCS相关的东西,暂时不需要管,详细的解释如下:

  1. system_u  指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统进程,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时有权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。
  2. object_r  object_r一般为文件目录的角色、system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色。
  3. httpd_log_t  文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限。

解决方案如下:

[root@VM-Nginx conf.d]# chcon -R -u system_u /data/log/
[root@VM-Nginx conf.d]# chcon -R -t httpd_log_t /data/log/

再次查看安全上下文信息,显示如下

[root@VM-Nginx conf.d]#  ls -Z -d /data/log/
drwxr-xr-x. root root system_u:object_r:httpd_log_t:s0 /data/log/

重新检查配置文件,顺利通过。然后 reload 即可

最后再说一句,习惯这个东西,要慢慢养成,比如修改完配置文件,检查一下还是非常有必要的,而且,能用 reload 的地方尽量不要 restart,不然,这次又该手忙脚乱一阵了

最后修改:2018 年 11 月 02 日
如果觉得我的文章对你有用,请随意赞赏