问题发现
在给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截断,生成的文件名残缺。
所以正确的处理办法应该把这个局部变量扩容。