作者:足至迹留

编辑:糖果

原文引用:

【原文】

Nginx用户权限

在nginx.conf文件的第一行一般是设置用户的地方(编译安装nginx时的参数–user=也是指定用户的地方),如 user www www;

如不指定默认是nobody. 这里用户的设置又有什么意义呢?主要是指定执行nginx的worker process的用户,linux里所有程序都是文件,都具有权限问题,这个指定的用户对特定的文件有没有权限访问或执行,就是这个用户的意义。

一、本人遇到问题

1.1 问题描述

不想让请求直接访问到具体页面,只是列出目录内的文件列表。于是把proxy_pass参数去掉,配置autoindex on,然后指定root目录。可访问后返回403,没有权限。

1.2 问题解决

猜测是用户原因,因为是默认的nobody,没有访问目录权限,然后指定有权限的用户,ok了。

二、网上类似问题

例一:403错误,没有权限

参考文章A:
参考文章B:

有时候当Nginx读取本地目录时会收到403错误,权限问题。

先来了解一下Nginx的用户管理:

(1)Nginx在以Linux service脚本启动时,通过start-stop-domain启动,会以root权限运行daemon进程。

(2)然后daemon进程读取/etc/nginx/nginx.conf文件中的user配置选项,默认这里的user=nginx,也就是用nginx用户启动worker process。403错误就是因为nginx用户没有权限访问我当前开发用的用户目录,/home/dean/work/resources。

解决方法是将user=nginx替换成root,然后重新启动nginx,可以了。
其他方法也试过,比如给/home/dean/work/resources目录设置777权限,比如将nginx用户加入root组,都不行。所以当开发的时候,就用user=root配置吧。至于产品环境下,resouces目录完全可以放到nginx用户目录下,所以问题不大。

举例2:访问速度慢

参考文章:

在说问题前,先扫下盲,关于linux下的nobody用户:
nobody是系统用户,是一个不能登陆的帐号,一个特殊用途的用户 ID ,一些服务进程如apache,aquid等都采用一些特殊的帐号来运行,比如nobody,news,games等等。一般来说 uid < 500 的都是系统 ID 。

Linux 系统为了安全,很多操作和服务的运行都不是运行在 root 用户下面的,而是一个专用的 ID ,这个 ID 一般就是 nobody ,这样就可以把每个服务运行的情况隔离出来。保证不会因为服务器程序的问题而让服务器程序成了黑客的直接操作源(黑客拿下了服务器程序,也仅仅是 nobody 用户而不是 root 用户)。同时也不会影响其他用户的数据。
服务器程序提权有专用的办法来防止恶意使用的。

除了 nobody ,常见的还有 ftp 、ssh 什么的。有的不是用来跑服务,而是用来占坑,主要是用用户组的权限管理进行权限设置,这个时候会有一个占坑用的同名 ID 加入到用户组。这种情况好像主要是为了兼容。

问题描述:
上午业务人员反映,系统响应很慢,界面要刷新很久才出得来。查后台也没有报什么错,我们系统是用nginx做负载均衡。惯性地不走负载均衡而直接访 问单节点应用,发现响应很快,很正常。初步定位问题出在nginx上,然后查nginx日志,发现有很多错误,错误中有“13: Permission denied”这个信息,明显是权限问题,很奇怪,之前运行都很正常啊。后来一问才知道,维护人员做了操作。

系统上nginx安装时使用的是root用户,也是用root用户启动的,所以要修改配置的时候需要使用root用户,管理上不方便,所以维护人员 心血来潮修改了nginx的权限(后来知道他是使用这个命令修改的权限chown -R user:group $nginxdir)。就是将nginx的用户和组都换掉了,但是这样为什么会造成“响应慢”呢?

问题原因及解决:
前面提到在linux上有些应用程序的一些进程会默认使用nobody这个用户来启动,以保安全。nginx有两种进程,除主进程之外的工作进程都 是用nobody这个用户启动的(nginx工作进程的数量使用worker_processes这个参数来设定)。而工作进程要访问nginx下这两个 目录client_body_temp和proxy_temp(这两个目录按我的理解是缓存一些静态文件,比如图片或者css文件什么的,以提高 nginx访问速度),权限变更后,造成工作进程访问不了这两个目录下的内容,造成某些图片和连接打不开,就像响应很慢一样。将权限变更一下就OK了。

【糖果后记】

一般权限的问题集中在,文件的上传读写,和静态目录就是必要常用就用场景,比如静态目录的文件读取。还有一种最常见的应用场景就是上传图片文件。

如果在conf中不指定user,默认起动的静态文件夹被归为了Nobody,用root用户启动的话,某些没有进行权限指定的文件还是不能读取,如果指定了用户,正确设定静态目录的所属用户和读写权限,才可以读和正常的写(上传文件),过程中必然要使用chown,chmod这种常用的权限操作。

感谢原文作者的分享!