Внутренняя ошибка сервера при загрузке файла

Ошибка
У меня есть веб-приложение с массовой загрузкой фотографий (Plupload), и когда я загружаю, скажем, двадцать фотографий, около шести (около 30 %) завершается ошибкой внутреннего сервера. Я проверил файл error.log Apache для этого домена, и в нем нет ничего нового (я знаю, что смотрю на правильный файл error.log, поскольку здесь отображались более старые ошибки).

Это происходит только на моем VPS на серверах Dreamhost (мой хостинг-провайдер), в то время как на моем сервере разработки все работает гладко.

О, и все раньше работало нормально месяц назад, а потом просто начало давать сбои. В то время я использовал Uploadify, и, поскольку он использовал Flash, я не мог отладить, где загрузка не удалась.

Файлы и сценарий
Загруженные файлы представляют собой фотографии, все размером около 100 КБ, хотя я успешно загрузил (и все еще могу) фотографии размером 3 МБ. Мой .htaccess, естественно, не меняется во время загрузки. На стороне сервера есть PHP-скрипт, который использует библиотеку GD2 для перемещения и изменения размера фотографии.

Состояние сервера
Недавно я увеличил объем оперативной памяти своего VPS с 300 до 400 МБ. Раньше эта штука работала, и я обновил ее, чтобы исключить память как причину. Также мой лимит памяти для PHP составляет 200 МБ, так что этого должно быть достаточно.

Меня очень расстраивает, что Dreamhost не хочет помогать, заявляя, что «мы не можем нести ответственность за ошибку, вызванную вашим кодом» и «Мы по-прежнему не сможем помочь вам в отладке проблемы». к сожалению."
Это была неделя скудной "поддержки", пока мое приложение не работает, а мои клиенты разочарованы.

Вопросы

  1. Является ли такая поддержка «Вы сами по себе» стандартом в отрасли, т. Е. Ваш хост справится с этим по-другому?
  2. Как именно можно это отладить?

person duality_    schedule 12.06.2012    source источник
comment
Это не говорит ничего нового. У меня есть несколько старых записей, но когда я повторяю ошибку, ничего нового нет, поэтому вы можете считать ее пустой.   -  person duality_    schedule 12.06.2012
comment
Обычно в среде общего хостинга существует ограничение на максимальное количество параллельных процессов, что может объяснить, почему он работает в среде разработки. Возможно, вам просто нужно ограничить загрузчик, чтобы обрабатывать меньше файлов одновременно.   -  person Linus Kleen    schedule 12.06.2012
comment
Интересно, попробую такой. Но я нахожусь на виртуальном частном сервере (VPS), поэтому я думаю, что это не должно иметь место (не уверен).   -  person duality_    schedule 12.06.2012
comment
Q1: Да, похоже, это де-факто в отношении vps-хостов. Q2: Ошибка 500? Вы включили отчеты об ошибках в php.ini?   -  person Teson    schedule 12.06.2012
comment
Этот VPS на самом деле управляется, и они говорят, что у вас будет круглосуточный (24 × 7) доступ к нашим опытным представителям технической поддержки по электронной почте и в чате. У меня для error_reporting установлено значение E_ALL.   -  person duality_    schedule 12.06.2012
comment
Да - php_flag display_errors включен в моем .htaccess.   -  person duality_    schedule 12.06.2012
comment
проверьте каталог скрипта, однажды я ничего не смог найти в своем журнале ошибок, но потом обнаружил, что он сохраняет журнал ошибок для каждой папки, в которой происходит ошибка   -  person SAFAD    schedule 15.06.2012
comment
Если у вас есть display_errors = on для цели загрузки на стороне сервера, а загрузка происходит в фоновом режиме, вы можете не видеть ошибки, которые он генерирует на этой стороне. У вас тоже log_errors = 1? Если да, проверьте файл журнала, найденный в error_log (например, /var/log/apache2/phperror.log), если он дает какие-либо подсказки.   -  person Fanis Hatzidakis    schedule 16.06.2012
comment
измените уровень журнала на отладку, и вы получите что-то более значимое в журналах. (по умолчанию предупреждение)   -  person Nehal Dattani    schedule 18.06.2012
comment
пробел... если он выйдет из строя после того, как хранилище cetain может быть пространством.   -  person encodes    schedule 18.06.2012


Ответы (4)


Я собираюсь предположить, что у вас есть стандартная установка Apache + PHP. Одной из возможных конфигураций является установка с предварительным разветвлением; в этом случае Apache будет адаптироваться к нагрузке системы, разветвляя больше своих дочерних элементов.

Имея всего 400 МБ ОЗУ, у вас довольно тесно, поэтому, если вы запускаете 20 процессов, каждый из которых занимает 200 МБ (при условии, что каждый процесс обрабатывает довольно большие файлы с использованием GD), вы попадаете в неприятную ситуацию с диспетчером памяти.

Я бы сначала уменьшил общее количество экземпляров до 2, чтобы посмотреть, как это пойдет; также следите за использованием памяти, запустив top.

Несмотря на это, вам может быть полезно запустить отдельный диспетчер задач, такой как Gearman, для выполнения задач по изменению размера, чтобы загрузка была сосредоточена только на перемещении загруженного файла и выполнении задачи изменения размера; таким образом вы можете значительно уменьшить объем памяти, необходимой для запуска ваших экземпляров PHP.

person Ja͢ck    schedule 15.06.2012

Что касается вашего Q1: простой ответ заключается в том, что вы получаете то, за что платите. Dreamhost VPS с 300 МБ ОЗУ стоит ~360 долларов США в год. Для этого вы получаете услугу VPS и ответы на отказ услуги, связанные с предоставлением виртуальной среды. ОС, программный стек и приложения не входят в объем этой услуги. Почему? Такая поддержка пользовательской базы знаний может стоить 50-300 долларов США в час. Вы поступаете неблагоразумно и вводите себя в заблуждение, если ожидаете, что Dreamhost предоставит такие услуги на безвозмездной основе. Это то, что делают сайты, подобные этому.

Поэтому я предлагаю вам смириться с этим гневом и разочарованием и решить, как помочь себе.

Что касается вашего Q2. (i) Вам нужно понять, куда ведут ваши ошибки Apache; (ii) То же самое с любыми ошибками SQL, если вы используете D/B. (iii) Вам необходимо убедиться, что ведение журнала ошибок PHP включено, и проверить, куда направляются журналы PHP. (iv) Вам необходимо проверить эти журналы и убедиться, что ведение журналов работает правильно, с помощью небольшого скрипта, который генерирует ошибки времени выполнения.

Вам также следует рассмотреть возможность использования расширенных средств, таких как php_xdebug, для улучшения уровней ведения журнала и внедрения ведения журнала приложений.

По моему опыту, системы и функции редко умирают бесшумно. Однако разработчики приложений часто игнорируют возвращаемые статусы и т. д. Например, в библиотеке GD функция imagecopyresized() может дать сбой, и она возвращает код состояния, чтобы сообщить приложению, когда это произошло, но если приложение не t проверить этот статус и действовать соответствующим образом, тогда он может в конечном итоге тихо пройти по странным путям выполнения и просто показаться пользователю (или разработчику) как «он просто перестал работать».

Мой последний комментарий заключается в том, что вам действительно следует подумать о настройке частного VPS в вашей среде разработки, которая отражает вашу производственную конфигурацию Dreamhost, и использовать ее для интеграции, приемочного тестирования и поддержки. Это довольно легко сделать, и вы можете испортить это и добавить параметры отладки / что, если, а затем откатиться, не загрязняя свою производственную среду. Такие инструменты, как VMare Appliances и VirtualBox, упрощают эту задачу. См. эту запись в блоге, где описано, как я сделал это для своего размещенного сервиса.

person TerryE    schedule 15.06.2012

пытаюсь ответить на вопрос 2: если вы проверили весь свой код и не обнаружили ни одной ошибки, я считаю, что лучшее, что вы можете сделать, это проверить версию всех программ, работающих на сервере (apache, php, ...), например, я помню, что у меня была проблема с веб-службой, которая работала на apache и php, версия php была 5.2.8, и после долгих исследований я обнаружил, что эта версия имеет проблемы с разбором xml-данные.

person MARP    schedule 15.06.2012

Что касается первой части вопроса: Dreamhost предлагает платную службу поддержки с «обратным звонком». Мы использовали это один раз, чтобы получить низкий вниз на что-то. Они очень хороши с общей поддержкой (лучше, чем многие хосты, IMO), но вы не можете ожидать специального обслуживания, и им приходится решать множество мелких вопросов. Но заплатите за обратный звонок, и примерно через 2 минуты по телефону вы получите ответ, который хотите, плюс они получат свои 10 долларов (повторяющиеся) за это время. Вы оба выигрываете. Только не забудьте отменить повторяющиеся платежи.

Что касается второй части вопроса, у нас была такая же проблема с ними. Их ответ (как предложил Линус в комментариях) заключался в том, что они подсчитывают использование ЦП всеми процессами, используемыми вашим «пользователем». Если эта сумма превысит пороговое значение, они просто убьют процесс (процессы), чтобы сократить количество циклов. Никаких сообщений об ошибках, никаких предупреждений, ничего. Процессы могут включать MySQL, CGI (perl) или PHP. Нет возможности отслеживать или предсказывать, и мы не могли запрограммировать это. Решение... не DreamHost, к сожалению. (webhostingtalk.com даст вам множество идей для размещения). Поэтому мы используем для одних сайтов, но не для других.

person Robbie    schedule 16.06.2012