美文网首页IT@程序员猿媛程序员
在LNMP1.4上部署WeiPHP5(ThinkPHP5)的若干

在LNMP1.4上部署WeiPHP5(ThinkPHP5)的若干

作者: ChiefHYK | 来源:发表于2019-04-02 16:12 被阅读2次

    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)的若干

        本文链接:https://www.haomeiwen.com/subject/yfqgbqtx.html