被 bug 环绕的一天

2021-02-07 00:19:35 +08:00
 poembre

被 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 /api/goods/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

改完 成功了 总耗时 1 天

2510 次点击
所在节点    PHP
6 条回复
THESDZ
2021-02-07 10:01:32 +08:00
docker 有端口映射的....你这哪里是 bug 啊,是没看文档
yeept
2021-02-07 10:34:51 +08:00
我记得默认情况 只要宿主机能访问外部网络,docker 默认通过网桥也可以访问外部网络。
debuggerx
2021-02-07 10:38:38 +08:00
这确实不叫 BUG……
JaguarJack
2021-02-07 11:23:56 +08:00
这确实是你没好好看 Docker 文档
qingfengxulai1
2021-02-07 13:38:33 +08:00
这个字体是什么字体?
poembre
2021-02-07 17:50:40 +08:00
确实没看 docker 文档, 平常用 golang 较多,也没怎么实操过 docker 。关于最后一条,我主要是为了加 --add-host 将代码中的外部 api 域名解析到指定机器去。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/751921

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX