一般網站應用程式若需要執行 cron job,通常都是使用 Web daemon user 身份(例如:CentOS下的 apache、nginx,Debian下的 www-data)來執行,比較常遇到的問題通常是程式執行中產生的目錄、檔案權限問題。
Linux 系統下控制 user 預設建立檔案、目錄權限的設定,全域設定在 /etc/bashrc 或 /etc/profile,直接將 umask 修改為你想要的數字即可,例如:一般預設值是 umask 022,所以遮罩後檔案就會是 644,而目錄就是 755,因此當我們想要讓 group 可以寫入,就要將 umask 設為 002。
不過,以上的適用情境只限於「可以登入系統」的 user。何謂「可以登入」的 user?簡單說就是這個 user 的 login shell 不能是 /sbin/nologin 或 /bin/false,至少要是系統中有提供的 shell(通常就是 /bin/bash 或 /bin/sh)。
對於Linux 系統中執行 daemon 的 user 來說,通常他們都是不允許登入的,因此若要讓它能在 shell 底下取得環境變數,第一步就是要將 /etc/passwd 中的該 user shell 改為 /bin/bash,接下來就是要讓他能讀取到 /etc/bashrc 或 /etc/profile,因此還需要將 /etc/skel 下的「.bashrc」、「.bash_profile」複製到該 user 的 home 目錄下,例如:我的 php-fpm 是使用 nginx 這個 user 來執行,因此調整的步驟大致如下:
1. vi /etc/passwd
2. 將 nginx 的 shell 從 /sbin/nologin 修改為 /bin/bash
3. cp /etc/skel/.bash* /var/lib/nginx/;chown -R nginx:nginx /var/lib/nginx (實際位置請依照該 user 的 home 目錄為準)
而上述的作法適用於「使用 shell command line 執行的應用程式」,若建立檔案、目錄是在 Web Daemon Process 中的 php 程式,例如: fckeditor 中上傳圖片到 server 上,此時的 php 應用程式不會使用 shell 的環境變數,主要應該還是為了安全性的考量。
如果我們要比照 shell 一樣,把 umask 002 設給 php-fpm Daemon User,那要如何設定呢?
答案就是將環境變數設在 /etc/sysconfig/php-fpm (RHEL、Fedora、CentOS適用),若是 Debian 或 Ubuntu 系統,則請將 umask 002 加在 /etc/init.d/php-fpm.conf 設定檔中
沒有留言:
張貼留言