zoukankan      html  css  js  c++  java
  • 烂泥:nginx、php-fpm、mysql用户权限解析

    本文首发于烂泥行天下

    前几天学习了,在nginx下搭建wordpress博客。在《烂泥:使用nginx利用虚拟主机搭建WordPress博客》文章中,我们特别提到了有关程序运行在哪个用户下面。

    这篇文章我们就特别来讲解下,nginx、php-fpm以及mysql运行在各个用户下的配置。

    先来做个说明: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命令进行查看,如下:

    ps aux|grep nginx

    clip_image001

    通过上图我们可以很明显的看到nginx的父进程是运行在root用户下的,而子进程时运行在nobody用户下,而且只有一个子进程。这个和我们在nginx的配置文件中,配置的一致。如下:

    more /usr/local/nginx/conf/nginx.conf

    clip_image002

    注意:nginx如果没有配置运行用户的话,默认是使用nobody用户运行。使用nobody运行nginx安全性是比较高的。

    以上是nginx的运行用户。

    现在我们来查看下php-fpm的运行用户,使用ps命令。如下:

    ps aux |grep php-fpm

    clip_image003

    通过上图,我们可以看到php-fpm的父进程运行在root用户下,而子进程全部运行在apache用户下。

    我们再来看看mysql数据库运行在哪个用户下面,使用ps命令查看。如下:

    ps aux |grep mysql

    clip_image004

    通过上图我们可以看到,mysql运行在mysql用户下,而且其PID确实和保存在/var/run/mysqld/mysqld.pid中的一样。

    以上就是nginx、php-fpm、mysql的运行在各个用户下的情况。

    我们来开始测试实际生产环境中的配置,在《烂泥:使用nginx利用虚拟主机搭建WordPress博客》文章中我们已经配置好了,虚拟主机a.ilanni.com。如下:

    clip_image005

    我们来看看a.ilanni.com虚拟主机根目录的所属用户及用户组,如下:

    clip_image006

    在实际生产环境中,我们一般的配置是nginx与php-fpm都运行在nobody用户下,而且网站的根目录也要属于nobody用户,并且根目录对nobody用户具有所有权限。

    这样配置是最安全的,因为nobody用户最安全。即使黑客攻破了网站,但是也不能登录系统。

    现在我们先不进行任何配置,使用各自的默认用户发表一篇文章来看看实际的效果。

    对于wordpress发表文章,我一般都是通过windows live writer这个博客客户端发表的。

    我们现在还是通过这个客户端来发表一篇只有文字没有图片的文章,如下:

    clip_image007

    clip_image008

    通过上图,我们可以很明显的看到,这篇测试文字的文章已经成功发布。

    接下来我们再来测试一篇图文并茂的文章,如下:

    clip_image009

    clip_image010

    通过上图,我们可以看到带有图片的文章是没有办法发布的。windows live writer已经提示出错。

    为什么带有图片的文章就不能发布呢?

    其实这个问题很简单,文章中的图片需要先上传到网站的根目录下,然后才能正常访问。现在php-fpm运行在apache用户下,而问题是apache用户对虚拟主机a.ilanni.com根目录没有访问权限,更没有写入权限。

    所以就会出现上述的问题,windows live writer不可以发布带有图片的文章。

    那么如何解决这个问题呢?

    其实很简单的,我们在前面都已经说了。nginx涉及到两个用户,一个是nginx运行的用户,一个是php-fpm运行的用户。如果访问的是一个静态文件,则只需要nginx运行的用户对文件具有读取权限。

    而如果访问的是一个php文件,则首先需要nginx的运行用户对文件有读取权限,读取到文件后发现是一个php文件,则转发给php-fpm,此时则需要php-fpm用户对文件具有读取权限。

    我们现在需要做的就是统一naginx与php-fpm运行用户为nobody,然后把nginx的虚拟主机a.ilanni.com网站根目录对nobody用户及nobody用户组具有所有权限。

    nginx已经运行在nobody用户下,我们就不进行调整了。我们来调整php-fpm运行用户,php-fpm我们是通过yum方式进行安装的。而且使用的还是默认配置,该配置文件为/etc/php-fpm.d/www.conf。

    现在开始编辑该文件,修改其运行的用户级用户组。如下:

    vi /etc/php-fpm.d/www.conf

    clip_image011

    编辑完毕后,重启php-fpm。如下:

    /etc/init.d/php-fpm restart

    ps aux|grep php-fpm

    clip_image012

    通过上图,我们可以看到目前php-fpm已经运行在nobody用户。

    php-fpm运行用户修改完毕后,我们现在来修改虚拟主机的根目录用户及用户组。如下:

    chown nobody:nobody -R a.ilanni.com/

    clip_image013

    虚拟主机a.ilanni.com根目录所属用户及用户组修改完毕后,也要注意修改nobody对虚拟主机a.ilanni.com根目录的权限。

    通过上图我们可以看到,目前nobody用户已经对虚拟主机a.ilanni.com根目录已经具有控制权限。

    以上权限修改完毕后,我们再来通过windows live writer发布图文文章。如下:

    clip_image014

    通过上图,我们可以看到。该文图文章已经被成功的发布到wordpress中。我们再来看下,wordpress中的图片存放位置。

    ll /ilanni/a.ilanni.com/wp-content/uploads/2014/09

    clip_image015

    以上就是nginx、php-fpm、mysql在实际使用过程中用户的配置。按理说,文章到这我们就应该结束了。

    但是为了更能和我们的实际生产环境相结合,我们来延伸下。如果说我们现在这个wordpress是一个项目,该项目正在开发。而开发人员我们是没有在linux系统中开通相关账户的,只开通了一个FTP账户。

    但是开发人员又要上传代码和修改相关的代码,怎么办呢?

    这个就需要结合Vsftpd虚拟名用户来进行设置。有关这方面的资料,可以参考我以前的文章《烂泥:vsftpd虚拟用户与匿名用户配合使用》。

    先来安装vsftpd,使用yum方式。安装完毕后,我们就来配置vsftpd。

    具体配置后的文件内容如下:

    vi /etc/vsftpd/vsftpd.conf

    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控制项目的目的。

  • 相关阅读:
    二分图最大匹配的König定理及其证明
    HDOJ 2389 Rain on your Parade
    HDOJ 1083 Courses
    HDOJ 2063 过山车
    POJ 1469 COURSES
    UESTC 1817 Complete Building the Houses
    POJ 3464 ACM Computer Factory
    POJ 1459 Power Network
    HDOJ 1532 Drainage Ditches
    HDU 1017 A Mathematical Curiosity
  • 原文地址:https://www.cnblogs.com/ilanni/p/4010321.html
Copyright © 2011-2022 走看看