解决 Nginx 导致 WordPress 无法上传超过 1MB 的文件

我在家庭服务器上的 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

WordPress 上传图片或文件报错

因此我们应该不会再怀疑报错是由于限制了上传大小所导致的啦!

上图示例包括上传图片的报错与上传文件的报错。

上传图片报错

上传图片的时候,有些能正常,有些会报错。

上传图片出现报错的都是这样的报错:

  • 服务器无法处理图像。如果服务器繁忙或没有足够的资源来完成任务,就会发生这种情况。上传较小的图像可能会有所帮助。建议的最大尺寸为 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' );

终于完美了。

发表回复