被 bug 环绕的一天
起因: 由于生产环境 php 没有 redis 扩展
于是: 换台机器上 docker
一切搭建完成之后
发现访问不了
* 解决:找日志看走到了哪一步; 发现 nginx_error.log 下有如下提示 * 2021/02/06 15:09:17 [error] 397136#397136: *57 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 3.2.2.2, server: -, request: "POST /apigoods/info HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "api.localhost.com" * 大概就是 nginx 通过 fastcgi 协议发给 php-fpm 的时候,给的是宿主机的代码路径 docker 那边找不到脚本代码 改完 依旧访问不了
* 解决:找日志看走到了哪一步; 发现 nginx_error.log 下有如下提示 * 2021/02/06 10:18:25 [error] 398648#398648: *45 connect() failed (111: Connection refused) while connecting to upstream, client: 3.2.2.2, server: -, request: "POST /api/goods/info HTTP/1.0", upstream: "fastcgi://127.0.0.1:9000", host: "localhost" * 这个提示就有点困难了 找 php 的错误日志 发现 timeout * 突然想起 忘记把 mysql 加白名单,PHP 连接过去被 about 疑问 为啥没走 try catch 而直接 about 至少接口也应正常输出错误 json
* 解决: 找日志看走到了哪一步;为啥没有抛出错误 * 单步调试大法,最终定位 * pdo 连接没加超时参数 改完 依旧访问不了
* 解决:继续看日志,前面已经把 异常报错调好 这次直接看到 没有 redis 扩展 吐血 * PHP message: PHP Fatal error: Uncaught Error: Class 'Redis' not found in * 由于宿主机没有 php 环境, 打算去借个 docker 镜像。 结果 没有借到就借了个思路 * 直接进入 docker pecl 安装 redis * 有点新鲜,还可以这样 1. docker 容器中安装 php 扩展 1.1 进入 docker container exec -it f9d065a71599 /bin/bash 1.2 安装 redis 、swoole 扩展 #安装 pecl wget http://pear.php.net/go-pear.phar -O go-pear.php php go-pear.php ##回车默认安装 #使用 pcel 命令安装 /usr/local/bin/pecl install redis /usr/local/bin/pecl install swoole 2. 重启 php-fpm: ps aux|grep php-fpm root 42891 0.0 0.1 182796 1220 ? Ss 4 月 18 0:19 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) nobody 42892 0.0 0.6 183000 6516 ? S 4 月 18 0:07 php-fpm: pool www nobody 42893 0.0 0.6 183000 6508 ? S 4 月 18 0:17 php-fpm: pool www 重启 php-fpm: kill -USR2 42891 3.备份当前已经改好的实例为镜像 docker commit -a "php-fpm-add-redis222" -m "php-fpm-add-redis222" f9d065a71599 php-fpm-redis2:php-fpm2 改完 依旧访问不了
* 解决: 根据个人猜想 是因为 docker 内部无法访问外网域名 * docker 启动的时候 加个参数指定使用 * --network=host host 模式可以让容器共享宿主机网络栈,这样的好处是外部主 机与容器直接通信,但是容器的网络缺少隔离性 * --add-host=域名:ip 添加外网域名和 IP 对应信息到容器中的 /etc/hosts 