【问题标题】:Dockerized app is very slow and doesn't load well cssDockerized 应用程序非常慢并且不能很好地加载 css
【发布时间】:2018-09-12 21:51:57
【问题描述】:

我已经 dockerized 我的 laravel 应用程序,这里是 docker-compose:

version: '3'
services:
  app:
    image: xoco/kendozone:local-1.0.0
    ports:
      - "80:80"

还有 Dockerfile:

FROM php:7.1.14-fpm
LABEL maintainer="contact@kendozone.com"
LABEL version="1.0.0"
LABEL description="Kendozone is a online tournament webapp coded with PHP / Laravel"

ENV node_version 8.4.0
ENV npm_version 5.7.1
ENV NVM_DIR /.nvm
ENV APP_DIR="/var/www"
ENV APP_PORT="80"

RUN echo "deb http://ftp.de.debian.org/debian stretch main " >> /etc/apt/sources.list \
&& apt-get update -y && apt-get install -y openssl zip unzip git automake \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
        libmagickwand-dev vim --no-install-recommends \
&& apt-get remove -y libgnutls-deb0-28 \
&& apt-get purge --auto-remove -y g++ \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install pdo pdo_mysql mbstring zip -j$(nproc) iconv mcrypt -j$(nproc) gd

WORKDIR $APP_DIR
COPY . $APP_DIR

RUN mkdir -p $APP_DIR/resources/assets/less/_main_full \
&& touch $APP_DIR/resources/assets/less/_main_full/main.less \
&& touch $APP_DIR/sqlite.db \
&& mv .env.local .env \
&& chown -R www-data:www-data $APP_DIR

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

RUN composer install --no-interaction

RUN mkdir -p $NVM_DIR && chown -R www-data:www-data $NVM_DIR
RUN  curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash \
&& [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" \
&& nvm install ${node_version}

ENV NODE_PATH $NVM_DIR/v$node_version/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$node_version/bin:$PATH

RUN npm install
RUN npm run production
RUN php artisan key:generate
RUN php artisan migrate --seed 
CMD php artisan serve --host=0.0.0.0 --port=$APP_PORT

事情是应用程序在点击时响应:

http://127.0.0.1但是加载登录界面需要2分钟多,css显示不好。

但是当我使用 chrome 调试器检查请求时,所有请求都给出 200 响应,这很棒,我可以点击所有链接,这意味着 css 和 js 都解决了,没有任何问题。

为什么会这样?

编辑:在我的 Mac 上,页面加载很正常,但在 CentOs 中,它很长。

【问题讨论】:

  • 我认为这超出了 SO 的范围。
  • 为什么超出范围?我成功 dockerize 应用程序,但 docker 的行为很奇怪

标签: laravel docker npm


【解决方案1】:

使用 Chrome 调试器检查请求,我注意到 TTFB 长得令人难以置信。在我的电脑上是 17.14 秒。后续请求相对较快。

TTFB 代表第一个字节的时间。较高的TTFB 表示服务器端存在错误或不当行为。

第一次请求后,我执行了docker diff命令,发现容器有如下变化:

$ docker diff xxx
C /root
C /var/www/database
C /var/www/database/sqlite.db
C /var/www/storage/framework/views
A /var/www/storage/framework/views/3d3947126b3224667121e9703252617b7f23f88b.php
A /var/www/storage/framework/views/62a19b65f14428bd14bd13be0dce90ea16887a78.php
A /var/www/storage/framework/views/7a212b1361bf8a55442817d40915d62cab0878dd.php
A /var/www/storage/framework/views/beafc1ea6ba3b1c45604098b20ce357eac86e9d6.php
A /var/www/storage/framework/views/d58ea65ce5486bc3c5f9d4623e2e3952bb1efc51.php
A /var/www/storage/framework/views/e1754d32beb46c021e4c4c924ed9b0d38d671fb4.php
A /var/www/storage/framework/views/f0565996f52733a0597399e7a8c558ebf88e6a9e.php

这意味着第一个请求会导致服务器端处理一些繁重的工作(更改 sqlite.db 并创建一些 PHP 文件)。这些更改被缓存,因此后续请求相对更快。

我的猜测是这个问题是由处理登录页面的视图函数引起的。但我不能 100% 确定,因为我没有在请求期间跟踪应用程序的 CPU 使用情况。

希望能有所帮助。

【讨论】:

  • 关于diff,我觉得很正常,sqlite.db:在db中添加了一个session。 storage/framework/views/... 视图在这里构建,登录页面由几个视图组成,因此匹配。但是一点都不重,而且在没有docker的本地,即使是第一次运行,也快得多,这就是奥秘……
  • 你看到 css 样式了吗?你的操作系统是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多