最近阿里云在频繁的搞活动,于是又入手了一台新加坡主机(控制不住我自己啊::>_<::),接着又走了一遍ss-panel-v3-mod的搭建。这次感触颇深,主要原因是因为自己太追“潮流”引起的

部署环境概述

  1. 操作系统为CentOS 7.3
  2. lnmp一键安装包的版本为1.4
  3. 具体的组件的版本,PHP选择了版本为7.1.5、MySQL版本为5.5.56

总结出现的问题(未完待续)

访问前端网站(ss-panel-v3-mod)直接报错ERROR 500

1. 问题还原

①安装完lnmp包,一切顺利正常;

②下载完ss-panel-v3-mod源码到网站的根目录下;

③创建完数据库;④使用composer安装ss-panel-v3-mod所需的组件;

⑤配置了/home/wwwroot/{WEB_SITE_DIR}/config/.config.php

⑥创建了管理员帐户。兴高采烈的访问了一下网站,结果返回了500(心一下就纠结了), what’s wrong ?

2. 尝试解决

接着就去翻看ss-panel-v3-mod的文档,按照错误排查文档config.php里的$System_Config['debug']值修改为了true,满心欢喜着期待错误出现,结果然并卵用,依旧是500

心一下就凉了大半节,经过一番搜索+思考,总算把错误信息给整出来了。说说怎么整出来的吧!那就是修改php.ini相信每个phper都是知道的,可惜我不是phper(我是dotNet)。lnmpphp.ini所处位置为/usr/local/php/etc/php.ini,修改php.ini文件如下:

/usr/local/php/etc/php.ini
; 显示错误信息
display_errors = On
; 显示php开始错误信息
display_startup_errors = On
; 日志记录错误信息
log_errors = On

一般情况下要稍等一小会,如果不想等直接使用/etc/init.d/php-fpm restart,让配置起效

ps: 问题解决后,建议还原设置$System_Config['debug']php.ini

3. 错误详情

Warning: require(): open_basedir restriction in effect. File(/home/wwwroot/sspanel/bootstrap.php) is not within the allowed path(s): (/home/wwwroot/sspanel/public/:/tmp/:/proc/) in /home/wwwroot/sspanel/public/index.php on line 7
Warning: require(/home/wwwroot/sspanel/bootstrap.php): failed to open stream: Operation not permitted in /home/wwwroot/sspanel/public/index.php on line 7
Fatal error: require(): Failed opening required '/home/wwwroot/sspanel/public/../bootstrap.php' (include_path='.:/usr/local/php/lib/php') in /home/wwwroot/sspanel/public/index.php on line 7

4. 解决方案

起因是PHP基于open_basedir设置,来限制PHP程序跨目录访问的安全策略,其使用.user.ini文件和nginx来配合(作用和.htaccess文件相同,这个是基于Apache httpd服务器)。

lnmp1.4一键安装对其配置是存在于/usr/local/nginx/conf/fastcgi.conf文件fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";,个人感觉这个设计有点别扭,这个配置对所有站点都写死了不灵活。

对于详细错误的解释:由于我们在站点配置文件(/usr/local/nginx/conf/vhost/{WEB_SITE}.conf),网站根目录配置root /home/wwwroot/{WEB_SITE_NAME};这一行进行修改(修改成了root /home/wwwroot/{WEB_SITE_NAME}\public;),因此open_basedir=$document_root/...$document_root指的是网站的public目录,而非/home/wwwroot/{WEB_SITE_NAME},在读取bootstrap.php文件(而该文件正好位于/home/wwwroot/{WEB_SITE_NAME}目录下,在public目录上一层)时出错,受跨目录访问安全限制。

主要有两种解决方案:

  1. 直接注释掉fastcgi.conf文件中的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";这一行,一棒子打死了目录访问安全策略

  2. fastcgi.conf文件中,修改fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/";,以test.com为例(此域名为添加vhost时输入的域名),修改内容如下:(这样做的坏处时每次添加vhost时都需要手动添加⊙﹏⊙)

    /usr/local/nginx/conf/fastcgi.conf
    fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/test.com/:/tmp/:/proc/";

参考资料