Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
[ok]
Есть система, работающая с заяками пользователей. Пользователи периодически загружают файлы. Запущена в мае прошлого года. Работала нормально до сих пор. Сейчас же возникла проблема - перестали загружаться файлы размером больше 20 мб. Хотя ещё в начале февраля нормально всё грузилось.
При попытке загрузить файл больше обозначенного объёма, фф и хром тупо пишут ошибку загрузки страницы, а опера выдаёт:
nginx
Хотя nginx'ом на сервере не пахнет от слова вообще - всегда был апач и есть по сей момент.
Места на хосте достаточно - ещё 20 Гигов свободно.
Вопрос - в чём может быть дело?
Скрипты никак не менял. Ради теста забахал самую примитивную формочку и скриптик - на портативном сервере работает, на рабочем - нет.
.htacess
Формочка
Скрипт, сохраняющий файл.
Есть система, работающая с заяками пользователей. Пользователи периодически загружают файлы. Запущена в мае прошлого года. Работала нормально до сих пор. Сейчас же возникла проблема - перестали загружаться файлы размером больше 20 мб. Хотя ещё в начале февраля нормально всё грузилось.
При попытке загрузить файл больше обозначенного объёма, фф и хром тупо пишут ошибку загрузки страницы, а опера выдаёт:
413 Request Entity Too Large
Хотя nginx'ом на сервере не пахнет от слова вообще - всегда был апач и есть по сей момент.
Места на хосте достаточно - ещё 20 Гигов свободно.
Вопрос - в чём может быть дело?
Скрипты никак не менял. Ради теста забахал самую примитивную формочку и скриптик - на портативном сервере работает, на рабочем - нет.
.htacess
Формочка
Скрипт, сохраняющий файл.
php_value post_max_size 350M
удали, проверь.
пропиши в байтах, проверь.
Удалил. Выдаваемое phpinfo() сменилось на 2 и 8 Мб соответственно.
Меньше 20 метров - грузит, но не сохраняет.
Больше 20 метров - не грузит и сразу выдаёт ошибку.
Прописал в байтах.
Меньше 20 метров - грузит и сохраняет.
Больше 20 метров - не грузит и сразу выдаёт ошибку.
-----------------------------------------------------------------------
Просто непонятно, что вообще произошло. Ещё в феврале пользовались и всё работало нормально, а сейчас с тем же самым, но теперь выёживается(((
Первый сбой за год работы. При том, что не меняли ничего.
ну посмотрите кто у вас слушает 80 порт. заодно проверьте на какой хост вы ходите на самом деле.
Никак. Факт есть факт - поиск по всем файлам системы не выявил ни одного с файла, содержащего в названии 'nginx'. Так что сдаётся мне, что это просто свёрстанная страничка, ибо нигде более он не упоминается.
И да, я не уверен, что её сервер выдаёт, возможно просто опера подставляет. Т.к. ни в фф, ни в хроме эта ошибка не отображается. Они просто выдают что страница не может быть загружена. А народ в гугле говорит, что 413-ю не все браузеры могут обработать нормально.
А на 80-м апач и сидит. Он там с момента поднятия сервера.
Ну что за хрень? Опера ничего не знает ни про какой 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>
Да без понятия. Просто факт есть факт - при возникновении данной ошибки, одни браузеры тупо стопарятся, а опера выдаёт страничку. Вот я и предположил, что данная страничка есть в составе оперы и выдаётся пользователю в случае возникновения данной ошибки.
А вы всё так же в своём репертуаре)))
По-моему, вполне логично, что если в разных браузерах разная реакция на одну и ту же ситуацию, то отображение этой странички - дело браузера, а не сервера. В противном случае, если бы страничку выдавал сервер, она отображалась бы во всех браузерах, а не только в опере.
Так что ждём-с, благо пока поток больших файлов не начался.
Ну это не отменяет того, что он, вероятно, есть там, куда у вас запрос уходил.
Ну как бы странно. Меньше 20 метров - запрос куда надо, а больше - куда-то налево? Тем более, что напрямую к скрипту обращаюсь.
В /var/ появляется файлик с именем php????? (? - произвольный буквенный символ) и когда он достигает размера загружаемого файла - он исчезает и в каталоге назначения появляется загруженный файл с родным именем.
Полностью это выглядит как-то так:
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 и тому подобного.
[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
И тем не менее, если сообщение выдаётся сервером-посредником, то почему оно только в опере выдаётся?
А точнее так: ваш 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 байт. Впрочем, в актуальных версиях такого вроде бы нигде не должно быть. У меня, правда, есть ещё предположение, но проверять лениво. )
Ну вот, если бы в новых фф и хроме показывалось, а в старушке опере нет, то как-то понятней было бы. А так получается, что старушка обрабатывает то, где свежие браузеры тупо выдают что сервер не доступен.
Судя по всему, на 10.0.99.8 находится nginx. На самом деле там может быть хоть 100 нжинксов и ещё чёрт в ступе, но как минимум так.
Значит всё дело в том, что появился посредник (ну или настройки у него сбились). Потому что в феврале проблемы ещё не было.
Угу.
Ну вот, если бы в новых фф и хроме показывалось, а в старушке опере нет, то как-то понятней было бы.
Надо посмотреть, что в точности приходит в Chrome (напоминаю, что отладчик доступен по Ctrl-Shift-I или F12).
Обнаружил, что у хрома есть замечательная функция - он свои действия комментирует слева внизу. При загрузке файла в 60 Мб вначале загруил 34%, затем сбросился и начал заново. Дошёл до 36% и выдал "101 Соединение сброшено".
А смотреть надо было сюда: savepic.net/3630012.htm
Странно, но у меня такого нет.
savepic.org/3473816.htm
Хотя хром пишет, что установлена последняя версия.
upd: Нашёл. Надо было просто по одному из загруженных элементов ткнуть.
Тады да, светит что nginx в сети.
Request URL: my-domain/test.php
Request Method: GET
Status Code: 200 OK
Request Headers view source
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
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