因為某些原因,呆呆翰想要讓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很明顯是錯的,雖然之前用也沒問題不過現在也只能猜一猜是不是這邊有問題摟,既然看到了問題就先修正(不管看起來有沒有關聯)再說摟。修正後的設定檔長這樣:
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這行拿掉依然可以正常顯示,不曉得是甚麼樣的機制造成這結果。
不過既然花了快七個小時找才找到答案,當然要好好記錄一下免得自己忘記啦。
其實我常常發現改了設定檔 nginx 卻沒有生效,後來用了 `nginx -t` 這個指令才發現用 `service nginx reload` 不會有任何錯誤訊息,從此我都會記得用 `nginx -t` 來檢查,不然可能又會花上七個小時吧(?
我是習慣打/etc/init.d/nginx configtest來檢查,所以還好