You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker Compose部署自定义WordPress:Nginx/PHP-FPM无法稳定运行

解决Docker Compose部署自定义WordPress时Nginx与PHP-FPM的稳定性问题

嘿,我之前处理过好几个类似的自定义WordPress Docker部署场景,你的问题大概率是路径映射不准确、配置未持久化,或者服务启动顺序冲突导致的。咱们一步步拆解,彻底解决这个重启后要反复调配置的麻烦:

1. 先把Docker Compose的挂载配置拉到位

首先要确保Nginx、PHP-FPM的关键目录都是持久化挂载的,而且容器内的路径完全一致——这是稳定运行的基础。给你一个经过验证的配置模板,你可以对照调整:

version: '3.8'
services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      # 把Nginx的站点配置目录挂载到宿主机,修改后不会随容器重启丢失
      - ./nginx/conf.d:/etc/nginx/conf.d
      # WordPress核心目录挂载到容器内的/wp路径
      - ./wp:/var/www/html/wp
      # 独立的wp-content目录单独挂载
      - ./wp-content:/var/www/html/wp-content
    depends_on:
      - php-fpm
    # 确保Docker/电脑重启后容器自动拉起
    restart: always

  php-fpm:
    image: php:8.2-fpm-alpine
    volumes:
      # 和Nginx保持完全一致的路径挂载,避免PHP找不到文件
      - ./wp:/var/www/html/wp
      - ./wp-content:/var/www/html/wp-content
    restart: always

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: wordpress_db
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_user_pass
    volumes:
      # 持久化MySQL数据,避免重启丢失
      - mysql_data:/var/lib/mysql
    restart: always

volumes:
  mysql_data:

这里要划重点:

  • 所有服务都加restart: always,杜绝Docker重启后容器不启动的问题
  • Nginx的conf.d目录必须挂载到宿主机,不然你每次调整的配置都会随容器销毁丢失
  • Nginx和PHP-FPM的wp、wp-content挂载路径必须完全相同,不然PHP-FPM会找不到WordPress的核心文件

2. 修正Nginx配置(最关键的一步!)

因为你的WordPress在wp子目录,wp-content又独立出来,Nginx的location规则必须同时覆盖这两个目录的静态文件和PHP解析需求。把下面的配置保存到宿主机的./nginx/conf.d/wp.conf里:

server {
    listen 80;
    # 换成你的域名或者localhost
    server_name your-domain.local;

    # 根目录设为wp的上级目录,这样才能同时覆盖wp和wp-content两个子目录
    root /var/www/html;
    index index.php index.html;

    # 处理wp-content的静态文件,直接返回,提升性能
    location /wp-content/ {
        alias /var/www/html/wp-content/;
        expires 30d;
        access_log off;
    }

    # 处理WordPress核心的静态文件和伪静态规则
    location /wp/ {
        alias /var/www/html/wp/;
        try_files $uri $uri/ /wp/index.php?$args;
    }

    # 所有PHP请求转发给PHP-FPM处理
    location ~ \.php$ {
        # 先检查文件是否存在,避免伪静态导致的404错误
        try_files $uri =404;
        # 这里的php-fpm是Docker Compose里的服务名,自动解析容器IP
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        # 必须准确映射容器内的真实文件路径
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 可选:把根目录请求直接跳转到wp子目录
    location = / {
        return 301 /wp/;
    }
}

这里的核心注意点:

  • alias而不是root来处理wp-content目录,因为它和wp目录是平级的,不是子目录关系
  • SCRIPT_FILENAME参数必须准确,不然PHP-FPM无法正确解析WordPress的PHP文件
  • 伪静态规则try_files要确保wp目录下的所有请求都能正确转发到index.php

3. 解决重启后服务连接失败的问题

你之前每次重启都要调配置,可能还有一个原因:Nginx在PHP-FPM完全启动前就加载了配置,导致连接PHP-FPM失败。咱们给Nginx加个启动前的等待脚本,确保PHP-FPM就绪后再启动Nginx:

修改Docker Compose里的Nginx服务,替换command字段:

nginx:
  # ... 其他配置不变
  command: ["/bin/sh", "-c", "while ! nc -z php-fpm 9000; do sleep 1; done; nginx -g 'daemon off;'"]

这个命令会让Nginx启动前先检查PHP-FPM的9000端口是否能连通,直到PHP-FPM完全就绪后再启动Nginx,彻底解决启动顺序导致的连接问题。

4. 验证与测试

做完上面的修改后,执行以下命令重启服务:

# 先停止并删除旧容器
docker-compose down
# 后台启动服务
docker-compose up -d

然后做这几个验证:

  1. 访问http://localhost/wp,确认WordPress能正常加载
  2. 重启Docker或者你的电脑,再次访问站点,确认不需要调整配置就能正常运行
  3. 查看容器日志,确认没有报错:
docker-compose logs nginx
docker-compose logs php-fpm

如果日志里没有出现“connection refused”或者“file not found”的错误,说明配置已经稳定了。

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

火山引擎 最新活动