V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
poembre
V2EX  ›  PHP

被 bug 环绕的一天

  •  
  •   poembre · 2021-02-07 00:19:35 +08:00 · 2737 次点击
    这是一个创建于 1384 天前的主题,其中的信息可能已经有所发展或是发生改变。

    被 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 天

    第 1 条附言  ·  2021-02-07 17:43:52 +08:00
    对不起 ,写标题的时候太草率;当时就想改来着,然额,我想重新编辑的时候 不知道在哪编辑 。

    准备改为, PHP 程序员的头发到底是因为什么事情而脱落。 (ps:版主看到求帮个忙)
    6 条回复    2021-02-07 17:50:40 +08:00
    THESDZ
        1
    THESDZ  
       2021-02-07 10:01:32 +08:00   ❤️ 1
    docker 有端口映射的....你这哪里是 bug 啊,是没看文档
    yeept
        2
    yeept  
       2021-02-07 10:34:51 +08:00
    我记得默认情况 只要宿主机能访问外部网络,docker 默认通过网桥也可以访问外部网络。
    debuggerx
        3
    debuggerx  
       2021-02-07 10:38:38 +08:00
    这确实不叫 BUG……
    JaguarJack
        4
    JaguarJack  
       2021-02-07 11:23:56 +08:00
    这确实是你没好好看 Docker 文档
    qingfengxulai1
        5
    qingfengxulai1  
       2021-02-07 13:38:33 +08:00
    这个字体是什么字体?
    poembre
        6
    poembre  
    OP
       2021-02-07 17:50:40 +08:00
    确实没看 docker 文档, 平常用 golang 较多,也没怎么实操过 docker 。关于最后一条,我主要是为了加 --add-host 将代码中的外部 api 域名解析到指定机器去。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:15 · PVG 06:15 · LAX 14:15 · JFK 17:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.