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

从WordPress:php8.2-apache迁移至php8.3-fpm-alpine+Nginx的问题排查

WordPress FPM + Nginx 架构问题修复方案

场景背景

将基于library/wordpress:php8.2-apache的Docker镜像迁移至library/wordpress:php8.3-fpm-alpine + nginx:stable-alpine架构,现有Dockerfile和nginx.conf配置如上,镜像构建成功但存在两个运行问题。


问题1:Docker Exec 命令权限拒绝

症状

docker exec -it my_container bash
my_container:/# ls -l
bash: /bin/ls: Permission denied

原因分析

  • 容器运行时可能指定了非root用户执行,导致root权限被限制
  • 镜像中/bin/ls的执行权限被意外修改(概率较低)
  • 容器启用了只读根文件系统,无法执行系统命令

修复步骤

  1. 强制以root用户进入容器
    执行以下命令,明确指定root用户:
    docker exec -it -u root my_container bash
    
  2. 检查系统命令权限
    进入容器后执行stat /bin/ls,确认权限为rwxr-xr-x(所有者、组、其他用户均有执行权限)。如果权限异常,手动修复:
    chmod 755 /bin/ls
    
  3. 检查只读根文件系统设置
    运行以下命令查看容器是否启用了只读模式:
    docker inspect my_container | grep ReadonlyRootfs
    
    如果结果为true,则需要去掉--read-only启动参数,或挂载临时目录:
    docker run -d --tmpfs /run --tmpfs /tmp your-nginx-image
    
  4. 清理镜像缓存重新构建
    如果是镜像构建缓存导致的权限异常,执行:
    docker build --no-cache -t your-nginx-image .
    

问题2:Nginx FastCGI 连接失败

症状

Nginx日志显示:

2024/02/29 03:06:59 [error] 21#21: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.2, server: , request: "GET / HTTP/1.1", upstream: "fastcgi://172.18.0.13:9000", host: "myapp.mydomain.com"

核心原因

当前架构缺少独立运行的PHP-FPM容器,且Nginx容器未与PHP-FPM容器处于同一网络,同时Nginx容器内未包含完整的WordPress代码文件。

修复步骤

1. 调整Dockerfile,拆分双容器镜像

修改Dockerfile,将PHP-FPM和Nginx分别作为独立的可运行镜像:

# Stage 1: WordPress PHP-FPM 镜像
FROM library/wordpress:php8.3-fpm-alpine AS wordpress-fpm

# Install wp-cli
RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
    chmod +x wp-cli.phar && \
    mv wp-cli.phar /usr/local/bin/wp

# 替换阿里云镜像源
RUN sed -i -e 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# Install Postfix(需后续添加启动脚本确保随容器启动)
RUN apk update && \
    apk add --no-cache postfix && \
    postconf -e myhostname=mydomain.com && \
    postconf -e relayhost="mailfwd.mydomain.com"

# 配置PHP发送邮件
RUN mkdir -p /usr/local/etc/php/conf.d/ && \
    echo "sendmail_path=sendmail -t -i" >> /usr/local/etc/php/conf.d/sendmail.ini

# Install 依赖工具
RUN apk add --no-cache wget bash net-tools

# 复制主题文件
COPY default/ /var/www/html/wp-content/themes/default/

# 复制插件安装脚本
COPY wp-install-plugins.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/wp-install-plugins.sh && \
    chown www-data:www-data /usr/local/bin/wp-install-plugins.sh

# 添加启动脚本(启动Postfix和PHP-FPM)
COPY entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
CMD ["php-fpm"]

# Stage 2: Nginx 镜像
FROM nginx:stable-alpine AS nginx-server

# Install bash
RUN apk update && apk add --no-cache bash

# 确保www-data用户/组存在
RUN if ! getent group www-data >/dev/null; then addgroup -g 1000 www-data; fi
RUN adduser -D -H -u 1000 -G www-data -s /bin/bash www-data

# 复制Nginx配置
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 从PHP-FPM镜像复制完整WordPress文件
COPY --from=wordpress-fpm --chown=www-data:www-data /var/www/html /var/www/html

# 设置文件权限
RUN find /var/www/html/wp-content -type f -exec chmod 644 {} \; && \
    find /var/www/html/wp-content -type d -exec chmod 755 {} \;

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

创建entrypoint.sh脚本(用于启动Postfix和PHP-FPM):

#!/bin/sh
# 启动Postfix
postfix start
# 执行原PHP-FPM启动命令
exec "$@"

2. 使用Docker Compose管理双容器

创建docker-compose.yml,确保两个容器处于同一网络,共享代码卷:

version: '3.8'

services:
  wordpress:
    build:
      context: .
      target: wordpress-fpm
    volumes:
      - wordpress_data:/var/www/html
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    networks:
      - wp-network

  nginx:
    build:
      context: .
      target: nginx-server
    ports:
      - "80:80"
    volumes:
      - wordpress_data:/var/www/html
    networks:
      - wp-network

  db:
    image: mysql:8.0
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
    networks:
      - wp-network

volumes:
  wordpress_data:
  db_data:

networks:
  wp-network:

3. 验证配置

  • 启动容器:docker-compose up -d
  • 检查Nginx日志:docker-compose logs nginx,确认无连接拒绝错误
  • 访问应用,验证页面正常加载

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 23:25:53