Nginx與chroot的php5-fpm配合

因為某些原因,呆呆翰想要讓php5-fpm在chroot的狀態下執行(保障系統安全是其中一個)、而nginx不進行chroot直接執行。

以前就用網路上常見的方法處理nginx中alias的php不能執行的問題,用了一段大家都看過類似的設定,也沒甚麼大問題。

但是這次,不管怎麼改,伺服器永遠只會噴File Not Found這個討厭的訊息,網路上常見的設定長這樣:
location /alia/ {
    alia /home/dd-han/public_html/alia1/;
    index index.php index.html index.htm;
}
location ~ /alia/.+\.php.*$ {
    if ($fastcgi_script_name ~ /alia/(.+\.php.*)$) {
        set $valid_fastcgi_script_name $1;
    }
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /home/dd-han/alia1/$valid_fastcgi_script_name;
}

類似這樣的設定檔,有用nginx搭配php-fpm架設伺服器的朋友應該常常看到,可能也都用過這樣的設定檔。

就在呆呆翰很開心得進去/etc/php5/fpm/pool.d/www.conf修改好了chroot選項後,照理說設定檔應該只需要簡單的改成這樣就可以了:
location /alia/ {
    alias /home/dd-han/public_html/alia1/;
    index index.php index.html index.htm;
}
location ~ /alia/.+\.php.*$ {
    if ($fastcgi_script_name ~ /alia/(.+\.php.*)$) {
        set $valid_fastcgi_script_name $1;
    }
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    //既然php-fpm的root已經就從/home/dd-han/public_html/alia1/開始,那就把前面的都刪掉,應該可以吧?
     fastcgi_param SCRIPT_FILENAME $valid_fastcgi_script_name;
}

結果他不斷的出現「File not Found」,偏偏呆呆翰在網路上所有找到的教學都沒有提到chroot的php-fpm要怎麼跟nginx的alias配合,幾乎都是nginx與chroot的php-fpm配合,查了很久於是開始想到「來追蹤吧!」。

很不幸的呆呆翰一開始一直去研究nginx或php-fpm的debug訊息要怎麼開出來,好不容易開出來debug訊息卻找不到任何相關資訊……

最後,在StackExchange中找到Can I monitor a local unix domain socket like tcpdump? 這篇提到,可以用這樣的方式監聽Unix Socket:

socat -t100 -x -v UNIX-LISTEN:[新Socket],mode=777,reuseaddr,fork UNIX-CONNECT:[原Socket]

監聽後把得到的資訊稍微整理一下變成下圖:

DOCUMENT_ROOT怪怪的
擷取後的狀態

問題出現了,DOCUMENT_ROOT很明顯是錯的,雖然之前用也沒問題不過現在也只能猜一猜是不是這邊有問題摟,既然看到了問題就先修正(不管看起來有沒有關聯)再說摟。修正後的設定檔長這樣:
location /alia/ {
alias /home/dd-han/public_html/alia1/;
    index index.php index.html index.htm;
}
location ~ /alia/.+\.php.*$ {
    if ($fastcgi_script_name ~ /alia/(.+\.php.*)$) {
        set $valid_fastcgi_script_name $1;
    }
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param DOCUMENT_ROOT /web/;
    fastcgi_param SCRIPT_FILENAME $valid_fastcgi_script_name;
}

經過這樣一改,本來出不來的index.php就這樣恢復出現啦!!不過很微妙的是該頁面出現後,再把fastcgi_param  DOCUMENT_ROOT這行拿掉依然可以正常顯示,不曉得是甚麼樣的機制造成這結果。

不過既然花了快七個小時找才找到答案,當然要好好記錄一下免得自己忘記啦。

2 關於 “Nginx與chroot的php5-fpm配合” 的評論

  1. 其實我常常發現改了設定檔 nginx 卻沒有生效,後來用了 `nginx -t` 這個指令才發現用 `service nginx reload` 不會有任何錯誤訊息,從此我都會記得用 `nginx -t` 來檢查,不然可能又會花上七個小時吧(?

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *