18:55

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
[ok]

Есть система, работающая с заяками пользователей. Пользователи периодически загружают файлы. Запущена в мае прошлого года. Работала нормально до сих пор. Сейчас же возникла проблема - перестали загружаться файлы размером больше 20 мб. Хотя ещё в начале февраля нормально всё грузилось.

При попытке загрузить файл больше обозначенного объёма, фф и хром тупо пишут ошибку загрузки страницы, а опера выдаёт:

413 Request Entity Too Large



nginx


Хотя nginx'ом на сервере не пахнет от слова вообще - всегда был апач и есть по сей момент.
Места на хосте достаточно - ещё 20 Гигов свободно.

Вопрос - в чём может быть дело?
Скрипты никак не менял. Ради теста забахал самую примитивную формочку и скриптик - на портативном сервере работает, на рабочем - нет.

.htacess
Формочка
Скрипт, сохраняющий файл.

Комментарии
07.05.2013 в 19:34

The day that you stop running is the day that you arrive.
php_value upload_max_filesize 300M

php_value post_max_size 350M

удали, проверь.
пропиши в байтах, проверь.
07.05.2013 в 20:03

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
neo_rage,

Удалил. Выдаваемое phpinfo() сменилось на 2 и 8 Мб соответственно.
Меньше 20 метров - грузит, но не сохраняет.
Больше 20 метров - не грузит и сразу выдаёт ошибку.


Прописал в байтах.
Меньше 20 метров - грузит и сохраняет.
Больше 20 метров - не грузит и сразу выдаёт ошибку.


-----------------------------------------------------------------------

Просто непонятно, что вообще произошло. Ещё в феврале пользовались и всё работало нормально, а сейчас с тем же самым, но теперь выёживается(((
Первый сбой за год работы. При том, что не меняли ничего.
07.05.2013 в 21:20

как можно спорить с фактами? если нгинкс говорит 413, значит он есть. найдите его и впишите требуемый client_max_body_size.

ну посмотрите кто у вас слушает 80 порт. заодно проверьте на какой хост вы ходите на самом деле.
07.05.2013 в 21:41

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
ehlo_kitty, как можно спорить с фактами? если нгинкс говорит 413, значит он есть. найдите его и впишите требуемый client_max_body_size.

Никак. Факт есть факт - поиск по всем файлам системы не выявил ни одного с файла, содержащего в названии 'nginx'. Так что сдаётся мне, что это просто свёрстанная страничка, ибо нигде более он не упоминается.
И да, я не уверен, что её сервер выдаёт, возможно просто опера подставляет. Т.к. ни в фф, ни в хроме эта ошибка не отображается. Они просто выдают что страница не может быть загружена. А народ в гугле говорит, что 413-ю не все браузеры могут обработать нормально.

А на 80-м апач и сидит. Он там с момента поднятия сервера.
07.05.2013 в 21:54

так вы посмотрите заголовки, что в них написано? ещё раз, вполне вероятно что вы ходите не на тот хост, на котором апач стоит, проверьте всё внимательно.
08.05.2013 в 02:08

Sanctus Satanas
И да, я не уверен, что её сервер выдаёт, возможно просто опера подставляет. Т.к. ни в фф, ни в хроме эта ошибка не отображается. Они просто выдают что страница не может быть загружена.
Ну что за хрень? Опера ничего не знает ни про какой nginx и не должна.

А народ в гугле говорит, что 413-ю не все браузеры могут обработать нормально.
Хорошо, а как, на ваш взгляд, браузер должен правильно обработать такую страницу?

HTTP/1.1 413 Request Entity Too Large
Server: nginx
Content-Type: text/html
Content-Length: 192

<html>
<head><title>413 Request Entity Too Large</title></head>
<body bgcolor="white">
<center><h1>413 Request Entity Too Large</h1></center>
<hr><center>nginx</center>
</body>
</html>

08.05.2013 в 12:15

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Хорошо, а как, на ваш взгляд, браузер должен правильно обработать такую страницу?

Да без понятия. Просто факт есть факт - при возникновении данной ошибки, одни браузеры тупо стопарятся, а опера выдаёт страничку. Вот я и предположил, что данная страничка есть в составе оперы и выдаётся пользователю в случае возникновения данной ошибки.
08.05.2013 в 12:39

то есть базовые знания http у вас так и не появились ок
08.05.2013 в 16:15

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
ehlo_kitty, то есть базовые знания http у вас так и не появились ок

А вы всё так же в своём репертуаре)))

По-моему, вполне логично, что если в разных браузерах разная реакция на одну и ту же ситуацию, то отображение этой странички - дело браузера, а не сервера. В противном случае, если бы страничку выдавал сервер, она отображалась бы во всех браузерах, а не только в опере.
08.05.2013 в 16:51

вот же у вас каша в голове
10.05.2013 в 22:23

Sanctus Satanas
Ryuzaki_rnd, так и что там в итоге-то получилось? )
10.05.2013 в 23:02

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Ну, по совету народа на форумах - написал админу хостинга. Он сказал что это легко лечится (и да, nginx'a там действительно нет). Проблема в том, что у него недавно была операция на горле, поэтому пока у него доступа в сеть нет, чтобы решить вопрос, ибо в больнице пока. Но он сказал, что решается всё легко.

Так что ждём-с, благо пока поток больших файлов не начался.
11.05.2013 в 00:51

Sanctus Satanas
и да, nginx'a там действительно нет
Ну это не отменяет того, что он, вероятно, есть там, куда у вас запрос уходил.
11.05.2013 в 00:53

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Ну это не отменяет того, что он, вероятно, есть там, куда у вас запрос уходил.

Ну как бы странно. Меньше 20 метров - запрос куда надо, а больше - куда-то налево? Тем более, что напрямую к скрипту обращаюсь.
11.05.2013 в 00:57

Sanctus Satanas
Ryuzaki_rnd, а откуда известно, что меньше 20 метров — туда, куда надо? В отладчике что видно? Вот прямо с заголовками запроса и ответа.
11.05.2013 в 01:40

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, а откуда известно, что меньше 20 метров — туда, куда надо?

В /var/ появляется файлик с именем php????? (? - произвольный буквенный символ) и когда он достигает размера загружаемого файла - он исчезает и в каталоге назначения появляется загруженный файл с родным именем.
11.05.2013 в 01:41

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Да и вообще было бы странно - запускаешь скрипт с сервера, куда файлики складываются, а он своим же скриптом на себя же качает через сторонний хост?
11.05.2013 в 01:50

вас просят заголовки посмотреть, а вы пускаетесь в рассуждения что странно а что нет. вы вообще представляете себе как обычно nginx используется? что такое обратный прокси? хватит гадать, соберите наконец факты.
11.05.2013 в 03:50

Sanctus Satanas
Ryuzaki_rnd, это не совсем точное описание процесса.
Полностью это выглядит как-то так:

1. Вы отправляете форму в браузере.
2. Браузер резолвит IP хоста. В свою очередь, этот процесс примерно такой:
2.1. Если хост уже резолвился раньше, берётся из кеша.
2.2. Если ещё нет, спрашивает у вашей ОС.
2.3. Система смотрит /etc/hosts.
2.4. Если нет в /etc/hosts, смотрит, какой у вас прописан DNS-сервер. Спрашивает у него.
3. Браузер стучится на указанный IP. По умолчанию, для HTTP это порт 80.
4. Отсылает запрос:

POST /upload.php HTTP/1.1
Host: example.net
Content-Length: 1048576
Content-Type: multipart/form-data; boundary=SomeRandomString

--SomeRandomString
Content-Disposition: form-data; name="input_name"; filename="file_name.jpg"
Content-Type: image/jpeg

...бинарные данные файла...
--SomeRandomString--


5. ...
6. Сервер передаёт это всё добро интерпретатору PHP. Точный механизм передачи зависит от того, как подключён PHP.
7. PHP записывает данные во временный файл php?????? в каталог, указанный директивой upload_dir.
8. PHP выполняет скрипт, формирует ответ и передаёт его серверу.
9. ...
10. Браузер получает ответ:

HTTP/1.1 200 OK
Server: Diesel Coffee Machine/1.0
Content-Type: text/html; charset=utf-8
Content-Length: 100500

...код хтмл...


11. Показывает ответ вам.

Штука в том, что в пунктах 5 и 9 может происходить всё, что угодно. Например, где-то стоит nginx и проксирует запросы к Apache.
Если на стороне PHP вывести $_SERVER['REMOTE_ADDR'] — вы увидите, с какого IP приходит запрос. Если это не ваш IP или вообще что-нибудь типа 127.0.0.1 — очевидно, что между вами всё-таки кто-то есть. Впрочем, это тоже не гарантия, т.к. на стороне Apache может стоять что-нибудь вроде mod_rpaf или mod_realip и переписывать REMOTE_ADDR. Поэтому также есть смысл вывести вообще весь $_SERVER и убедиться, что в нём нет чего-нибудь вроде X-Real-IP, X-Forwarded-For и тому подобного.
11.05.2013 в 04:13

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Ну вот вывод $_SERVER

[HTTP_HOST] => My_Domain
IP мой, тот же, который мне 2ip.ru показывает
[HTTP_X_REAL_IP] => 178.76.246.254
[HTTP_X_FORWARDED_FOR] => 178.76.246.254
[HTTP_CONNECTION] => close
[HTTP_USER_AGENT] => Opera/9.51 (Windows NT 5.1; U; ru)
[HTTP_ACCEPT] => text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
[HTTP_ACCEPT_LANGUAGE] => ru-RU,ru;q=0.9,en;q=0.8
[HTTP_ACCEPT_CHARSET] => iso-8859-1, utf-8, utf-16, *;q=0.1
[HTTP_ACCEPT_ENCODING] => deflate, gzip, x-gzip, identity, *;q=0
[HTTP_REFERER] => My_Domain/test.php
[HTTP_COOKIE] => My_Cookie
[HTTP_COOKIE2] => My_Cookie2
[HTTP_TE] => deflate, gzip, chunked, identity, trailers
[CONTENT_LENGTH] => 30468
[CONTENT_TYPE] => multipart/form-data; boundary=----------W5bvEvQqZoLaurUO6AbwgZ
[PATH] => /usr/local/bin:/usr/bin:/bin
[SERVER_SIGNATURE] =>
[SERVER_SOFTWARE] => Apache
[SERVER_NAME] => My_Domain
[SERVER_ADDR] => 10.0.92.4
[SERVER_PORT] => 80
А вот тут вот не мой IP. То бишь, по вашим словам, получается что кто-то есть между нами. (что вроде логично, учитывая что у компании-хостера куча хостов и наверняка не все имеют личный IP, а лазят в тырнет через внутреннюю сеть)
[REMOTE_ADDR] => 10.0.99.8
[DOCUMENT_ROOT] => /export/hosts/My_Domain/documents
[SERVER_ADMIN] => [email protected]
[sсript_FILENAME] => /export/hosts/My_Domain/documents/test2.php
[REMOTE_PORT] => 57665
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.0
[REQUEST_METHOD] => POST
[QUERY_STRING] =>
[REQUEST_URI] => /test2.php
[sсript_NAME] => /test2.php
[PHP_SELF] => /test2.php
[REQUEST_TIME] => 1368230733
[argv] => Array ( )
[argc] => 0


И тем не менее, если сообщение выдаётся сервером-посредником, то почему оно только в опере выдаётся?
11.05.2013 в 04:27

Sanctus Satanas
То бишь, по вашим словам, получается что кто-то есть между нами.
А точнее так: ваш IP — 178.76.246.254, запрос приходит с 10.0.99.8, а Apache+mod_php стоят на 10.0.92.4. Судя по всему, на 10.0.99.8 находится nginx. На самом деле там может быть хоть 100 нжинксов и ещё чёрт в ступе, но как минимум так.

И тем не менее, если сообщение выдаётся сервером-посредником, то почему оно только в опере выдаётся?
Кто его знает... Например, старые версии IE и Chrome на ответы со статусом >= 400 показывали собственную user-friendly страничку, если оригинальный ответ был меньше 512 байт. Впрочем, в актуальных версиях такого вроде бы нигде не должно быть. У меня, правда, есть ещё предположение, но проверять лениво. )
11.05.2013 в 04:35

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Кто его знает... Например, старые версии IE и Chrome на ответы со статусом >= 400 показывали собственную user-friendly страничку, если оригинальный ответ был меньше 512 байт.

Ну вот, если бы в новых фф и хроме показывалось, а в старушке опере нет, то как-то понятней было бы. А так получается, что старушка обрабатывает то, где свежие браузеры тупо выдают что сервер не доступен.



Судя по всему, на 10.0.99.8 находится nginx. На самом деле там может быть хоть 100 нжинксов и ещё чёрт в ступе, но как минимум так.

Значит всё дело в том, что появился посредник (ну или настройки у него сбились). Потому что в феврале проблемы ещё не было.
11.05.2013 в 04:45

Sanctus Satanas
Значит всё дело в том, что появился посредник (ну или настройки у него сбились). Потому что в феврале проблемы ещё не было.
Угу.

Ну вот, если бы в новых фф и хроме показывалось, а в старушке опере нет, то как-то понятней было бы.
Надо посмотреть, что в точности приходит в Chrome (напоминаю, что отладчик доступен по Ctrl-Shift-I или F12).
11.05.2013 в 06:30

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Эм... для идиота, что там смотреть надо?

Обнаружил, что у хрома есть замечательная функция - он свои действия комментирует слева внизу. При загрузке файла в 60 Мб вначале загруил 34%, затем сбросился и начал заново. Дошёл до 36% и выдал "101 Соединение сброшено".
11.05.2013 в 07:21

Sanctus Satanas
Ryuzaki_rnd, ну понятно. Думаю, что из-за этого: code.google.com/p/chromium/issues/detail?id=174...
А смотреть надо было сюда: savepic.net/3630012.htm
11.05.2013 в 16:03

Sanctus Satanas
Хе-хе. И это таки действительно описано в документации nginx словами «Следует иметь в виду, что браузеры не умеют корректно показывать эту ошибку», правда, без пояснения, что имеется в виду. А речь о том, что некоторые браузеры не соблюдают рекомендацию из RFC 2616, п. 8.2.2 и продолжают слать запрос, игнорируя сообщение об ошибке до окончания отправки, что, в свою очередь, в некоторых ситуациях приводит к тому, что браузер отображает ошибку соединения вместо ответа сервера.
11.05.2013 в 16:49

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, А смотреть надо было сюда:

Странно, но у меня такого нет.
savepic.org/3473816.htm
Хотя хром пишет, что установлена последняя версия.
11.05.2013 в 16:58

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Странно, но у меня такого нет.

upd: Нашёл. Надо было просто по одному из загруженных элементов ткнуть.

Тады да, светит что nginx в сети.


Request URL: my-domain/test.php
Request Method: GET
Status Code: 200 OK

Request Headers view source
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control: max-age=0
Connection: keep-alive
сoоkiе: my-cookie
Host: my-domain
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31

Response Headers view source
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Date: Sat, 11 May 2013 13:00:47 GMT

Server: nginx

Transfer-Encoding: chunked
X-Powered-By: PHP/5.2.6-1+lenny13

11.05.2013 в 17:24

Sanctus Satanas
Ryuzaki_rnd, в Опере есть такая же штука, называется Opera Dragonfly. Если я не ошибаюсь, то как раз с версии 9.5. В Firefox есть Firebug (это расширение). В Safari примерно то же, что в Chrome. И даже в IE есть Developer Tools. Учитесь ими пользоваться и многое станет понятным.
11.05.2013 в 17:27

firebug несколько потерял актуальность с тех пор как в фх появилась приличная встроенная консоль