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

Docker Compose部署WordPress首次响应缓慢问题求助

问题描述

在VPS上通过Docker搭建架构,使用NGINX Proxy Manager(NPM)处理请求,通过docker-compose运行5-6个非电商类简单站点。遇到的问题是:站点长时间闲置后会进入类似休眠状态,首次加载耗时极长,但后续在任意设备或网络下加载均正常。以下是现有配置文件,需求如下:

  • 给出针对性优化方案
  • 说明是否可配置让Docker使用主机全部资源
  • 判断是否需要配置健康检查

现有配置文件

WordPress站点docker-compose.yaml

version: "3.9"
services:
  db:
    image: mariadb:latest
    volumes:
    - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: arootpassword
      MYSQL_DATABASE: sitedb
      MYSQL_USER: asiteuser
      MYSQL_PASSWORD: asitepassword
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 300M
        reservations:
          cpus: '0.25'
          memory: 128M
    networks:
      - backend

  redis:
    image: 'redis:alpine'
    restart: always
    networks:
      - backend

  wordpress-site:
    depends_on:
    - db
    image: wordpress:php8.2-apache
    volumes:
    - wordpress_data:/var/www/html
    expose:
    - "80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: asiteuser
      WORDPRESS_DB_PASSWORD: asitepassword
      WORDPRESS_DB_NAME: sitedb
    deploy:
      resources:
        limits:
          memory: 800M
        reservations:
          memory: 128M
    networks:
      - nginx-proxy
      - backend

volumes:
  db_data: {}
  wordpress_data: {}

networks:
  nginx-proxy:
    name: nginx-proxy
    external: true
  backend:
    external: false

NPM的docker-compose.yaml

version: '3.8'
services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      # - '81:81'
      - '443:443'
    expose:
      - '81'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 200M
        reservations:
          cpus: '0.25'
          memory: 128M
networks:
  default:
    name: nginx-proxy
    external: true

解决方案与优化建议

一、针对闲置休眠的核心优化方案

1. 放宽或移除容器资源限制

现有配置给容器设置了严格的CPU/内存限制,VPS系统在闲置时会优先回收这类受限容器的资源,导致首次请求需要重新分配资源,加载变慢。

  • 操作:直接删除每个容器下的deploy.resources块,或者根据VPS总资源(比如4核8G)设置宽松限制,例如给WordPress容器设cpus: '2'、memory: 2G,数据库设cpus: '1'、memory: 1G,总资源占用控制在主机的80%以内,留余量给系统进程。

2. 添加健康检查探针

通过定期发送请求,让容器保持活跃,避免系统回收资源。同时能自动重启故障容器,提升可用性。

  • WordPress容器添加健康检查:
wordpress-site:
  # ... 其他配置不变
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost"]
    interval: 5m30s  # 每5分30秒检查一次
    timeout: 10s
    retries: 3
    start_period: 40s  # 容器启动后40秒再开始检查
  • MariaDB容器添加健康检查:
db:
  # ... 其他配置不变
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-parootpassword"]
    interval: 5m
    timeout: 10s
    retries: 3
  • NPM容器添加健康检查:
npm:
  # ... 其他配置不变
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:81"]
    interval: 5m
    timeout: 10s
    retries: 3

3. 优化WordPress缓存

已经部署了Redis,要确保WordPress正确配置Redis作为对象缓存,减少数据库查询次数。另外安装页面缓存插件(如WP Super Cache),生成静态HTML文件直接返回,避免每次请求触发PHP和数据库操作。

4. 调整VPS系统参数

禁用或降低内存交换(swap)的优先级,避免系统把容器内存换出到磁盘,导致唤醒慢:

  • 临时生效:sysctl vm.swappiness=10
  • 永久生效:编辑/etc/sysctl.conf,添加vm.swappiness=10,然后执行sysctl -p

5. NPM配置静态资源缓存

在NPM的站点配置中,给CSS、JS、图片等静态文件设置较长的缓存过期时间(比如30天),让浏览器和NPM本身缓存这些资源,减少对后端容器的请求。

二、是否可让Docker使用主机全部资源?

可以,但不建议无限制放开。

  • 取消资源限制的方法:删除所有容器的deploy.resources块,Docker会默认允许容器使用主机剩余的全部资源。
  • 更合理的做法:根据VPS总资源分配宽松限制,避免单个容器耗尽资源影响其他站点。比如VPS有4核8G,给每个WordPress容器分配2核2G,数据库1核1G,总占用控制在主机资源的80%左右,留余量给系统和其他进程。

三、是否需要配置健康检查?

非常需要,作用有两个:

  1. 防止闲置休眠:定期的检查请求会让容器保持活跃,避免系统回收资源导致首次加载慢。
  2. 自动故障恢复:如果容器进程崩溃或服务异常,Docker会根据健康检查结果自动重启容器,保证站点可用性。
  • 注意:检查间隔不要太频繁(比如每分钟一次)会增加资源消耗,也不要太长(超过10分钟)起不到防休眠作用,建议5-10分钟一次。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:53:14