You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel项目在Kubuntu 21.04开发环境Docker部署下TTFB长达2分钟的性能问题求助

解决Kubuntu环境下Laravel容器动态请求2分钟TTFB的问题

这个刚好卡2分钟的首字节时间太典型了,十有八九是某个超时机制触发了。结合你说的静态文件响应快、同事环境正常的情况,咱们一步步排查:

1. 优先排查DNS解析超时

120秒刚好是很多系统DNS请求的默认超时上限,Laravel启动或处理请求时可能在做DNS解析(比如验证服务、加载远程依赖),而你的Kubuntu环境DNS配置可能出了问题:

  • 先进入容器测试DNS速度:
    docker exec -it <你的容器ID> bash
    nslookup github.com
    
    如果这个命令卡顿很久,那DNS就是罪魁祸首。
  • 解决办法:
    • 启动容器时手动指定公共DNS:
      docker run -it --dns=8.8.8.8 --volume=$PWD:/app -w=/app -p8000:8000 registry.gitlab.com/myImages/php-nginx:myLaravelApp php artisan serve --host=0.0.0.0
      
    • 或者修改Docker全局DNS配置:编辑/etc/docker/daemon.json(没有就新建),添加:
      {"dns": ["8.8.8.8", "1.1.1.1"]}
      
      然后重启Docker服务:sudo systemctl restart docker

2. 检查本地目录挂载的权限与同步问题

你用了$PWD:/app挂载本地代码,Linux下Docker的volume挂载可能因为文件权限、文件系统同步(比如inotify)导致Laravel读取配置/路由文件时阻塞:

  • 检查容器内代码目录的权限:
    docker exec <容器ID> ls -l /app
    
    确保运行PHP的用户(通常是www-data或root)对目录有读写权限,必要时用chmod或chown调整。
  • 清理Laravel缓存,避免缓存文件加载异常:
    docker exec <容器ID> php artisan config:clear
    docker exec <容器ID> php artisan route:clear
    
  • 试试用Docker卷替代本地挂载,排除文件系统差异:
    docker volume create laravel-dev-volume
    docker run -it --volume=laravel-dev-volume:/app -w=/app -p8000:8000 registry.gitlab.com/myImages/php-nginx:myLaravelApp bash
    # 进入容器后把你的代码复制到/app目录,然后启动服务
    php artisan serve --host=0.0.0.0
    
    如果速度正常,说明是本地文件系统和容器的兼容性问题。

3. 替换PHP内置服务器,用Nginx运行

php artisan serve用的是PHP单线程内置服务器,虽然方便但性能和稳定性都不如Nginx+PHP-FPM,而你的镜像已经包含Nginx了,直接用生产环境的运行方式试试:

  • 确认容器内的Nginx配置已经指向Laravel的public目录(通常镜像里已经配置好)。
  • 启动容器时直接启动Nginx和PHP-FPM:
    docker run -it --volume=$PWD:/app -w=/app -p8000:80 registry.gitlab.com/myImages/php-nginx:myLaravelApp
    
    (注意端口映射改成8000:80,因为Nginx默认监听80端口)
    这种方式更接近生产环境,也能排除内置服务器的潜在问题。

4. 排查系统防火墙/网络规则

Kubuntu的UFW防火墙可能限制了容器的网络流量,导致Laravel的内部请求超时:

  • 临时关闭UFW测试:
    sudo ufw disable
    
    如果请求速度恢复,就需要添加允许容器网络的UFW规则。
  • 试试用host网络模式启动容器,绕过Docker的bridge网络:
    docker run -it --network=host --volume=$PWD:/app -w=/app registry.gitlab.com/myImages/php-nginx:myLaravelApp php artisan serve --host=0.0.0.0
    
    (host模式下不用端口映射,直接访问localhost:8000即可)

先从DNS和挂载这两个方向入手,因为2分钟的超时太符合DNS解析失败的特征了,大概率能解决问题。

内容的提问来源于stack exchange,提问作者Mostafa Nobaqi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:37:42