PHP 上传文件无法超过 1MB

瞳人


发布于 Aug. 31, 2015, 4:47 p.m.

0 个评论

Apache Docker Nginx PHP


nginx 反向代理后, apache 和 php 环境中上传文件无法超过 1MB.

问题描述

服务器上 docker 环境中运行了 moodle 课程网站 (关于如果在 docker 中运行 moodle 可以看我之前的文章), 但是在使用过程中发现在上传 2MB 大小的文件时, 显示如下图错误:

moodle upload error

但是在上传小于 1MB 的文件时, 能够上传成功. 说明应该不是目录权限问题.

思考一: lamp 中 php 配置问题?

但是在运行 moodle 的容器中, php 的配置文件中已经修改了大小限制:

1
2
3
4
sed -i 's/post_max_size = 8M/post_max_size = 32M/g' /etc/php5/apache2/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 32M/g' /etc/php5/cli/php.ini
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 32M/g' /etc/php5/apache2/php.ini
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 32M/g' /etc/php5/cli/php.ini

所以应该不是这个问题导致的.

尝试二: moodle 自己的 bug?

于是尝试更新 moodle, 更新过程也可以参考我之前的文章. 但是更新过后, 还是没有解决问题.

尝试三: nginx 反向代理的限制?

由于上传文件限制在小于 1MB, 而 nginx 服务器有一个参数 client_max_body_size 默认值是 Default: client_max_body_size 1m;

Sets the maximum allowed size of the client request body, specified in the “Content-Length” request header field. If the size in a request exceeds the configured value, the 413 (Request Entity Too Large) error is returned to the client. Please be aware that browsers cannot correctly display this error. Setting size to 0 disables checking of client request body size.

由于我在服务器上有多个 web 服务, 基本上每个服务有不同的域名并且对应不同的 container, 所以我使用了 nginx-proxy 的一个 container 来作为反向代理.

而且我在 nginx-proxy 中的 Dockerfile 中加入了如下代码:

1
RUN echo 'client_max_body_size 1G;' > /etc/nginx/conf.d/my_proxy.conf

理论上来说应该会生效, 但是不知道为什么没有生效. 我在 container 里面手动加入了这个参数并且重启 container 之后, 问题解决了.


哎呦, 不错哦!

0 Comments


Leave a Comment:

博客搜索

友情链接

公告

本博客代码已经公布在 Github 上,欢迎交流指正。

QQ 邮箱对 mailgun 不太友好, 所以使用 QQ 邮箱的评论, 可能会无法及时收到邮件。我会尽快寻找其他解决方案的。

本人现在独自使用 linode vps, 20 美元/月, 感觉压力大, 如果有意一起合租, 可以联系我. 在我的任意一篇文章下面留言即可. 关于使用方式, 现在倾向于使用 docker.