踩了大坑: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都不能打开远程文件。

相关推荐
2501_930786299 天前
WordPress如何绑定多个域名 WordPress实现多域名访问
wordpress
TG_yunshuguoji11 天前
阿里云代理商:轻量应用服务是什么?怎么用轻量应用服务器搭建个人博客?
服务器·阿里云·云计算·wordpress·个人博客
Web极客码13 天前
WordPress.com 和 WordPress.org 之间的区别说明
wordpress
记忆不曾留23 天前
unbuntu 20.04 docker 部署wordpress
运维·docker·容器·wordpress·独立站建站
Web极客码24 天前
如何安装和配置W3 Total Cache以提升WordPress网站性能
wordpress·网站安全·wordpress插件
WordPress学习笔记1 个月前
wordpress的wp-config.php文件的详解
php·wordpress·wp-config
WordPress学习笔记1 个月前
wodpress结构化数据对SEO的作用
wordpress·结构化数据
WordPress学习笔记1 个月前
wordpress登陆前登陆后显示不同的顶部菜单
wordpress
云动雨颤1 个月前
WordPress安全加速:Cloudflare + Nginx缓存优化方案
服务器·wordpress
ZLlllllll01 个月前
常见cms里面的几个cms框架的webshell方法(wordpress,dedecms,phpmyadmin,pageadmin)
cms·wordpress