今天在测试表单提交时遇到一个问题,当POST的内容比较多的时候,lighttpd会返回413: Request Entity Too Large。这个返回码表示请求的body过大。通过测试,发现当请求数据大于64KB,服务器返回413.
baidu&google了很多文章,千篇一律,说要设置下 server.upload-dirs、server.max-request-size等,尝试多种设置和目录权限,没有搞定。
那么,还是从基本点开始研究,把设置项搞清楚。
server.upload-dirs 上传临时目录,默认为"/var/tmp",但必须是在本地磁盘(... assume it is a local harddisk)
server.max-request-size 可以上传至服务器的最大值,单位为kb(kilobytes),默认不限制。
(以上解释可在源代码包 lighttpd-1.4.35/doc/config/lighttpd.con找到)
接着分析源码,当POST大于64KB时,数据被写入临时文件,默认目录为 /var/tmp。
在server上执行"df -hl",发现l磁盘目录/var/tmp空间已满,所以写临时文件失败导致返回413.
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 9.9G 9.4G 0 100% /
tmpfs 7.3G 0 7.3G 0% /dev/shm
/dev/xvda1 443G 236G 186G 56% /home
于是,清理磁盘空间,或者lighttpd.con修改server.upload-dirs或指向别的目录,重启测试成功。
总结:遇到问题从最基本的点开始,本例即是把配置项弄清楚,再散发到源代码分析程序运行流程。