Ошибка прокси 502 «Причина: ошибка чтения с удаленного сервера» с Apache 2.2.3 (Debian) mod_proxy и Jetty 6.1.18

81

Apache получает запросы через порт 80 и передает их в Jetty через порт 8080

The proxy server received an invalid response from an upstream server
The proxy server could not handle the request GET /.

Моя дилемма: все работает нормально (быстрые запросы, несколько секунд или несколько десятков секунд, запросы обрабатываются нормально ). Проблемы возникают, когда обработка запроса занимает много времени (несколько минут?).

Если я вместо этого выдаю запрос непосредственно в Jetty через порт: 8080, запрос обрабатывается ОК. Так что проблема, скорее всего, находится где-то между Apache и Jetty, где я использую mod_proxy . Как это решить?

Я уже попробовал некоторые «хитрости», связанные с настройками KeepAlive, но без удачи. Вот моя текущая конфигурация, есть предложения?

#keepalive Off                     ## I have tried this, does not help
#SetEnv force-proxy-request-1.0 1  ## I have tried this, does not help
#SetEnv proxy-nokeepalive 1        ## I have tried this, does not help
#SetEnv proxy-initial-not-pooled 1 ## I have tried this, does not help
KeepAlive 20                       ## I have tried this, does not help
KeepAliveTimeout 600               ## I have tried this, does not help
ProxyTimeout 600                   ## I have tried this, does not help

NameVirtualHost *:80
<VirtualHost _default_:80>
    ServerAdmin webmaster@mydomain.fi

    ServerName www.mydomain.fi

    ServerAlias mydomain.fi mydomain.com mydomain www.mydomain.com

    ProxyRequests On
    ProxyVia On
    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyRequests Off
    ProxyPass / http://www.mydomain.fi:8080/ retry=1 acquire=3000 timeout=600
    ProxyPassReverse / http://www.mydomain.fi:8080/

    RewriteEngine On
    RewriteCond %{SERVER_NAME} !^www\.mydomain\.fi
    RewriteRule /(.*) http://www.mydomain.fi/$1 [redirect=301L]

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /var/log/apache2/access.log combined
    ServerSignature On

</VirtualHost>

Вот также журнал отладки из ошибочного запроса:

74.125.43.99 - - [29/Sep/2010:20:15:40 +0300] "GET /?wicket:bookmarkablePage=newWindow:com.mydomain.view.application.reports.SaveReportPage HTTP/1.1" 502 355 "https://www.mydomain.fi/?wicket:interface=:0:2:::" "Mozilla/5.0 (Windows; U; Windows NT 6.1; fi; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10"
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: error reading status line from remote server www.mydomain.fi, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::
[Wed Sep 29 20:20:40 2010] [error] [client 74.125.43.99] proxy: Error reading from remote server returned by /, referer: https://www.mydomain.fi/?wicket:interface=:0:2:::

источник
Привет .. Я все еще застрял с этим. Все вышеперечисленные настройки пробовал и тоже увеличение молы maxIdleTime не помогло. Любые указатели, что попробовать дальше?
Мартин

Ответы:

91

Я решил проблему. Keepalive=OnДолжен быть вставлен в ProxyPassконфигурации линии:

ProxyPass / http://www.dom.fi:8080/ retry=1 acquire=3000 timeout=600 Keepalive=On

Видеть, что

Keepalive=On

там? Это критично;)

Мартин
источник
9
Я считаю, что вы можете пометить свои собственные ответы как принятые. Он помечает вопрос как решенный в системе для поиска другими людьми.
sysadmin1138
Куда именно ты положил это?
AlxVallejo
1
@AlxVallejo Вы должны найти свои конфигурационные файлы здесь /etc/apache2/sites-enabled/[sitename].conf
Стивен
1
У нас точно такие же ошибки прокси. Они случаются очень редко (один на тысячу запросов). Почему именно это Keepalive=Onважно?
Dokaspar
Не может ли это быть timeout=600или retry=1это исправляет это вместо этого? (или комбо)
MattBianco
4

Вы пробовали установку setenv proxy-initial-not-pooled 1?

Ссылка здесь

TCampbell
источник
Нет, это не помогло. Тогда речь идет не о состоянии гонки, а о большой задержке, и между ними что-то происходит (какое-то недопонимание между Jetty и mod_proxy).
4

Эта ошибка также может произойти, если вы не заканчиваете свой URL прокси с /. Либо оба пути должны заканчиваться /или ни тем, ни другим.

отметка
источник
1

Глядя на журнал, есть время ожидания 5 минут (= 300 секунд). Это довольно долго ждать ответа. Когда вы обращаетесь к серверу Jetty напрямую, действительно ли этот ресурс занимает столько времени для получения ответа?

Если пять минут действительно находятся в пределах возможного времени ответа, вы можете попробовать настроить директиву конфигурации ProxyTimeout.

В зависимости от настроек вашей сети, вполне может быть, что нет никакой причины даже пытаться использовать какую-либо систему поддержки активности (существует ли межсетевой экран между сервером приложений и прокси-сервером, который может быть настроен для удаления сеансов, которые простаивают слишком долго?) , но ProxyTimeout повлияет на поведение самого прокси.

Если тот же прокси-сервер также обслуживает другие бэкэнды, было бы лучше сохранить текущий ProxyTimeout и настроить время ожидания в директиве ProxyPass (см. Документацию mod_proxy).

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


источник
«Когда вы получаете прямой доступ к серверу Jetty, действительно ли этот ресурс занимает так много времени для получения ответа?» -- ДА. Я также пытался установить этот ProxyTimeout на 600. Не помогает. Между прокси и пристанью нет брандмауэра. Тайм-аут настраивается также в ProxyPass.
«Вы не предоставляете ничего ценного для определения того, что это может быть»: я не знаю, что это может быть. Все, что я получаю, это сообщение об ошибке от сервера: Ошибка прокси-сервера Прокси-сервер получил неверный ответ от вышестоящего сервера. Прокси-сервер не может обработать запрос GET /. Причина: ошибка чтения с удаленного сервера
Что касается увеличения тайм-аута прокси-сервера, изменило ли это также время, в течение которого ваш браузер вращался до получения ошибки 502?
Затем рассмотрим, как вы можете узнать, что происходит на сервере приложений: вы можете взять пару дампов потоков и посмотреть на них, что выполняется, когда браузер ждет. В качестве альтернативы, добавьте достаточно операторов ведения журнала отладки, чтобы иметь возможность отслеживать ваш код, чтобы точно определить причину замедления.
Я знаю, почему это медленно. Я не знаю, почему прокси-сервер Apache отказывается отвечать, когда он наконец готов.
0

Для меня удаление значения заголовка Transfer-Encoding" (binary)в моем приложении-сервере (PHP) решило проблему для:

[proxy_http: ошибка] [pid 17623] (22) Недопустимый аргумент: [клиент 127.0.0.1:44929] AH01102: ошибка чтения строки состояния с удаленного сервера 0.0.0.0:80

Все остальные предложения понравились SetEnv proxy-initial-not-pooledили Keep-Aliveне сделали.

stackoverclan
источник
0

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

Например, я обнаружил, что причиной моей проблемы была замена всех экземпляров #LoadModule на LoadModule во всех моих конфигурационных файлах Apache. Так как это решило проблему для меня, поэтому я знал, что моя проблема не была отсутствующим аргументом директивы KeepAlive, а скорее моей проблемой была отсутствующая зависимость.

Потому что, помните, .so файлы - это в основном статические библиотеки. Включение модуля не означает, что он привыкнет, но его отключение означает, что он не может быть использован, и поэтому все, что от него зависит, обязательно потерпит неудачу.

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

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

Также обратите внимание: я использую специальный проект git для отслеживания всех файлов конфигурации apache моей локальной машины. Таким образом, я могу выполнять такие виды глобальных операций поиска и замены в моем рабочем каталоге конфигурации Apache, как этап устранения неполадок. Если включение всех модулей выполнено успешно, попробуйте отключить их снова один за другим и перезапустить apache между ними, пока не найдете нужный модуль, который нужно оставить включенным. Как только вы это выясните, верните репо в исходное состояние и включите только тот модуль, который должен быть включен.

Вы также обнаружите, что использование git для отслеживания ваших конфигурационных файлов apache очищает эти каталоги, так как вам больше не понадобятся эти старомодные файлы .bak и .default.

CommaToast
источник
1
каждая библиотека имеет свою особенность, не обязательно связанную с прокси
Арнольд Роа