前两天想在月经杯那篇文章里加个视频,一看媒体库上传文件大小上限只有 2MB,再看我扒下来的视频只有 2.55MB,心想好吧没必要改,随便找了一个压缩视频的网站打算压缩到 2MB 以内。压缩完 1.96MB,我心想这完美啊,结果死活传不上去,显示 “从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页”。行吧,看来这个问题绕不过去了。
第一步当然是搜索这个报错意味着什么。相关信息倒是挺多的,都直接指向了文件大小限制。GitHub 上的这个 issue 讲的非常清楚了,包括解决方法。在下面大致总结一下方法(基于此 Digital Ocean 教程 搭建的wordpress):
1. 在 wordpress 的文件夹里新建一个给 php 用的配置文件uploads.ini
,覆盖掉默认设置:
file_uploads = On
memory_limit = 64M #php 进程的内存限制
upload_max_filesize = 64M #最大上传文件大小
post_max_size = 64M #单篇文章大小限制
max_execution_time = 600 #最大执行时间
2. 在docker-compose.yml
里面 cue 一下,加在 wordpress volumes 的部分,让配置文件被正常加载进去:
-./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
完成后:
...
wordpress:
depends_on:
- db
image: wordpress:5.6.0-fpm-alpine
container_name: wordpress
restart: on-failure
env_file: .env
environment:
- WORDPRESS_DB_HOST=db:3306
- WORDPRESS_DB_USER=$MYSQL_USER
- WORDPRESS_DB_PASSWORD=$MYSQL_PASSWORD
- WORDPRESS_DB_NAME=wordpress
volumes:
- wordpress:/var/www/html
-./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
networks:
- app-network
...
3. 进入 nginx-conf 目录,打开nginx.conf
修改 nginx 的文件请求大小,在 80 和 443 端口的 section 任意行都加上:
client_max_body_size 64M;
完成以后是
server {
listen 80;
listen [::]:80;
server_name mmydonn.space www.mmydonn.space;
client_max_body_size 64M;
...
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name mmydonn.space www.mmydonn.space;
client_max_body_size 64M;
...
第一次只在 80 的 section 加了结果无效,可能因为我的网站默认 https 所以还是 443 比较重要。一定要记得都加上!
4. 重建容器
$ docker-compose down
$ docker-compose up -d
或者直接 --force-recreate
选项也行。
刷新网站再看文件限制就变成 64MB 啦。
后记:当时没有截图报错信息,写文章的时候想再重现一遍就随便选了一个大文件上传,结果报错变成了正常的超过大小限制:
所以直到最后都没搞懂为什么一开始的报错是 “预料之外的响应”……猜想是 nginx 请求大小的锅,不过已经不重要了。