通常情况下,我们运行web应用的服务器有CentOS、Ubuntu、Debian等等的Linux发行版本。这时候,构成服务架构所必须的Nginx、php和MySQL等应用的权限控制就显得非常重要,各个服务对代码目录的权限要求各不相同,缺少某些权限会造成服务无法读写或运行的错误,降低了权限要求又会存在被入侵修改的隐患。这里我们就来总结一下nginx、php-fpm和mysql等等这些服务的权限划分。
一、Web服务器Nginx权限配置
PHP的运行框架通常都是结合Nginx组成LNMP或者结合Apache组成LAMP的架构,这里用Nginx作为例子讲述一下Nginx服务运行所需要的权限。
我们知道,Nginx本身不能解析PHP的语法,所以Nginx对于静态文件(如HTML等)会直接解析返回结果,但是对于PHP的文件,Nginx会转交给PHP的解释器php-fpm进行处理,处理完后再返回响应给客户端浏览器。
因此,我们代码目录下需要统一Nginx和php的服务所需权限。
①如果统一使用root用户,则一般游客账户无法访问应用,而nginx配置成以root运行的话会存在很大的安全隐患,一旦被攻击就会被获取root身份进行系统的一切操作。
②而如果统一将代码目录权限全部设置为rwxrwxrwx,则存在用户直接通过浏览器修改代码目录的隐患。
所以最好的办法就是统一归类到一个新的用户组里面,通过给该用户组分配Nginx和php运行必要的权限,来实现对web应用的权限目录管理。通常情况下,许多团队都会把这个用户组取名www,由www用户来统一管理代码目录权限。
我们可以看到Nginx的配置文件nginix.conf里面划分的运行权限就是配置到了www用户下,因此Nginx的子进程也是由www用户执行,可以通过ps aux | grep nginx来查看:
可以看到nginx的主进程是root,其余子进程均是www的用户
nginx.conf的配置:
二、PHP的权限配置
同样的,php的运行方式也是由主进程root运行,在子进程池(pool)里面配置由www用户执行,具体配置在php根目录下的/etc/php-fpm.conf下,添加两行:
user = www
group = www
即可,同样用 ps aux | grep php 可以查看进程使用的用户身份:
可以看到php-fpm的主进程是root,其余子进程均是www的用户
三、服务器中文件目录权限配置
如果访问的是一个静态文件的话,则只需要nginx运行的用户对文件具有读权限或者读写权限。
如果访问的是一个php文件的话,则首先需要nginx运行的用户对文件有读取权限,读取到文件后发现是一个php文件,则转发给php-fpm,此时则需要php-fpm用户对文件具有有读权限或者读写权限。
以wwwroot目录为例,存放php代码、上传文件、图片等需要给目录赋值www权限,否则会存在程序执行中各种权限问题造成的错误。
文件目录赋值www用户权限:chown www:www -R wwwroot/