用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