第一坑 迁移完成页面一直报错如下

其实算是宝塔的坑 不算k8s的

No input file specified.

其实多年经验phper肯定也不是第一次看到这个报错

一般都是项目目录没权限 或者php-fpm用户和用户组与项目目录不一致

一般只需以下操作以后 即可正常访问

chmod 777 -R www.nikm.cn
chown -R www:www www.nikm.cn

这次从宝塔迁移到k8s一直有问题 不停重复以上操作

查找自己封装的docker镜像中的php-fpm配置里的用户组发现是www-data

于是继续执行更改目录用户的操作

chown -R www-data:www-data www.nikm.cn

依旧报错

按道理镜像是没问题的 自己封装完以后也在开发环境跑过一年多了

最后发现是项目目录下有个.user.ini php-fpm会默认加载这个配置

open_basedir=/www/wwwroot/www.nikm.cn/:/tmp/

open_basedir里面配置了我们允许读写的目录 其实是为了安全和站点之间隔离使用的

宝塔创建站点时自动生成的 这次从宝塔迁移到k8s

直接拷贝了原来的站点目录 导致.user.ini也被拷贝过来

并且是.开头的隐藏文件 所以一开始并没有注意到是这里的原因

所以其实不管是宝塔的php项目迁移到哪里也好 都需要注意一下更改这里的配置 或者 直接删除(不建议)

第二坑。。其他程序都正常在跑 唯独所有laravel框架的项目都不能正常运行 并且报错都是如下

Redis::connect() expects parameter 2 to be integer, string given 
(View: /project/my.nikm.cn/resources/views/admin/user/login.blade.php)

报的都是redis连接问题 并且第二个参数有问题 看了下框架源码 第二个参数应为redis的端口号 通常为6379

并且这个配置是从config/database.php里取出来的 config/database.php的配置是用env函数 从项目根目录下的.env文件取出来的

检查了.env文件 确定是6379没问题 这时候给env("REDIS_PORT",6379)打断点 发现打印结果如下

string(24) "tcp://10.233.63.115:6379"

看起来和我.env里的完全不是一个东西 而且再看这个ip 怎么感觉像k8s里的

于是看了下env的源码 是这样的写的 先找环境变量 环境变量没找到 找.env 再找不到 取env函数的第二个行参做 默认值

想到这里大概明白了,去pod里找到php容器 执行一下export查看环境变量

...
declare -x RABBITMQ_PORT="tcp://10.233.14.85:15672"
declare -x RABBITMQ_PORT_15672_TCP="tcp://10.233.14.85:15672"
declare -x RABBITMQ_PORT_15672_TCP_ADDR="10.233.14.85"
declare -x RABBITMQ_PORT_15672_TCP_PORT="15672"
declare -x RABBITMQ_PORT_15672_TCP_PROTO="tcp"
declare -x RABBITMQ_PORT_5672_TCP="tcp://10.233.14.85:5672"
declare -x RABBITMQ_PORT_5672_TCP_ADDR="10.233.14.85"
declare -x RABBITMQ_PORT_5672_TCP_PORT="5672"
declare -x RABBITMQ_PORT_5672_TCP_PROTO="tcp"
declare -x RABBITMQ_SERVICE_HOST="10.233.14.85"
declare -x RABBITMQ_SERVICE_PORT="15672"
declare -x RABBITMQ_SERVICE_PORT_HTTP="15672"
declare -x RABBITMQ_SERVICE_PORT_RABBITMQ="5672"
declare -x REDIS_PORT="tcp://10.233.63.115:6379"
declare -x REDIS_PORT_6379_TCP="tcp://10.233.63.115:6379"
declare -x REDIS_PORT_6379_TCP_ADDR="10.233.63.115"
declare -x REDIS_PORT_6379_TCP_PORT="6379"
declare -x REDIS_PORT_6379_TCP_PROTO="tcp"
declare -x REDIS_SERVICE_HOST="10.233.63.115"
declare -x REDIS_SERVICE_PORT="6379"
declare -x REDIS_SERVICE_PORT_REDIS="6379"
declare -x SHADOWSOCKS_PORT="tcp://10.233.7.246:1080"
...

发现了我们想看见的东西REDIS_PORT 原因就是我们在k8s里有个redis 并且给redis暴露了一个service 名字叫做redis

k8s创建service的时候会自动service的名字转大写加下划线 设置一堆环境变量用于内部使用

但是这个环境变量恰好与laravel .env里的redisport配置重名了 又恰好的是 laravelenv函数 先取环境变量 再取.env 就造成了如此尴尬的bug

最后修改:2022 年 07 月 18 日 03 : 16 PM
如果觉得我的文章对你有用,请随意赞赏