標籤:service tcp bsp apach upload color 使用者權限 讀寫 config
這篇文章我們就特別來講解下,nginx、php-fpm 以及 mysql 運行在各個使用者下的配置。
先來做個說明:nginx本身不能處理PHP,它只是個web伺服器。當接收到用戶端請求後,如果是php請求,則轉寄給php解譯器處理,並把結果返回給用戶端。如果是靜態頁面的話,nginx自身處理,然後把結果返回給用戶端。
Nginx下php解譯器使用最多的就是fastcgi。一般情況nginx把php請求轉寄給fastcgi(即 php-fpm)管理進程處理,fastcgi管理進程選擇cgi子進程進行處理,然後把處理結果返回給nginx。
在這個過程中就牽涉到兩個使用者,一個是nginx啟動並執行使用者,一個是php-fpm啟動並執行使用者。如果訪問的是一個靜態檔案的話,則只需要nginx啟動並執行使用者對檔案具有讀許可權或者讀寫權限。
而如果訪問的是一個php檔案的話,則首先需要nginx啟動並執行使用者對檔案有讀取許可權,讀取到檔案後發現是一個php檔案,則轉寄給php-fpm,此時則需要php-fpm使用者對檔案具有有讀許可權或者讀寫權限。
首先,我們來查看nginx運行在什麼使用者下。使用ps命令進行查看,如下:
ps aux|grep nginx
通過我們可以很明顯的看到nginx的父進程是運行在root使用者下的,而子進程時運行在nobody使用者下,而且只有一個子進程。這個和我們在nginx的設定檔中,配置的一致。如下:
more /usr/local/nginx/conf/nginx.conf
注意:nginx如果沒有配置運行使用者的話,預設是使用nobody使用者運行。使用nobody運行nginx安全性是比較高的。
以上是nginx的運行使用者。
現在我們來查看下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 restartps 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控制項目的目的。
摘自:http://ilanni.blog.51cto.com/526870/1561097
【轉】PHP網站(nginx、php-fpm、mysql) 使用者權限解析