問題發現
在給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截斷,生成的文件名殘缺。
所以正確的處理辦法應該把這個局部變量擴容。