踩了大坑:wordpress后台 无法将上传的文件移动至wp-content
Posted 杰哥的技术杂货铺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了踩了大坑: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都不能打开远程文件。
以上是关于踩了大坑:wordpress后台 无法将上传的文件移动至wp-content的主要内容,如果未能解决你的问题,请参考以下文章