mod_perl2 с apache 2.22 Apache2::RequestIO::print: (103) Программное обеспечение вызвало прерывание соединения
Я пытаюсь перенести приложение mod_perl2 на AWS. Как часть порта, я думал, что перейду с Debian Squeeze на Wheezy с последней стабильной комбинацией mod_perl и Apache2.
Приложение работает вплоть до того момента, когда я пытаюсь написать JSON-ответы клиенту. В этот момент каждый запрос отменяется на клиенте и на сервере я получаю сообщение об ошибке
Apache2::RequestIO::print: (103) Software caused connection abort
всякий раз, когда я пишу клиенту, то есть:
$self->req->print($output);
я пробовал tcpdump
Я отвечаю клиенту, и я вижу, как он записывается, но на стороне клиента ответ не получен, а просто фишки. Я не могу найти информацию о том, как обойти это.
1 ответ
Я нашел довольно много людей, спрашивающих об этом вопросе в сети без многих ответов. Решение моей проблемы было очень конкретным, но я решил опубликовать то, что я сделал в любом случае, это может кому-то помочь.
Клиент отменял запрос до того, как ответ был полностью написан, что приводило к отключению Apache::RequestIO (по причинам, которые я до сих пор не знаю). Я не мог понять, почему я видел это поведение.
Используя tcpdump
Я мог видеть, что данные были записаны клиенту - и это выглядело хорошо.
Просматривая страницу в Chrome и просматривая сетевой стек, я увидел, что мой запрос данных отменяется после того, как не было получено никакого ответа (что было странно, потому что код хорошо работал на других серверах, и я мог видеть, что ответ пишется). Отладка была труднее, потому что из-за сбоя Apache с ошибкой в распечатке ввода-вывода я не мог проверить, равны ли записанные байты байтам данных. Я не был уверен, что что-то застряло на стороне сервера.
Итак, я изменил Content-Type ответа от application/json
в text/html
, чтобы я мог запросить страницу и просто посмотреть на фактический ответ в виде текста. Как только я это сделал, я мог видеть, что ответ был в порядке.
Я начал искать другие причины и обнаружил, что при переходе на новый сервер я пропустил изменение некоторых URL-адресов в БД для указания на новый сервер, что означало, что мое приложение пыталось получить данные из старого DB. Это, в свою очередь, вызывало множество проблем с синхронизацией, которые вызывали мои проблемы. Как только я исправил конфиг, проблемы исчезли.