2

说明

nginx仅能处理静态文件,当遇到php文件时须转发给php-fpm处理,因此项目中的php文件须同时具有给nginx和php-fpm执行的权限,必要时还要加上的权限。nginx和php-fpm的权限来源于它们的执行用户的权限,这里使这两者设置为同一执行用户来统一权限是比较方便的做法。
示范环境:

  • CentOS7.4
  • Nginx1.12.2
  • php7.2
  • 项目根目录是sorgo/
  • 项目管理员的用户名是uu,umask值是0002

操作

设置nginx和php-fpm为同一执行用户

新建执行用户www并自带用户组www,且不可登录.

useradd www -s /usr/sbin/nologin

将已有的项目管理人员账号(如:uu,当然你也可以再创建一个专用的)加入www

usermod -G www uu

修改nginx配置文件,变更执行用户为www,我的环境中该文件路径是:/etc/nginx/nginx.conf
修改nginx配置文件
修改php-fpm配置文件,变更执行用户为www,我的环境中该文件路径是:/etc/php-fpm.d/www.conf
修改php-fpm配置文件

修改完后重启nginx和php-fpm.

设置项目目录权限

下面以laravel项目目录为例,只给相关用户必要的权限,又不会像设置777那样权限过大而存在可能的安全问题。

chown -R uu:www sorgo/       #设置归属
chmod -Rf g+s sorgo/         #SGID,新生成文件或文件夹保持与父目录同一权限组
chmod -R 750 sorgo/          #设置具体权限
chmod -R 770 sorgo/storage/  #程序需要写入和创建新文件的加`写`权限

SGID属性对于像laravel框架这种有tinker让开发者在交互式命令行界面调试代码的特别有用。比如你使用tinker新建了一个日志文件,如果没有SGID那这个新日志文件的所有者和所有组会是uu:uu,这时www用户执行下的程序要写入东西到这个新日志的话就会因权限受阻而报错;而父目录有SGID属性的则会是uu:www,同时保证了两个相关的用户都能正常读写。

后言

曾经有过各种因权限问题而报错的,基本办法也都是设置777权限了事,直到后来一次在我一怒之下将整个项目文件都设了777权限但还报错,真见鬼了,简直要疯掉了。。。
于是才下决心正面解决这个问题,就在网络上找了各种解决方案,有靠谱的也有不靠谱的,以上方案是经我整理实践后确认可靠的方案,希望对你有用。
如果你还知道更好的方案,也请留言分享出来,谢谢~


Jeffid
214 声望10 粉丝

新世界的开发者;