第一坑 迁移完成页面一直报错如下
其实算是宝塔的坑 不算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 国际许可协议 进行许可。
您可以自由地转载和修改,但请务必注明文章来源并且不可用于商业目的。