第一坑 迁移完成页面一直报错如下
其实算是宝塔的坑 不算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里的redis的port配置重名了 又恰好的是 laravel的env函数 先取环境变量 再取.env 就造成了如此尴尬的bug
版权属于:本文是原创文章,版权归 吾梦小站 所有。
本文链接:https://nikm.cn/archives/68.html
本站所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由地转载和修改,但请务必注明文章来源并且不可用于商业目的。

