• 踩了大坑: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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    failed to open stream: Permission denied
    
    即无法打开二进制流(即上传的图片),权限被拒绝
    
    • 1
    • 2
    • 3

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

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

    二、问题解决

    2.1 修改属主属组

    • 新建nginx用户组
      2.1 新建nginx用户组
    useradd nginx -s /sbin/nologin -M
    
    • 1
    • 修改nginx配置文件
    # vim /etc/nginx/nginx.conf
    user  nginx;
    
    • 1
    • 2
    • 修改php-fpm配置文件

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

    find / -name www.conf
    
    • 1

    修改php启动用户和用户组

    # vim /etc/php-fpm/www.conf
    user = nginx
    group = nginx
    
    • 1
    • 2
    • 3
    • 重新加载nginx和php-rpm
    systemctl restart nginx
    systemctl restart php-rpm
    
    • 1
    • 2
    • 修改wordpress 用户和用户组

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

    修改文件属主

    chown -R nginx wordpress
    
    • 1

    修改文件用户组

    chgrp -R nginx wordpress
    
    • 1

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

    • 验证生效
      ps aux | grep nginx

    2.2 赋予所有权限

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

    chmod -R 777  /usr/share/nginx/html/wordpress
    
    • 1

    2.3 关闭防火墙及selinux

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

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

    解决方法是 :关闭selinux

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

    修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器。
    
    • 1

    临时方法 – 设置系统参数

    使用命令

    setenforce 0
    
    • 1

    注:

    setenforce 1 设置SELinux 成为enforcing模式 (开启)
    setenforce 0 设置SELinux 成为permissive模式(关闭)
    
    • 1
    • 2

    2.4 设置selinux

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

    • 首先重新建立SELinux上下文
    restorecon -Rv /usr/share/nginx/html/wordpress
    
    • 1
    • 更改 webroot 的所有者
    chown -R nginx:nginx /usr/share/nginx/html/wordpress
    
    • 1
    • 更改基本权限
    chmod -R g+w /usr/share/nginx/html/wordpress
    chmod g+s /usr/share/nginx/html/wordpress
    
    • 1
    • 2
    • 建立 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/
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.5 远程文件参数开启

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

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

  • 相关阅读:
    【SpringBoot笔记31】SpringBoot之配置过滤器Filter的方式、配置拦截器Interceptor的方式
    沉睡者C - 网赚其实就是打造自己的赚钱系统
    【JSON2WEB】06 JSON2WEB前端框架搭建
    IDEA插件开发(12)---Dependencies
    【前端源码解析】数据响应式原理
    Spring源码之六-onRefresh()方法
    【华为OD机试真题 python】 城市聚集度【2022 Q4 | 200分】
    Qt TCP 分包粘包的解决方法
    【数据结构】二叉树的顺序结构及实现,堆,向上调整算法,向下调整算法,数组建堆算法,堆排序
    传统机器学习聚类算法——总集篇
  • 原文地址:https://blog.csdn.net/cljdsc/article/details/132768569