在LNMP1.4上部署WeiPHP5(ThinkPHP5)的若干问题解决

1、多版本PHP
问题原因:当初在服务器上安装LNMP1.4时PHP的版本默认为5.3,如今诸如opencart之类的大部分开源系统都建议PHP7以上了。
问题难度:简单
解决方案:LNMP模式支持多版本PHP,LNMPA、LAMP模式则不支持!要使用多PHP需要先安装多PHP版本,在lnmp1.4源码目录下运行命令:

./install.sh mphp

按提示选择要另外安装的PHP版本,只能选一个,要安装多个需要安装完成后再运行前面的安装命令。
安装完成之后,PHP7.1安装路径默认为/usr/local/php7.1/,php.ini文件路径为/usr/local/php7.1/etc/php.ini ,php-config文件路径为/usr/local/php7.1/bin/php-config,服务控制脚本为/etc/rc.d/init.d/php-fpm7.1

2、404/500错误
问题原因:在windows的WAMP上调试成功的WeiPHP移植到LNMP上不断出现404和500错误
问题难度:高
解决方案:WeiPHP的网络资料相当少,因为版本和环境的复杂性,又导致ThinkPHP查找到的信息不够精确,大约花费了两个工作日进行排查后确认为以下两个原因,一是ThinkPHP的web目录为public目录,需要访问上级目录的资源,二是rewrite规则的路由错误。

首先,在LNMP官方文档(https://lnmp.org/faq/lnmp-1-2-tools.html)中提供了一个防跨目录移除工具,可以先试试看
该工具可以快速的移除防跨目录的限制,在LNMP的tools目录下运行 ./remove_open_basedir_restriction.sh 按提示输入虚拟主机目录回车确认即可。

其次,LNMP1.4的conf目录(/usr/local/nginx/conf/)下已经提供了所有需要使用到的规则文件,具体包括针对ThinkPHP的路由规则thinkphp.conf,针对php7.1以及php-pathinfo的enable-php-pathinfo.conf和enable-php7.1.conf,还有针对fastcgi的fastcgi.conf。这些文件都可以在vhost目录下的网站配置文件中引用,不需要自己敲配置命令了。各配置文件默认信息如下,大致和网络上搜索到的配置脚本基本类似:

enable-php7.1.conf

        location ~ [^/]\.php(/|$)
        {
            try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi7.1.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
        }

enable-php-pathinfo.conf

        location ~ [^/]\.php(/|$)
        {
            fastcgi_pass  unix:/tmp/php-cgi.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
            include pathinfo.conf;
        }

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;

fastcgi.conf

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/";

关键的地方有三点:
1)从enable-php-pathinfo.conf文件可以看出来,LNMP使用pathinfo的方式是sock方式,而不是许多方案里的fastcgi_pass端口的方式(部分网上的文档里还把fastcgi_pass拼错了)。
2)LNMP只给默认安装的PHP版本提供了pathinfo的配置文件,通过比对enable-php.conf和enable-php-pathinfo.conf文件,会发现enable-php.conf多了一句try_files $uri =404;,少了一句include pathinfo.conf;
因此可以仿造enable-php-pathinfo.conf给新安装的PHP7.1也创建一个enable-php7.1-pathinfo.conf文件,内容如下:

        location ~ [^/]\.php(/|$)
        {
            #try_files $uri =404;
            fastcgi_pass  unix:/tmp/php-cgi7.1.sock;
            fastcgi_index index.php;
            include fastcgi.conf;
            include pathinfo.conf;
        }

pathinfo.conf里对try_files做过定义,因此enable-php7.1-pathinfo.conf文件里需要注释try_files $uri =404;,否则重启php-fpm时会报错。
创建完后,在LNMP的vhost目录下对应的网站配置文件里引用即可。

        include enable-php7.1-pathinfo.conf;
        include thinkphp.conf;

3)如果依然出错,则可以尝试手动修改fastcgi的配置文件 /usr/local/nginx/conf/fastcgi.conf 或php.ini文件,将网站base目录相对地址改为绝对地址。为了防止影响其他网站,也可以单独新建一个myfastcgi.conf文件来引用:

fastcgi_param PHP_ADMIN_VALUE "open_basedir=/home/wwwroot/weiphpPath/:/tmp/:/proc/";

这里的weiphpPath是WeiPHP的根目录,也就是public的上级目录;如果PHP禁用了scandir函数,还需要修改 php.ini文件开启。

3、finfo_open函数(fileinfo扩展)安装
问题原因:0.9版本以后的LNMP逐步禁止了一些危险的文件操作类型的扩展和函数,但WeiPHP需要使用fileinfo扩展的finfo_open函数。
问题难度:中等
解决方案:依次执行如下命令:(因为服务器安装了多个版本的PHP,路径和文件名需要按实际情况进行修改)

cd /home/heyk/lnmp1.4/src/
tar xvf php-7.1.7.tar.bz2
cd php-7.1.7/ext/fileinfo
phpize
./configure --with-php-config=/usr/local/php7.1/bin/php-config
make && make install
/usr/local/php7.1/etc/php.ini

在php.ini适当的位置(例如最后一行)上添加如下语句,重启php-fpm即可。

    extension=fileinfo.so

你可能感兴趣的:(在LNMP1.4上部署WeiPHP5(ThinkPHP5)的若干问题解决)