在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