最近在给 WordPress 网站上传封面图片时遇到一个奇怪的问题:
一张 2.09MB、1472×1136 像素的 JPG 图片上传时直接提示:

服务器无法处理图片。如果服务器繁忙或没有足够的资源来完成任务,就会发生这种情况。上传较小的图片可能会有所帮助。建议的最大尺寸为 2560 像素。

更小的图片(159KB,896×2678)又能正常上传。

最初我怀疑是 PHP 内存不足、Imagick 图像处理限制导致,但经过详细排查,最终发现罪魁祸首竟然是 Web 服务器请求体大小(Request Body)限制,而不是 PHP。


一、问题表现

  • 图片文件并不大(仅 2MB 左右),PHP 配置也已经允许上传 100MB 文件。
  • 上传在点击“设置封面图片”瞬间就失败,没有保存到媒体库。
  • 在 WordPress debug 模式下也看不到明确的 PHP 报错。

二、常规排查方向

遇上这种“服务器无法处理图片”的问题,一般会考虑以下几个方向:

  1. PHP 限制
    • upload_max_filesize
    • post_max_size
    • memory_limit
  2. 图片处理库限制
    • Imagick 的 policy.xml 中 memoryarea 开关
    • GD 处理内存不足
  3. WordPress 自动生成缩略图
    • 超过 big_image_size_threshold 尺寸被自动缩放
    • 元数据(EXIF/ICC)异常导致处理失败
  4. Nginx / Apache 请求体大小限制

我在服务器检查了前 3 项都没问题,policy.xml 限制比我们的图片需求大得多,PHP 也允许 100M 上传,内存限制 256M。


三、最终发现

问题出在Web 服务器的 HTTP 请求体大小限制

1. Nginx 环境

Nginx 默认 client_max_body_size 可能不超过 1M,如超过则直接返回 413 Request Entity Too Large
WordPress 收到的就是“请求被拒绝”,于是前端就显示“服务器无法处理图片”。

解决方法很简单:

# nginx.conf http 或 server 段中加入
client_max_body_size 160M;

修改后重启 Nginx:

sudo systemctl restart nginx

2. Apache 环境

Apache 虽然大多数情况下默认没有特别严格的请求体限制,但如果配置文件中设置了 LimitRequestBody,也可能导致大文件无法提交。

解决方法是在 Apache 配置(或虚拟主机配置)中调整:

# 允许的最大请求体大小设置为 160M (略大于 PHP 的 post_max_size)
LimitRequestBody 167772160

修改后重启 Apache:

sudo systemctl restart apache2

四、经验总结

  1. 不要只看 PHP 配置
    很多人遇到上传失败第一反应是修改 php.ini 里的上传大小和内存限制,但上传请求首先要经过 Web 服务器,如果在这一步被拦截,PHP 根本不会执行。
  2. Nginx 和 Apache 都有独立的上传限制
    • Nginx 用 client_max_body_size 控制。
    • Apache 用 LimitRequestBody 控制。
  3. 建议设置略大于 PHP 的 post_max_size
    例如 post_max_size 150M,就可以设置 160M,保证上传请求不会被 Web 服务器截断。

五、最终解决方案

Apache中:

LimitRequestBody 167772160

Nginx中:

client_max_body_size 160M;

设置完成并重启服务后,WordPress 就能正常上传 2MB~几十MB 的图片、媒体文件,再也不会出现“服务器无法处理图片”的提示。


📌 总结
如果你在 WordPress 上传图片、视频时遇到“服务器无法处理图片”这类提示,除了检查 PHP 配置,还必须检查 Web 服务器的请求体大小限制,这是很多人容易忽略的地方。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。