这个问题很常见。使用 richarvey/nginx-php-fpm 镜像部署 WordPress 时遇到 “Access denied” 错误,通常是由以下原因造成的:
1. 权限问题(最常见)
检查并修复目录权限:
1 2 3 4 5 6 7 8 9 10 11 12 13
| ls -la /path/to/wordpress/
sudo chown -R www-data:www-data /path/to/wordpress/ sudo find /path/to/wordpress/ -type d -exec chmod 755 {} \; sudo find /path/to/wordpress/ -type f -exec chmod 644 {} \;
sudo chmod -R 775 /path/to/wordpress/wp-content/ sudo chmod 775 /path/to/wordpress/wp-content/uploads sudo chmod 775 /path/to/wordpress/wp-content/plugins sudo chmod 775 /path/to/wordpress/wp-content/themes
|
2. Docker 容器配置问题
使用正确的 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| version: '3.8'
services: web: image: richarvey/nginx-php-fpm:latest container_name: wordpress-web restart: always ports: - "80:80" - "443:443" environment: WEBROOT: /var/www/html PHP_MEMORY_LIMIT: 256M PHP_UPLOAD_MAX_FILESIZE: 64M PHP_POST_MAX_SIZE: 64M PHP_EXTENSIONS: mysqli,pdo_mysql,gd,zip,exif,mbstring volumes: - /path/to/wordpress:/var/www/html - ./nginx.conf:/etc/nginx/nginx.conf - ./sites:/etc/nginx/sites-enabled - ./php.ini:/usr/local/etc/php/conf.d/custom.ini networks: - wordpress-network
networks: wordpress-network: driver: bridge
|
3. WordPress 配置文件问题
创建 wp-config.php:
1 2 3 4 5 6 7 8 9 10 11
| cd /path/to/wordpress
cp wp-config-sample.php wp-config.php
define('DB_NAME', 'wordpress_db'); define('DB_USER', 'wordpress_user'); define('DB_PASSWORD', 'your_strong_password'); define('DB_HOST', 'mysql:3306');
|
4. 数据库连接问题
完整的 docker-compose.yml(包含 MySQL):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| version: '3.8'
services: mysql: image: mysql:5.7 container_name: wordpress-db restart: always environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: wordpress_db MYSQL_USER: wordpress_user MYSQL_PASSWORD: wordpress_password volumes: - ./mysql-data:/var/lib/mysql networks: - wordpress-network
web: image: richarvey/nginx-php-fpm:latest container_name: wordpress-web restart: always depends_on: - mysql ports: - "80:80" environment: WEBROOT: /var/www/html DB_HOST: mysql DB_NAME: wordpress_db DB_USER: wordpress_user DB_PASSWORD: wordpress_password PHP_MEMORY_LIMIT: 256M PHP_UPLOAD_MAX_FILESIZE: 64M PHP_EXTENSIONS: mysqli,pdo_mysql,gd,zip,mbstring,exif volumes: - ./wordpress:/var/www/html - ./wordpress.conf:/etc/nginx/sites-enabled/default.conf networks: - wordpress-network
networks: wordpress-network: driver: bridge
|
5. Nginx 配置问题
创建自定义 Nginx 配置 wordpress.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| server { listen 80; server_name localhost; root /var/www/html; index index.php index.html index.htm;
location / { try_files $uri $uri/ /index.php?$args; }
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_read_timeout 300; }
location ~ /\.ht { deny all; }
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires max; log_not_found off; } }
|
6. 排查步骤
步骤1:检查容器日志
1 2 3 4 5 6 7 8
| docker logs wordpress-web
docker exec wordpress-web tail -f /var/log/php7.4-fpm.log
docker exec wordpress-web tail -f /var/log/nginx/error.log
|
步骤2:进入容器检查
1 2 3 4 5 6 7 8 9 10 11 12
| docker exec -it wordpress-web bash
ls -la /var/www/html/
php -i | grep error_log
echo "<?php phpinfo(); ?>" > /var/www/html/test.php
|
步骤3:检查 WordPress 安装
1 2 3 4 5 6 7
| docker exec wordpress-web chown -R www-data:www-data /var/www/html docker exec wordpress-web chmod -R 755 /var/www/html docker exec wordpress-web chmod -R 775 /var/www/html/wp-content
docker-compose restart web
|
7. 快速解决方案
如果急用,可以尝试这个简化的 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| version: '3.8'
services: wordpress: image: richarvey/nginx-php-fpm:latest ports: - "8080:80" environment: WEBROOT: /var/www/html PHP_EXTENSIONS: mysqli,pdo_mysql,gd volumes: - ./wordpress:/var/www/html command: > sh -c " chown -R www-data:www-data /var/www/html && chmod -R 775 /var/www/html/wp-content && /start.sh "
|
8. 常见错误及解决
错误1:PHP 缺少扩展
1 2
| PHP_EXTENSIONS: mysqli,pdo_mysql,gd,zip,mbstring,exif
|
错误2:内存不足
错误3:上传文件大小限制
1 2
| PHP_UPLOAD_MAX_FILESIZE: 64M PHP_POST_MAX_SIZE: 64M
|
最终建议:
- 先检查权限:90% 的 “Access denied” 是权限问题
- 查看日志:使用
docker logs 查看详细错误信息
- 简化配置:先用最简单配置测试,逐步添加功能
- 确保数据库可访问:WordPress 需要正确配置数据库连接
如果还有问题,请提供:
docker logs wordpress-web 的输出
- WordPress 目录的权限信息:
ls -la /path/to/wordpress/
- 访问时浏览器的完整错误信息
时间: 2026-01-17T00:59:38
👤 用户
2026-01-16 16:29:26+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.44-1.el7 started.
2026-01-16 16:29:26+00:00 [Note] [Entrypoint]: Switching to dedicated user ‘mysql’
2026-01-16 16:29:26+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.44-1.el7 started.
2026-01-16 16:29:26+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.8smV2ODZso
mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 13 - Permission denied)
mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
时间: 2026-01-17T00:30:00
🤖 DeepSeek (deepseek-chat)
这个错误表明MySQL容器在启动时遇到了权限问题。具体来说,MySQL进程无法读取 /etc/mysql/conf.d/ 目录。
可能的原因和解决方案:
1. 目录权限问题(最常见)
1 2 3 4 5 6 7 8 9 10
| sudo chown -R mysql:mysql /etc/mysql/conf.d/ sudo chmod 755 /etc/mysql/conf.d/
docker run -d \ --name mysql \ -v /path/to/conf.d:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=your_password \ mysql:5.7
|
2. SELinux/AppArmor问题(如果是RHEL/CentOS系统)
1 2 3 4 5
| sudo setenforce 0
sudo chcon -Rt svirt_sandbox_file_t /etc/mysql/conf.d/
|
3. Docker特定解决方案
方案A:在Dockerfile中预先设置权限
1 2 3
| FROM mysql:5.7 RUN mkdir -p /etc/mysql/conf.d && \ chown -R mysql:mysql /etc/mysql/conf.d
|
方案B:使用docker-compose
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| version: '3.8' services: mysql: image: mysql:5.7 container_name: mysql environment: MYSQL_ROOT_PASSWORD: your_password volumes: - ./conf.d:/etc/mysql/conf.d command: > sh -c " chown -R mysql:mysql /etc/mysql/conf.d && exec docker-entrypoint.sh mysqld "
|
方案C:启动脚本解决方案
创建一个启动脚本 init.sh:
1 2 3
| #!/bin/bash chown -R mysql:mysql /etc/mysql/conf.d exec docker-entrypoint.sh mysqld
|
4. 快速测试方案
1 2 3 4 5
| docker run -d \ --name mysql-test \ --user root \ mysql:5.7
|
5. 检查现有容器
1 2 3 4 5 6 7 8
| docker exec -it mysql_container_name bash ls -la /etc/mysql/ ls -la /etc/mysql/conf.d/
chown -R mysql:mysql /etc/mysql/conf.d chmod 755 /etc/mysql/conf.d
|
6. 使用正确的挂载方式
确保挂载的目录在宿主机上存在且有正确权限:
1 2 3 4 5 6 7
| sudo mkdir -p /path/to/conf.d sudo chown -R 999:999 /path/to/conf.d sudo chmod 755 /path/to/conf.d
docker run -v /path/to/conf.d:/etc/mysql/conf.d mysql:5.7
|
建议的排查步骤:
- 首先检查挂载目录的权限
- 查看SELinux状态:
sestatus
- 检查容器内用户:
docker exec mysql id
- 查看MySQL错误日志获取更多信息
最可能的原因是挂载到 /etc/mysql/conf.d/ 的宿主机目录权限不足,需要确保MySQL用户(UID通常是999)有读取权限。
时间: 2026-01-17T00:30:00
👤 用户
-v /root/docker/mysql/conf:/etc/mysql/conf.d -v /root/docker/mysql/logs:/logs -v /root/docker/mysql/data:/var/lib/mysql
时间: 2026-01-17T00:31:25
🤖 DeepSeek (deepseek-chat)
问题就出在挂载目录的权限上!/root/docker/mysql/conf 目录的权限很可能只允许root用户访问,而容器内的MySQL用户(UID通常是999)无法读取。
解决方案:
方案1:修改宿主机目录权限(推荐)
1 2 3 4 5 6 7 8 9 10 11 12
| sudo mkdir -p /root/docker/mysql/{conf,logs,data}
sudo chmod -R 755 /root/docker/mysql/conf sudo chmod -R 777 /root/docker/mysql/logs sudo chmod -R 755 /root/docker/mysql/data
sudo chown -R 999:999 /root/docker/mysql/conf sudo chown -R 999:999 /root/docker/mysql/logs sudo chown -R 999:999 /root/docker/mysql/data
|
方案2:使用更合适的路径(最佳实践)
不建议使用 /root 目录,建议使用 /opt 或 /var/lib:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| sudo mkdir -p /opt/docker/mysql/{conf,logs,data}
sudo chmod -R 755 /opt/docker/mysql sudo chown -R $USER:$USER /opt/docker/mysql
docker run -d \ --name mysql \ -v /opt/docker/mysql/conf:/etc/mysql/conf.d \ -v /opt/docker/mysql/logs:/logs \ -v /opt/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=your_password \ mysql:5.7
|
方案3:使用docker-compose(简化管理)
创建 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| version: '3.8'
services: mysql: image: mysql:5.7 container_name: mysql restart: always environment: MYSQL_ROOT_PASSWORD: your_password TZ: Asia/Shanghai ports: - "3306:3306" volumes: - ./mysql/conf:/etc/mysql/conf.d - ./mysql/logs:/logs - ./mysql/data:/var/lib/mysql command: > sh -c " chown -R mysql:mysql /etc/mysql/conf.d && exec docker-entrypoint.sh mysqld "
|
然后执行:
1 2 3 4 5
| mkdir -p mysql/{conf,logs,data}
docker-compose up -d
|
方案4:初始化脚本方案
创建一个初始化脚本,在启动前设置权限:
init-mysql.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #!/bin/bash
mkdir -p /root/docker/mysql/{conf,logs,data}
chmod 755 /root/docker/mysql/conf chmod 777 /root/docker/mysql/logs chmod 755 /root/docker/mysql/data
if [ ! -f "/root/docker/mysql/conf/my.cnf" ]; then echo "[mysqld]" > /root/docker/mysql/conf/my.cnf echo "character-set-server=utf8mb4" >> /root/docker/mysql/conf/my.cnf fi
docker run -d \ --name mysql \ -v /root/docker/mysql/conf:/etc/mysql/conf.d \ -v /root/docker/mysql/logs:/logs \ -v /root/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=your_password \ -p 3306:3306 \ mysql:5.7
|
方案5:快速测试(临时方案)
1 2 3 4 5 6 7 8 9 10 11 12
| sudo chmod -R 777 /root/docker/mysql
docker run -d \ --name mysql \ -v /root/docker/mysql/conf:/etc/mysql/conf.d \ -v /root/docker/mysql/logs:/logs \ -v /root/docker/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=your_password \ -p 3306:3306 \ mysql:5.7
|
验证步骤:
检查当前权限:
1
| ls -la /root/docker/mysql/
|
测试容器启动:
1 2 3 4 5 6
| docker stop mysql && docker rm mysql
sudo chmod 755 /root/docker/mysql/conf docker run --rm -v /root/docker/mysql/conf:/etc/mysql/conf.d mysql:5.7 --verbose --help
|
根本原因分析:
/root 目录默认权限是 700(只有root可访问)
- Docker容器内的MySQL用户(UID 999)不是root,无法读取
/root 下的文件
- 需要确保挂载的目录对容器内进程有适当的读取权限
建议使用方案2,将数据移到 /opt 或 /var/lib 下,避免权限问题,也符合Linux目录结构规范。
时间: 2026-01-17T00:31:25
👤 用户
当我使用richarvey/nginx-php-fpm/安装了web环境,并在var/www/html映射目录中放入wordpress,准备运行安装却发现Access denied.
时间: 2026-01-17T00:59:38
🤖 DeepSeek (deepseek-chat)
这个问题很常见。使用 richarvey/nginx-php-fpm 镜像部署 WordPress 时遇到 “Access denied” 错误,通常是由以下原因造成的:
1. 权限问题(最常见)
检查并修复目录权限:
1 2 3 4 5 6 7 8 9 10 11 12 13
| ls -la /path/to/wordpress/
sudo chown -R www-data:www-data /path/to/wordpress/ sudo find /path/to/wordpress/ -type d -exec chmod 755 {} \; sudo find /path/to/wordpress/ -type f -exec chmod 644 {} \;
sudo chmod -R 775 /path/to/wordpress/wp-content/ sudo chmod 775 /path/to/wordpress/wp-content/uploads sudo chmod 775 /path/to/wordpress/wp-content/plugins sudo chmod 775 /path/to/wordpress/wp-content/themes
|
2. Docker 容器配置问题
使用正确的 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| version: '3.8'
services: web: image: richarvey/nginx-php-fpm:latest container_name: wordpress-web restart: always ports: - "80:80" - "443:443" environment: WEBROOT: /var/www/html PHP_MEMORY_LIMIT: 256M PHP_UPLOAD_MAX_FILESIZE: 64M PHP_POST_MAX_SIZE: 64M PHP_EXTENSIONS: mysqli,pdo_mysql,gd,zip,exif,mbstring volumes: - /path/to/wordpress:/var/www/html - ./nginx.conf:/etc/nginx/nginx.conf - ./sites:/etc/nginx/sites-enabled - ./php.ini:/usr/local/etc/php/conf.d/custom.ini networks: - wordpress-network
networks: wordpress-network: driver: bridge
|
3. WordPress 配置文件问题
创建 wp-config.php:
1 2 3 4 5 6 7 8 9 10 11
| cd /path/to/wordpress
cp wp-config-sample.php wp-config.php
define('DB_NAME', 'wordpress_db'); define('DB_USER', 'wordpress_user'); define('DB_PASSWORD', 'your_strong_password'); define('DB_HOST', 'mysql:3306');
|
4. 数据库连接问题
完整的 docker-compose.yml(包含 MySQL):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| version: '3.8'
services: mysql: image: mysql:5.7 container_name: wordpress-db restart: always environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: wordpress_db MYSQL_USER: wordpress_user MYSQL_PASSWORD: wordpress_password volumes: - ./mysql-data:/var/lib/mysql networks: - wordpress-network
web: image: richarvey/nginx-php-fpm:latest container_name: wordpress-web restart: always depends_on: - mysql ports: - "80:80" environment: WEBROOT: /var/www/html DB_HOST: mysql DB_NAME: wordpress_db DB_USER: wordpress_user DB_PASSWORD: wordpress_password PHP_MEMORY_LIMIT: 256M PHP_UPLOAD_MAX_FILESIZE: 64M PHP_EXTENSIONS: mysqli,pdo_mysql,gd,zip,mbstring,exif volumes: - ./wordpress:/var/www/html - ./wordpress.conf:/etc/nginx/sites-enabled/default.conf networks: - wordpress-network
networks: wordpress-network: driver: bridge
|
5. Nginx 配置问题
创建自定义 Nginx 配置 wordpress.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| server { listen 80; server_name localhost; root /var/www/html; index index.php index.html index.htm;
location / { try_files $uri $uri/ /index.php?$args; }
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_read_timeout 300; }
location ~ /\.ht { deny all; }
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires max; log_not_found off; } }
|
6. 排查步骤
步骤1:检查容器日志
1 2 3 4 5 6 7 8
| docker logs wordpress-web
docker exec wordpress-web tail -f /var/log/php7.4-fpm.log
docker exec wordpress-web tail -f /var/log/nginx/error.log
|
步骤2:进入容器检查
1 2 3 4 5 6 7 8 9 10 11 12
| docker exec -it wordpress-web bash
ls -la /var/www/html/
php -i | grep error_log
echo "<?php phpinfo(); ?>" > /var/www/html/test.php
|
步骤3:检查 WordPress 安装
1 2 3 4 5 6 7
| docker exec wordpress-web chown -R www-data:www-data /var/www/html docker exec wordpress-web chmod -R 755 /var/www/html docker exec wordpress-web chmod -R 775 /var/www/html/wp-content
docker-compose restart web
|
7. 快速解决方案
如果急用,可以尝试这个简化的 docker-compose.yml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| version: '3.8'
services: wordpress: image: richarvey/nginx-php-fpm:latest ports: - "8080:80" environment: WEBROOT: /var/www/html PHP_EXTENSIONS: mysqli,pdo_mysql,gd volumes: - ./wordpress:/var/www/html command: > sh -c " chown -R www-data:www-data /var/www/html && chmod -R 775 /var/www/html/wp-content && /start.sh "
|
8. 常见错误及解决
错误1:PHP 缺少扩展
1 2
| PHP_EXTENSIONS: mysqli,pdo_mysql,gd,zip,mbstring,exif
|
错误2:内存不足
错误3:上传文件大小限制
1 2
| PHP_UPLOAD_MAX_FILESIZE: 64M PHP_POST_MAX_SIZE: 64M
|
最终建议:
- 先检查权限:90% 的 “Access denied” 是权限问题
- 查看日志:使用
docker logs 查看详细错误信息
- 简化配置:先用最简单配置测试,逐步添加功能
- 确保数据库可访问:WordPress 需要正确配置数据库连接
如果还有问题,请提供:
docker logs wordpress-web 的输出
- WordPress 目录的权限信息:
ls -la /path/to/wordpress/
- 访问时浏览器的完整错误信息
时间: 2026-01-17T00:59:38
对话统计