Nginx 400 uri length is too long, >= 256 错误正确的解决办法 fastdfs 添加重命名文件功能带来的问题

问题发现

在给FastDfs添加重命名文件的功能之后,Nginx返回文件报了这样一个400错误,并且错误有时候出现有时候不出现

查看error.log内容如下

/data/fastdfs-nginx-module/src/common.c, line: 614, uri length: 290 is too long, >= 256

解决办法

需要修改fastdfs-nginx-module源码,重新编译安装nginx(我觉得有点麻烦,后来发现这应该是唯一办法

第一步:修改源码

这个模块源码路径可以在错误日志(/data/fastdfs-nginx-module/src/common.c)里面看到,找到错误对应代码位置(Line 614)

 

向上找到uri的定义

其中256就是字符长度限制,修改成2560,扩大10倍限制

保存

第二步:编译安装重启

切换到fastdfs所使用的nginx源码目录,我这是docker安装,路径在/data/nginx(可以从报错日志的源码路径看出

root@localhost:/etc/nginx/logs# cd /data/nginx
root@localhost:/data/nginx# ll
total 664
drwxr-xr-x. 1 1001 1001     34 Mar 13 06:29 ./
drwxr-xr-x. 1 root root     64 Jul 20  2016 ../
-rw-r--r--. 1 1001 1001 258455 Feb  9  2016 CHANGES
-rw-r--r--. 1 1001 1001 393734 Feb  9  2016 CHANGES.ru
-rw-r--r--. 1 1001 1001   1397 Feb  9  2016 LICENSE
-rw-r--r--. 1 root root    376 Mar 13 06:29 Makefile
-rw-r--r--. 1 1001 1001     49 Feb  9  2016 README
drwxr-xr-x. 6 1001 1001   4096 Jul 20  2016 auto/
drwxr-xr-x. 2 1001 1001    168 Jul 20  2016 conf/
-rwxr-xr-x. 1 1001 1001   2481 Feb  9  2016 configure*
drwxr-xr-x. 4 1001 1001     72 Jul 20  2016 contrib/
drwxr-xr-x. 2 1001 1001     40 Jul 20  2016 html/
drwxr-xr-x. 2 1001 1001     21 Jul 20  2016 man/
drwxr-xr-x. 4 root root    172 Mar 13 06:30 objs/
drwxr-xr-x. 9 1001 1001     91 Jul 20  2016 src/

清理=>设置编译参数(通过nginx -V可以查看之前的编译参数,复制过来)=>编译安装

make clean
./configure --prefix=/etc/nginx --add-module=/data/fastdfs-nginx-module/src 
make
make install

 

然后重启nginx问题就解决了

错误原因

fastdfs-nginx-module的模块里面,限制了URI的长度为256字节,如果你的URI长度超过256字节,则会报错

刚开是我还以为哪里可以配置这个长度,看了下源码,发现特么这个是写死的

这代码的意思是判断请求路径长度,如果大于uri的长度就报错。

uri的定义为

char uri[256];

是一个长度为256字节的字符串,c语言源码中,把浏览器中的地址,复制到局部变量uri中

然后这个局部变量只能存256字节,为防止溢出,所以才有这个么校验。真特么短,改到2560字节妥妥的。

看到另一篇博文是把这个校验的代码去掉,这是个错误的解决办法, 会造成url截断,生成的文件名残缺。

所以正确的处理办法应该把这个局部变量扩容。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章