[Errno 36] File name too long: b'download/1667513450554-\\u435C\\u4E48\\u505C\\u5C44\\u4552\\u454D\\u7478\\u7551\\u7265\\u5C79\\u554F\\u5C54\\u4150\\u4449\\u445C\\u5441\\u4541\\u5458\\u4F5C\\u5357\\u4843\\u4445\\u4C4D\\u4A5F\\u4544\\u505F\\u4941\\u5F44\\u6F4D\\u746E\\u6C68\\u5F79\\u3638\\u3130\\u5F36\\u3032\\u3232\\u3131\\u3330\\u3831\\u3631\\u3735\\u595F\\u5943\\u3834\\u3437\\u7A2E\\u7069'
fdfs下载文件时,出现此错误,原因就是文件名太长导致。
这个模块源码路径可以在错误日志(/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/
- make clean
- ./configure --prefix=/etc/nginx --add-module=/data/fastdfs-nginx-module/src
- make
- make install
然后重启nginx问题就解决了
这代码的意思是判断请求路径长度,如果大于uri的长度就报错。
fastdfs-nginx-module的模块里面,限制了URI的长度为256字节,如果你的URI长度超过256字节,则会报错
刚开是我还以为哪里可以配置这个长度,看了下源码,发现特么这个是写死的。
uri的定义为
char uri[256];
是一个长度为256字节的字符串,c语言源码中,把浏览器中的地址,复制到局部变量uri中,
然后这个局部变量只能存256字节,为防止溢出,所以才有这个么校验。真特么短,改到2560字节妥妥的。