情景浮现
如题,小编在Laravel5.6+CentOS7.6+Lnmp1.5+Vue6.9+Node10.15项目开发下页面遇到了一个 “No input file specified”错误, 重启php-fpm后又正常,几十分钟后又接着报No input file specified 错误。
原因分析
1、任何对.php文件的请求,都简单地交给php-cgi去处理,但没有验证该php文件是否存在。PHP文件不存在,没办法返回普通的404错误,它返回一个404, 并带上一句”No input file specified”
2、还可能跟路径或者权限有关系,或者SCRIPT_FILENAME 变量没有被正确的设置(这在nginx是最常见的原因, nginx.conf)
a. 如果html也出现404错误,那么就是document root 设置的有问题
b. 检查脚本文件的权限, 可能PHP或者web server不能读取它
c. SCRIPT_FILENAME设置错误
3、防跨目录设置
a、在低版本中的php.ini里面,open_basedir设置;
b、后来为了方便有的修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。修改后重启php-fpm即可。
c、如果不想用防跨目录或者修改.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE “open_basedir=$document_root/:/tmp/:/proc/”; 在该行行前添加 # 或删除改行,需要重启nginx。
解决办法
方法一:(真正的正确方法),产生原因和php-fpm的#防跨目录设置#有关系
server { listen 8082; server_name localhost; index index.html index.htm index.php; root /home/wwwroot/demo/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ [^/]\.php(/|$) { include fastcgi_params; fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
LNMP 1.4或更高版本如果不想用防跨目录或者修改.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE “open_basedir=$document_root/:/tmp/:/proc/”; 在该行行前添加 # 或删除改行,需要重启nginx。
LNMP 1.4或更高版本也可以直接使用lnmp安装包 tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除。
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
方法二:(不安全,不可取)打开文件: usr/local/php/etc/php.ini,修改以下配置
- 把cgi.fix_pathinfo=0 改为 cgi.fix_pathinfo=1
- 把 ;cgi.force_redirect=1 改为 cgi.force_redirect=0
方法三:(不是主要原因)修改文件权限
cd /home/wwwroot/ chown -R www:www ./* chmod -R 755 ./* lnmp restart
当执行的时候。如果个别项目里边有.user.ini文件。会提示
chown: changing ownership of ‘./www.test.com/.user.ini’: Operation not permitted
这时候需要进入这个目录执行
chattr -i .user.ini
然后进入到wwwroot目录, 再执行权限命令,最后别忘了,进入www.test.com目录,执行
chattr +i .user.ini
最后重启
lnmp restart
搞定!
补充:Linux chattr 命令,用于改变文件属性。
这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:
- a:让文件或目录仅供附加用途。
- b:不更新文件或目录的最后存取时间。
- c:将文件或目录压缩后存放。
- d:将文件或目录排除在倾倒操作之外。
- i:不得任意更动文件或目录。
- s:保密性删除文件或目录。
- S:即时更新文件或目录。
- u:预防以外删除。
语法
chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]
参数
- -R 递归处理,将指定目录下的所有文件及子目录一并处理。
- -v<版本编号> 设置文件或目录版本。
- -V 显示指令执行过程。
- +<属性> 开启文件或目录的该项属性。
- -<属性> 关闭文件或目录的该项属性。
- =<属性> 指定文件或目录的该项属性。
实例
用chattr命令防止系统中某个关键文件被修改:
chattr +i /etc/resolv.conf lsattr /etc/resolv.conf
会显示如下属性
----i-------- /etc/resolv.conf
让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:
chattr +a /var/log/messages
2020年3月18日迁移服务器到阿里云ECS遇到的问题及其解决方法
问题一:提示如下错误:
require(): Failed opening required ‘/home/www/project/public/../vendor/autoload.php’ (include_path=’.:/usr/local/php/lib/php
解决方法:
1. cd 到该引用的根目录,先删除 composer.lock 文件; 2. 重新在根目录执行“composer install”,这样就能重新生成 composer.lock 文件了。 3.如果出现php版本不匹配,可用“composer install –ignore-platform-reqs”(忽略版本匹配)。 4. vim /usr/local/nginx/conf/fastcgi.conf, 注释掉如下一行: # fastcgi_param PHP_ADMIN_VALUE “open_basedir=$document_root/:/tmp/:/proc/”; 然后重启 lnmp restart
问题二:提示如下错误:
404 Not Found Nginx
解决方法:
这个问题是和小编的nginx配置有关系,主要原因是我们自己定义的8081端口没有在阿里云的安全组里加上安全策略导致的。加上后,重启下nginx服务器即可
2020年4月29日部署新功能模块遇到的问题及其解决方法
问题一:运行命令“php artisan migrate”提示如下错误:
PHP Warning: include(/home/www/mysite/vendor/composer/../symfony/contracts/Service/ResetInterface.php): failed to open stream: No such file or directory in /home/www/mysite/vendor/composer/ClassLoader.php on line 444 Warning: include(/home/www/mysite/vendor/composer/../symfony/contracts/Service/ResetInterface.php): failed to open stream: No such file or directory in /home/www/mysite/vendor/composer/ClassLoader.php on line 444 PHP Warning: include(): Failed opening '/home/www/mysite/vendor/composer/../symfony/contracts/Service/ResetInterface.php' for inclusion (include_path='.:/usr/local/php/lib/php') in /home/www/mysite/vendor/composer/ClassLoader.php on line 444 Warning: include(): Failed opening '/home/www/mysite/vendor/composer/../symfony/contracts/Service/ResetInterface.php' for inclusion (include_path='.:/usr/local/php/lib/php') in /home/www/mysite/vendor/composer/ClassLoader.php on line 444 PHP Fatal error: Interface 'Symfony\Contracts\Service\ResetInterface' not found in /home/www/mysite/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php on line 20 Fatal error: Interface 'Symfony\Contracts\Service\ResetInterface' not found in /home/www/mysite/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php on line 20
解决方法:
运行“php artisan migrate”先运行“composer dump-autoload”