踩了大坑:wordpress后台 无法将上传的文件移动至wp-content

一、问题描述

今天迁移了wordpress站点至新服务器,结果上传图片出现"无法将上传的文件移动至wp-content/uploads"的提示,这是怎么回事,为什么会这样。

报错如下:

复制代码
2023/02/20 08:57:48 [error] 9861#9861: *79624 FastCGI sent in stderr: "PHP message: PHP Warning:  file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in /usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71

PHP message: PHP Warning:  file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in 
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71

PHP message: PHP Warning:  file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in 
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71

PHP message: PHP Warning:  file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in 
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71

PHP message: PHP Warning:  file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in 
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor/rosell-dk/webp-convert/src/Convert/Converters/BaseTraits/DestinationPreparationTrait.php on line 71

PHP message: PHP Warning:  file_put_contents(/usr/share/nginx/html/wordpress/wp-content/uploads/wpo/images/wpo_logo_small.png.webp): failed to open stream: Permission denied in 
/usr/share/nginx/html/wordpress/wp-content/plugins/wp-optimize/vendor

以上错误日志中,主要的错误信息为:

复制代码
failed to open stream: Permission denied

即无法打开二进制流(即上传的图片),权限被拒绝

出现此类问题时,一定要查看错误日志!!!

nginx的错误日志、php的错误日志,系统的日志等等,需要仔细查看错误信息,一定会给出相应的错误信息的,如果实在不行,可以开启php的debug模式

二、问题解决

2.1 修改属主属组

  • 新建nginx用户组
    2.1 新建nginx用户组

    useradd nginx -s /sbin/nologin -M

  • 修改nginx配置文件

    vim /etc/nginx/nginx.conf

    user nginx;

  • 修改php-fpm配置文件

使用find命令找到www.conf文件

复制代码
find / -name www.conf

修改php启动用户和用户组

复制代码
# vim /etc/php-fpm/www.conf
user = nginx
group = nginx
  • 重新加载nginx和php-rpm

    systemctl restart nginx
    systemctl restart php-rpm

  • 修改wordpress 用户和用户组

进入wordpress根目录(判断标准是包含wp-admin、wp-content、wp-includes三个目录),并将根目录下所有文件用户组改成nginx。

修改文件属主

复制代码
chown -R nginx wordpress

修改文件用户组

复制代码
chgrp -R nginx wordpress

-R表示更改wordpress目录及其下所有文件和目录。

  • 验证生效
    ps aux | grep nginx

2.2 赋予所有权限

找到所在的文件目录,设置文件夹权限为777即可。(该方式相对比较暴力)

复制代码
chmod -R 777  /usr/share/nginx/html/wordpress

2.3 关闭防火墙及selinux

以上两个问题是网上最多人提出的,但下面这个selinux的问题一定是你万万没想到的。

在 CentOS 7 上,SELinux 默认处于启用状态 。SELinux 通过限制和定义服务器处理请求以及用户与套接字、网络端口和基本目录交互的方式来提高服务器安全性。SELinux 可能会在访问文件或目录或将文件或目录写入 DocumentRoot 时产生问题

解决方法是 :关闭selinux

永久方法 -- 需要重启服务器

复制代码
修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器。

临时方法 -- 设置系统参数

使用命令

复制代码
setenforce 0

注:

复制代码
setenforce 1 设置SELinux 成为enforcing模式 (开启)
setenforce 0 设置SELinux 成为permissive模式(关闭)

2.4 设置selinux

出于安全原因,不建议禁用 SELinux,因为将允许整个系统受到损害。但是,我们可以更新SELinux 策略以允许在特定目录上进行读写。下面是设置 SELinux 策略以允许apache用户读取和写入 wordpress 下特定目录的完整命令集。

  • 首先重新建立SELinux上下文

    restorecon -Rv /usr/share/nginx/html/wordpress

  • 更改 webroot 的所有者

    chown -R nginx:nginx /usr/share/nginx/html/wordpress

  • 更改基本权限

    chmod -R g+w /usr/share/nginx/html/wordpress
    chmod g+s /usr/share/nginx/html/wordpress

  • 建立 SELinux 权限

    将所有文件设为只读

    chcon -R -t httpd_sys_content_t /usr/share/nginx/html/wordpress

    只允许写入上传目录

    chcon -R -t httpd_sys_rw_content_t /usr/share/nginx/html/wordpress/wp-content/uploads/

2.5 远程文件参数开启

复制代码
vim php.ini
设置 allow_url_fopen = On  //该选项默认已开启,为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。

注:allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。

相关推荐
syjy22 天前
WP Smush Pro WordPress插件使用教程(含下载)
wordpress·wordpress插件
代龙涛2 天前
WordPress archive.php 分类与归档页面开发指南
开发语言·后端·php·wordpress
WordPress学习笔记2 天前
Grace主题(Grace Theme):高端原创设计 优雅大气的WordPress主题
wordpress
WordPress学习笔记4 天前
建跨境独立站用XXTheme主题好还是GraceTheme主题好?
wordpress
WordPress学习笔记5 天前
外贸模板推荐
wordpress
WordPress学习笔记6 天前
用“第一性原理”思维,为搜索引擎收录铺就坦途
搜索引擎·wordpress
Web极客码7 天前
深入了解WordPress网站访客意图
服务器·前端·wordpress
Web极客码8 天前
WordPress管理员角色详解及注意事项
运维·服务器·wordpress
fqrj20269 天前
什么是WordPress?企业WordPress搭建网站的基本流程和步骤分享
html·wordpress·网站开发·技术开发
WordPress学习笔记12 天前
外贸网站的wordpress英文主题
wordpress·wordpress主题