這篇文章咱們就特別來說解下,nginx、php-fpm 以及 mysql 運行在各個用戶下的配置。php
先來作個說明:nginx自己不能處理PHP,它只是個web服務器。當接收到客戶端請求後,若是是php請求,則轉發給php解釋器處理,並把結果返回給客戶端。若是是靜態頁面的話,nginx自身處理,而後把結果返回給客戶端。mysql
Nginx下php解釋器使用最多的就是fastcgi。通常狀況nginx把php請求轉發給fastcgi(即 php-fpm)管理進程處理,fastcgi管理進程選擇cgi子進程進行處理,而後把處理結果返回給nginx。linux
在這個過程當中就牽涉到兩個用戶,一個是nginx運行的用戶,一個是php-fpm運行的用戶。若是訪問的是一個靜態文件的話,則只須要nginx運行的用戶對文件具備讀權限或者讀寫權限。nginx
而若是訪問的是一個php文件的話,則首先須要nginx運行的用戶對文件有讀取權限,讀取到文件後發現是一個php文件,則轉發給php-fpm,此時則須要php-fpm用戶對文件具備有讀權限或者讀寫權限。web
首先,咱們來查看nginx運行在什麼用戶下。使用ps命令進行查看,以下:sql
ps aux|grep nginx
經過上圖咱們能夠很明顯的看到nginx的父進程是運行在root用戶下的,而子進程時運行在nobody用戶下,並且只有一個子進程。這個和咱們在nginx的配置文件中,配置的一致。以下:數據庫
more /usr/local/nginx/conf/nginx.conf
注意:nginx若是沒有配置運行用戶的話,默認是使用nobody用戶運行。使用nobody運行nginx安全性是比較高的。apache
以上是nginx的運行用戶。windows
如今咱們來查看下php-fpm的運行用戶,使用ps命令。以下:安全
ps aux |grep php-fpm
經過上圖,咱們能夠看到php-fpm的父進程運行在root用戶下,而子進程所有運行在apache用戶下。
咱們再來看看mysql數據庫運行在哪一個用戶下面,使用ps命令查看。以下:
ps aux |grep mysql
經過上圖咱們能夠看到,mysql運行在mysql用戶下,並且其PID確實和保存在/var/run/mysqld/mysqld.pid中的同樣。
以上就是nginx、php-fpm、mysql的運行在各個用戶下的狀況。
咱們來開始測試實際生產環境中的配置,在《爛泥:使用nginx利用虛擬主機搭建WordPress博客》文章中咱們已經配置好了,虛擬主機a.ilanni.com。以下:
咱們來看看a.ilanni.com虛擬主機根目錄的所屬用戶及用戶組,以下:
在實際生產環境中,咱們通常的配置是nginx與php-fpm都運行在nobody用戶下,並且網站的根目錄也要屬於nobody用戶,而且根目錄對nobody用戶具備全部權限。
這樣配置是最安全的,由於nobody用戶最安全。即便黑客攻破了網站,可是也不能登陸系統。
如今咱們先不進行任何配置,使用各自的默認用戶發表一篇文章來看看實際的效果。
對於wordpress發表文章,我通常都是經過windows live writer這個博客客戶端發表的。
咱們如今仍是經過這個客戶端來發表一篇只有文字沒有圖片的文章,以下:
經過上圖,咱們能夠很明顯的看到,這篇測試文字的文章已經成功發佈。
接下來咱們再來測試一篇圖文並茂的文章,以下:
經過上圖,咱們能夠看到帶有圖片的文章是沒有辦法發佈的。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用戶對文件具備讀取權限。
咱們如今須要作的就是統一 nginx 與 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
編輯完畢後,重啓php-fpm。以下:
/etc/init.d/php-fpm restart ps aux|grep php-fpm
經過上圖,咱們能夠看到目前php-fpm已經運行在nobody用戶。
php-fpm運行用戶修改完畢後,咱們如今來修改虛擬主機的根目錄用戶及用戶組。以下:
chown nobody:nobody -R a.ilanni.com/
虛擬主機a.ilanni.com根目錄所屬用戶及用戶組修改完畢後,也要注意修改nobody對虛擬主機a.ilanni.com根目錄的權限。
經過上圖咱們能夠看到,目前nobody用戶已經對虛擬主機a.ilanni.com根目錄已經具備控制權限。
以上權限修改完畢後,咱們再來經過windows live writer發佈圖文文章。以下:
經過上圖,咱們能夠看到。該文圖文章已經被成功的發佈到wordpress中。咱們再來看下,wordpress中的圖片存放位置。
ll /ilanni/a.ilanni.com/wp-content/uploads/2014/09
以上就是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控制項目的目的。