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截斷,生成的文件名殘缺。

所以正確的處理辦法應該把這個局部變量擴容。

 

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