【问题标题】:Docker Wordpress super slowDocker Wordpress 超级慢
【发布时间】:2021-11-20 09:07:31
【问题描述】:

我在 Docker 中运行 Wordpress,用于本地开发,而且速度非常慢。我的 docker-compose.yml 看起来像这样:

version: '3.3'

services:
  db:
    image: mysql:5.7
    volumes:
      - ./db_data:/var/lib/mysql
      - ./dbconfig.cnf:/etc/mysql/conf.d/custom.cnf
    restart: always
    ports:
      - "3308:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: wp_database
      MYSQL_USER: db_user
      MYSQL_PASSWORD: some_secure_password

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "80:80"
      - "443:443"
    restart: always
    volumes:
      - ./wp-content:/var/www/html/wp-content
      - ./.htaccess:/var/www/html/.htaccess
      - ./wp-config.php:/var/www/html/wp-config.php
      - ./logs/debug.log:/var/www/html/wp-content/debug.log
volumes:
  db_data: {}
  wp_content: {}

据我在线阅读,这可能是我安装 wp-content 卷的原因,这会导致页面加载速度超慢(加载每个文件需要半秒钟,例如 jquery 文件,它必须为一个页面加载大量文件)。

有解决办法吗?我阅读了有关 NFS 的信息,但是使用 docker-compose 配置 NFS 对我来说不起作用,不知何故我不断收到“权限错误”。另一方面,macOS 的 Docker 界面已经向我显示了一个“共享文件夹”选项卡,但我不知道我现在是在使用这些共享文件夹还是只是重新挂载它们。

感谢任何帮助。

【问题讨论】:

    标签: wordpress macos performance docker


    【解决方案1】:

    TL;DR 挂载到容器上的临时文件夹,将该文件夹与 Bindfs 同步到公共服务器文件夹。 使用直接挂载服务 WP 站点很慢,因为容器必须一个一个地访问主机文件,这是一个繁重的过程。从公用文件夹提供服务,而文件直接属于容器的一部分,速度要快得多。

    我在 Docker Compose 开发中遇到了与本地 WordPress 完全相同的问题。不管你的电脑有多快,在容器中挂载文件夹时它仍然会很慢。

    我还尝试了诸如 NFS 之类的解决方案和其他建议,例如在防病毒软件中正确排除项目、添加 .dockerignore 等,这充其量只能稍微提高性能。

    在浏览类似的速度改进时,我在 WordPress Starter 存储库 https://github.com/visiblevc/wordpress-starter/blob/master/Dockerfile 中发现了这个 Dockerfile。 如果您查看此文件,您会发现他们在容器中初始化和挂载项目的方式不是直接挂载到 /var/www/html/,而是挂载到临时文件夹。然后他们通过 bindfs 将此临时文件夹同步到 /var/www/html/。这样,每次您在浏览器中加载 WordPress 页面时,速度都会非常快,因为它不必在每次请求时访问和读取主机文件。 WordPress 文件是 Linux 容器的一部分。当您对代码进行更改时,这些更改将反映在容器临时文件夹中,并且 bindfs 会立即将这些更改同步到公共容器文件夹,反之亦然。对公用文件夹所做的所有更改都将同步到临时文件夹,并从那里同步到您的主机项目文件。

    【讨论】:

    • 我在你建议的 Dockerfile 中看不到这是在哪里完成的。
    • 那将是 404
    • 你只需要及时回到发布日期前后找到repo即可找到@ArmanShahinyan建议的dockerfile:github.com/visiblevc/wordpress-starter/blob/…
    • 感谢您朝正确的方向发展。但我没有使用 bindfs,因为它不是那么流行,我尽量避免来自未知来源的太多依赖。但是我发现了一个具有类似功能且语法非常简单的程序:lsyncd --rsync /source/path /target/path。虽然不是双向的。 github.com/axkibe/lsyncd
    • 通常 TL;DR 会在您帖子的顶部,而不是底部。如果有人通读了您的整个帖子然后遇到了 TL;DR 部分,这并没有太大帮助。那时他们已经阅读了所有内容,不再需要 TL;DR 部分。
    【解决方案2】:

    在 Mac 和 Windows 中,我们应该考虑一些 volumes performance issues

    我更改了我的docker-compose.yml

    请注意,我更改了 short syntax to long syntax

    此表示法允许添加consistency option

    我添加了wp-contentphp-conf(用于获取 php.ini),因为它们是每次在浏览器中加载 Wordpress 页面时最常调用的文件目录。

    services:
        wordpress:
    
            ...
    
            volumes:
                - ./data:/data
                - ./scripts:/docker-entrypoint-initwp.d
                #- ./wp-content:/app/wp-content
                - type: bind
                  source: ./wp-content
                  target: /app/wp-content
                  consistency: cached
                #- ./php-conf:/usr/local/etc/php
                - type: bind
                  source: ./php-conf
                  target: /usr/local/etc/php
                  consistency: cached
    

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,但可能已经找到了解决方案。

      在 docker 桌面应用中(随着时间的推移,看起来像鲸鱼)

      打开设置 选择资源\文件共享

      添加相关文件夹。我在同一个父文件夹中有 MySQL 和 Wordpress 文件夹,所以添加了。

      单击应用并重新启动。

      我的网站大大加快了速度。

      我希望这会有所帮助。

      【讨论】:

      • 根本没有帮助:(在我的情况下,加载时间与以前完全相同。您能否分享一些您的 docker-compose.yml 和/或 Dockerfile 的屏幕截图或代码 sn-ps?
      【解决方案4】:

      我意识到,如果您缩小 Docker 运行站点时必须查看的目录,它的运行速度会更快。例如,在 Docker 桌面设置中,/Users 在设置 > 资源 > 文件共享中是默认设置。如果您删除该资源并将其缩小到您的站点所在的目录,这将为 Docker 节省大量开销。

      【讨论】:

        【解决方案5】:

        注意:我在 OS X 上。我尝试增加分配给 Docker 的 RAM 和 CPU,还包括文件夹作为资源,但速度仍然很慢。

        我尽可能地改进了 docker,我所做的最大的帮助是:

        1. 我必须确保没有将任何额外文件加载到容器中。在我的项目中,出于某种原因,有人想将当前的$PWD 加载到容器中。删除有很大帮助

        2. 我在 mysql 卷中添加了一个 :delegated 标志。为什么用这个而不是:cached 好吧,我是在本地开发的,所以我不希望缓存文件,这会导致我重新加载页面以尝试获取最新的更改。

        然后,在这些改进之后,我的页面加载时间约为 1-3 分钟。几周过去了,我想到了关闭所有涉及读取或写入数据库的不必要的 wordpress 功能,例如编辑时自动保存、wp-cron;这对于生产来说是很好的功能,但是在开发时我怀疑它们做得太多并导致页面加载过长。这是我只在本地开发时使用的 wp-config.php 文件中的内容:

        define( 'AUTOSAVE_INTERVAL', 60*60*60*24*365 ); // Set autosave interval to 1x per year
        define( 'EMPTY_TRASH_DAYS',  0 ); // Empty trash now: Zero days
        define( 'WP_POST_REVISIONS', false );
        define( 'DISABLE_WP_CRON', true ); // sends an XHR request with timestamp to server on every page load which queries db for posts that may need to be published and does so; :gross:
        

        我希望这对某人有所帮助。恕我直言,我不应该这样做,因为我可以用 wordpress 运行 MAMP/LAMP 堆栈就好了。我不知道为什么 docker 和 wordpress 在我的操作系统和 Docker Desktop 上表现如此糟糕

        【讨论】:

          猜你喜欢
          • 2017-03-27
          • 2015-07-26
          • 2020-04-24
          • 1970-01-01
          • 1970-01-01
          • 2021-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多