我在家庭服务器上的 WordPress 原本是与 NextCloud 运行在同一个 LXC 容器上的,由于 NextCloud 这个耗资源大户确实是耗资源,且不是正常耗资源的那种,而是专门吃 buff/cache ,即使给他 8GB 的内存,都能被 buff/cache 吃完哟!详细不在这里细数 NextCloud 的缺点了,有关 NextCloud 的牢骚详细在这 https://sgtfz.cn/members/cyf/activity/2739/,反正我昨天已经完美的把 WordPress 独立运行在一台新建的 1核心 1GB内存 的虚拟机上了。
问题来了,WordPress 在 Nginx + PHP + MariaDB 这个新环境上有点水土不服呀。
实际上这个问题本就不应该出现,出现这个问题的原因是由于我们不熟悉配置 Nginx 环境的服务器。但如果他能正常的工作,没有遇到问题,又怎么可能花时间去进一步了解 Nginx 呢!我在阿里云公网环境部署的 Nginx + PHP + MariaDB 就没有遇到此问题,因为没有上传超过 1MB 以上的图片,文件更是没有上传过,因为阿里云公网上的那个宽带,那个费用,分分钟不想搞。要不是新用户优惠,那续费价格实在是吓到我了,真就不搞了!真没意思。哪里有无限的新用户呢,所以不可持续的,还是决定放弃吧…
还是家里好啊!我这台家庭服务器实在多了呀,有电,有宽带(动态公网IP),他就可以咯,所以才有继续折腾的意义与动力…
WordPress 无法上传媒体文件的报错并不直观
这个问题如果不细心的去稍微的品一下,分分钟被报错的提示所误导,导致找不到问题根源从而无法解决问题。
WordPress 无法上传媒体文件报错如下图所示:
请注意下图。最大上传文件大小:512MB

因此我们应该不会再怀疑报错是由于限制了上传大小所导致的啦!
上图示例包括上传图片的报错与上传文件的报错。
上传图片报错
上传图片的时候,有些能正常,有些会报错。
上传图片出现报错的都是这样的报错:
- 服务器无法处理图像。如果服务器繁忙或没有足够的资源来完成任务,就会发生这种情况。上传较小的图像可能会有所帮助。建议的最大尺寸为 2560 像素。
上传文件报错
上传文件的时候,除了某些不支持的文件类型会报错:抱歉,您无权上传此文件类型。
在支持的文件类型上,有些能正常,有些会报错。
上传文件出现报错的都是这样的报错:
- 从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。
解决 WordPress 无法上传媒体文件的报错
根据 WordPress 媒体库无法上传文件的报错提示,围绕着这方面的问题一直在寻找解决问题的答案,正是由于 WordPress 的这个报错提示指引了我走进了深渊!
在深渊里挣扎的同时真相已浮出了水面
实际上还是由于限制了上传的大小,导致的问题!
- 明明图片分辨率超过 2560 像素,却还是有可以正常上传的!
- 明明图片没有超过 2560 像素的,却还是无法正常上传的!
原来只要文件超过 1MB 的都会出现报错,从而无法正常上传到媒体库!
但是为什么媒体库这里显示:
最大上传文件大小:512MB
因为我在配置服务器的 php.ini 已经配置了可以上传单个文件不超 512MB
post_max_size = 512M upload_max_filesize = 512M
那么目前除了 Nginx 还能有谁在限制呢!马上查看 Nginx 的日志:
2022/03/14 00:25:25 [error] 4116#4116: *31 client intended to send too large body: 1406102 bytes, client: 192.168.33.1, server: sgtfz.top, request: "POST /wp-admin/async-upload.php HTTP/2.0", host: "sgtfz.top:8888", referrer: "https://sgtfz.cn/wp-admin/upload.php" 2022/03/14 00:26:44 [error] 4116#4116: *31 client intended to send too large body: 1310747 bytes, client: 192.168.33.1, server: sgtfz.top, request: "POST /wp-admin/async-upload.php HTTP/2.0", host: "sgtfz.top:8888", referrer: "https://sgtfz.cn/wp-admin/upload.php" 2022/03/14 00:31:22 [error] 4116#4116: *31 client intended to send too large body: 113168773 bytes, client: 192.168.33.1, server: sgtfz.top, request: "POST /wp-admin/async-upload.php HTTP/2.0", host: "sgtfz.top:8888", referrer: "https://sgtfz.cn/wp-admin/upload.php"
真相大白!
配置 Nginx 默认上传限制
经了解 Nginx 默认上传文件限制为 1MB ,超过 1MB 的文件无法上传成功。所以我们只需修改 Nginx 的配置文件,增加 client_max_body_size 512M; 此参数,就能解决目前所遇到的问题。
client_max_body_size 1024M; 此参数应该写在哪里,众说纷纭!
有说写在 http { 写在这里 }
有说写在 server { 写在这里 }
有说写在 location / { 写在这里 }
反正我写在这里:
# 我已配置好的 WordPress 网站配置文件
vi /etc/nginx/sites-available/wordpress
server {
......
listen *:443 ssl http2;
listen [::]:443 ssl http2;
server_name sgtfz.top;
# 写在这里呀!!!!!!!
client_max_body_size 512M;
root /sites-data/wordpress/;
index index.php;
......
}
保存配置后,重启 Nginx ,这个问题完美解决啦!
WordPress 媒体库默认裁剪限制 2560 像素
我们解决了 Nginx 的默认限制后,WordPress 可以正常上传不超 512MB 的文件啦,但是上传了一张 4000×4000 像素的图片发现,媒体库显示为 2560×2560 像素分辨率!这不是我要的结果呀!
一波还未平息,一波又来侵袭,茫茫人海,狂风暴雨 …
解决方法:
在子主题的 functions.php 增加一行参数
add_filter( 'big_image_size_threshold', '__return_false' );
终于完美了。

