ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: COPY и несуществующая директория = 500 Internal Server Error



Hello!

On Sun, Dec 29, 2013 at 02:11:29PM +0400, Михаил Монашёв wrote:

> Здравствуйте, Maxim.
> 
> >> Бага или фича?
> >> 
> >> Если  через  WebDAV  копируется  несуществующий  файл  в  существующей
> >> директории, то выдаётся 404. Но если копируется файл из несуществующей
> >> директории  в  неё  же,  то  выдаётся 500 - Internal Server Error. Это
> >> правильное поведение или должно 404 тоже выдаваться?
> 
> > Если исходный файл/каталог не сущетсвует, то в любом случае должно 
> > выдаваться 404.
> 
> >> Пример:
> >> копируем http://i39.beon.ru/17/74/1467417/47/avatars/4.jpeg
> >> в  http://i39.beon.ru/17/74/1467417/47/avatars/4.jpeg.tmp
> >> и получаем: 500 Internal Server Error
> >> 
> >> в error_log-е:
> >> 2013/12/28 11:54:28 [crit] 2845#0: *4749150 open()
> >> "/opt2/beon/i39/17/74/1467417/47/avatars/4.jpeg.tmp" failed (2: No
> >> such file or directory), client: 89.208.146.210, server:
> >> i39.beon.ru, request: "COPY
> >> http://i39.beon.ru/17/74/1467417/47/avatars/4.jpeg HTTP/1.1", host:
> >> "i39.beon.ru"
> >> 
> >> в access.log-e:
> >> 28/Dec/2013:11:54:28 +0400 500 89.208.146.210 353 i39.beon.ru
> >> "COPY http://i39.beon.ru/17/74/1467417/47/avatars/4.jpeg HTTP/1.1"
> >> "-" "-" "-" "-" "-" "-" "close"
> 
> > Должно быть так:
> 
> > 2013/12/28 16:51:35 [error] 33014#0: *1 lstat()
> > "/path/to/foo/bar/bazz" failed (2: No such file or directory),
> > client: 127.0.0.1, server: , request: "COPY /foo/bar/bazz HTTP/1.1",
> > host: "localhost"
> > 127.0.0.1 - - [28/Dec/2013:16:51:35 +0400] "COPY /foo/bar/bazz HTTP/1.1" 
> > 404 168 "-" "-"
> 
> > То, что у тебя сломался open(), намекает на то, что в процессе 
> > выполнения этого запроса кто-то удалил каталог.
> 
> Каталоги там никто не удаляет точно. Вся работа идёт через nginx, а он
> удалять  каталоги  не  умеет  и  на  встроенном перле у меня ничего не
> написано. И ошибка эта воспроизводится не всегда.

Вообще-то, nginx удалять каталоги умеет, нужно просто правильно 
попросить.  Но это не твой случай, см. ниже.

> Ошибка: Couldn't copy http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif => 
> http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif.tmp: 500 Internal Server 
> Error
> 
> Посмотрел debug-лог. Я там тоже накрутил с конфигом, но 500 всёравно
> быть не должно ИМХО:

[...]

> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http request line: "COPY 
> http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif HTTP/1.1"

[...]

> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http header: "Destination: 
> http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif.tmp";

[...]

> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script regex: 
> "^(/\d+/\d+/\d+/)\d+/(avatars/.+|design/.+|0\.(?:gif|jpeg|png|mp3))$"
> 2013/12/29 14:00:55 [notice] 78336#0: *10484311 
> "^(/\d+/\d+/\d+/)\d+/(avatars/.+|design/.+|0\.(?:gif|jpeg|png|mp3))$" matches 
> "/43/96/1009643/43/avatars/9.gif", client: 89.208.146.210, server: 
> i41.beon.ru, request: "COPY 
> http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif HTTP/1.1", host: 
> "b.i41.beon.ru"
> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script copy: "/"
> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script capture: 
> "/43/96/1009643/"
> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script capture: 
> "avatars/9.gif"
> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http script regex end
> 2013/12/29 14:00:55 [notice] 78336#0: *10484311 rewritten data: 
> "//43/96/1009643/avatars/9.gif", args: "", client: 89.208.146.210, server: 
> i41.beon.ru, request: "COPY 
> http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif HTTP/1.1", host: 
> "b.i41.beon.ru"

[...]

> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http copy from: 
> "/opt2/beon/i41//43/96/1009643/avatars/9.gif"
> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 http copy to: 
> "/opt2/beon/i41/43/96/1009643/43/avatars/9.gif.tmp"
> 2013/12/29 14:00:55 [debug] 78336#0: *10484311 malloc: 0000000806E68000:65536
> 2013/12/29 14:00:55 [crit] 78336#0: *10484311 open() 
> "/opt2/beon/i41/43/96/1009643/43/avatars/9.gif.tmp" failed (2: No such file 
> or directory), client: 89.208.146.210, server: i41.beon.ru, request: "COPY 
> http://b.i41.beon.ru/43/96/1009643/43/avatars/9.gif HTTP/1.1", host: 
> "b.i41.beon.ru"

Из вышепроцитированного более или менее очевидно, что копируют 
существующий файл, однако в несуществующий каталог.

Возврат 500 в подобной ситуации - не то чтобы лучшее из 
возможного, но как минимум объясним.

IMHO, это классическая иллюстрация к соседнему треду про 
rewrite'ы.  :)

-- 
Maxim Dounin
http://nginx.org/

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.