tp5部署lnmp平臺解決方案,史詩級爬坑。
用tp5.1做了和小專案,準備上線測試下,納尼,途中可謂艱辛,多次遇到500,502,404。用的是lnmp一鍵安裝的環境,爬坑途中發現原來作者考慮的夠多了,全是乾貨,感謝。
pathinfo問題
nginx 預設不支援pathinfo解析,需要自己配置,因為對nginx不太熟悉,自己配的漏洞百出,坑底半天沒出來,最後找到lnmp環境已經提供,直接上配置。
listen 18888;
index index.html index.htm index.php;
root /home/wwwroot/tp5/public;
include enable-php-pathinfo.conf;
include thinkphp.conf;
- 詳細配置
enable-php-pathinfo.conf
location ~ [^/]\.php(/|$)
{
fastcgi_pass unix:/tmp/php-cgi.sock; # 這個自己適配 不行的話用埠 127.0.0.1:9000
fastcgi_index index.php;
include fastcgi.conf; # 後面有
include pathinfo.conf; # 後面有
}
thinkphp
location / {
if (!-e $request_filename ) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
}
還有 fast-cgi 和 pathinfo.conf
# fast-cgi
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type ;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; # 注意此處 待會有坑
# pathinfo.conf
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;
try_files $fastcgi_script_name =404;
500 伺服器錯誤問題
此原因由於匯入出錯造成,而且白屏無錯誤提示,先在index.php里加上:
scandir
error_reporting(E_ALL);
ini_set('display_errors', '1');
然後發現:Fatal error: require(): Failed opening required。。。。,找資料得知發現是php open_basedir 配置的問題,php不能引入其授權目錄上級及其以上的檔案,預設配置在php.ini,一般都沒有設定,預設註釋。我們這裡選擇在fast-cgi中配置,當然在php.ini或者其他地方配置。注意到我上面的標的注意點。我們配置到public下,在require上級目錄時沒有許可權。
配置到其上級目錄。
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/../:/tmp/:/proc/";
重啟或者重新載入,大工告成。終於可以看到頁面了。
其他
遇到scandir函式不可用的問題,原因是將其禁用了,通過php.ini,將其刪除禁用即可。
看到在php.ini中開啟cgi.fix_pathinfo=1,沒有測試是否有效,又不行的小夥伴可以改一下。
總結
在linux上許可權是個非常值得注意的問題,擁有這方面的思想和經驗很重要。最後小夥伴們記得每次修改配置後重啟或者重新載入配置哦,附上幾個常用的,類推哦。
nginx -s reload
/etc/init.d/nginx -s restart
service nginx reload