先来做个说明:nginx本身不能处理PHP,它只是个web服务器。当接收到客户端请求后,如果是php请求,则转发给php解释器处理,并把结果返回给客户端。如果是静态页面的话,nginx自身处理,然后把结果返回给客户端。
Nginx下php解释器使用最多的就是fastcgi。一般情况nginx把php请求转发给fastcgi管理进程处理,fastcgi管理进程选择cgi子进程进行处理,然后把处理结果返回给nginx。
在这个过程中就牵涉到两个用户,一个是nginx运行的用户,一个是php-fpm运行的用户。如果访问的是一个静态文件的话,则只需要nginx运行的用户对文件具有读权限或者读写权限。
而如果访问的是一个php文件的话,则首先需要nginx运行的用户对文件有读取权限,读取到文件后发现是一个php文件,则转发给php-fpm,此时则需要php-fpm用户对文件具有有读权限或者读写权限。
首先,我们来查看nginx运行在什么用户下。使用ps命令进行查看,如下:
1 2 3 |
ps aux|grep nginx more /usr/local/nginx/conf/nginx.conf |
注意:nginx如果没有配置运行用户的话,默认是使用nobody用户运行。使用nobody运行nginx安全性是比较高的。
现在我们来查看下php-fpm的运行用户,使用ps命令。如下:
1 2 3 4 5 |
ps aux |grep php-fpm vim /etc/php-fpm.d/www.conf /etc/init.d/php-fpm restart |
我们再来看看mysql数据库运行在哪个用户下面,使用ps命令查看。如下:
ps aux |grep mysql
mysql运行在mysql用户下,而且其PID确实和保存在/var/run/mysqld/mysqld.pid中的一样。
修改虚拟主机的根目录用户及用户组
1 |
chown nobody:nobody -R a.xxx.com/ |
在实际生产环境中,我们一般的配置是nginx与php-fpm都运行在nobody用户下,而且网站的根目录也要属于nobody用户,并且根目录对nobody用户具有所有权限。
这样配置是最安全的,因为nobody用户最安全。即使黑客攻破了网站,但是也不能登录系统。
FTP账户权限
先来安装vsftpd,使用yum方式。安装完毕后,我们就来配置vsftpd。
具体配置后的文件内容如下:
vi /etc/vsftpd/vsftpd.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_file=/var/log/xferlog xferlog_std_format=YES idle_session_timeout=600 ftpd_banner=http. chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=YES listen_port=2121 pasv_min_port=6000 pasv_max_port=6150 userlist_enable=YES tcp_wrappers=YES guest_enable=YES guest_username=nobody pam_service_name=vsftpd user_config_dir=/etc/vsftpd/vu_conf virtual_use_local_privs=yes |
其中guest_enable=YES表示启用vsftpd虚拟用户,就是所有登录到FTP的用户在系统都是虚拟用户。
guest_username=nobody表示虚拟用户对应的系统用户为nobody用户。
virtual_use_local_privs=yes表示启用vsftpd虚拟用户,并且虚拟用户和本地用户有相同的权限。
pam_service_name=vsftpd启用vsftpd验证。
然后再配置vsftpd虚拟用户的目录,如下:
vi vu_conf/ilanni
local_root= /ilanni/a.ilanni.com
通过上述配置后vsftpd的虚拟用户ilanni,就已经对nginx的虚拟主机a.ilanni.com根目录具有完全控制权限。
从而也就达到了通过vsftpd控制项目的目的。