Код состояния 502 (зависание сервера) при запросе POST HTTPUrlConnection на некоторых устройствах Android - PullRequest
0 голосов
/ 30 апреля 2019

Я публикую некоторые данные с помощью вызова API POST со следующей функцией:

conn = (HttpURLConnection) url.openConnection();
        conn.setConnectTimeout(40000);
        conn.setReadTimeout(40000);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setDefaultUseCaches(false);
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.addRequestProperty("Cache-Control", "max-age=0");
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setRequestProperty(JsonKeys.DATE_KEY, getTimeStamp());

if (params != null) {
            // Write serialized JSON data to output stream.
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(params.toString());

            wr.close();
        }

int status = conn.getResponseCode();
        StringBuilder sb = new StringBuilder();
        try {
            if (status == HttpURLConnection.HTTP_OK || status == HTTP_CREATED) {
                InputStream is = conn.getInputStream();
                int ch;
                while ((ch = is.read()) != -1) {
                    sb.append((char) ch);
                }
                is.close();
                return new JSONObject(sb.toString());
            } else {
throw new IOException("We encountered some problem with the request. Please try again later");
} catch (JSONException jex) {
            MessageUtils.showLog(jex);
    } finally {
        if (conn != null) {
            MessageUtils.showLog("connection disconnected");
            conn.disconnect();
        }
    }

Этот запрос POST должен ждать как минимум 40 секунд ответа от сервера. Этот код прекрасно работает на большинстве устройств, но на некоторых устройствах запрос заканчивается внезапно через 10 секунд. Я получаю ответ 502 (например, через 10 секунд). В журнале сервера нет следов отправки ответа (подтверждено моим внутренним разработчиком). Поток ошибок для 502, который я получаю в своем интерфейсе, содержит это:

<HEAD><TITLE>Server Hangup</TITLE></HEAD>

Я понятия не имею, почему это ведет себя по-разному для разных мобильных устройств или разных API Android. Может кто-нибудь помочь мне с пониманием этой проблемы или решения? Я застрял на этой проблеме в течение нескольких часов и не могу найти объяснение / решение ее.

Это трассировка стека, которую мы получаем в журнале доступа Apache:

    [Wed May 01 13:54:54.142877 2019] [proxy:error] [pid 23000:tid 140687508961231] (111)Connection refused: AH00957: HTTP: attempt to connect to 127.0.0.1:9000 (localhost) failed
[Wed May 01 13:54:54.142995 2019] [proxy:error] [pid 23000:tid 140687508961231] AH00959: ap_proxy_connect_backend disabling worker for (localhost) for 60s
[Wed May 01 13:54:54.143001 2019] [proxy_http:error] [pid 23000:tid 140687508961231] [client 160.32.32.202:256560] AH01114: HTTP: failed to make connection to backend: localhost

Конфигурация прокси на нашем сервере выглядит примерно так:

    <Location "/v2/">
               ProxyPass http://0.0.0.0:9000/ retry=0 timeout=500
               ProxyPassReverse http://0.0.0.0:9000
       </Location>
ProxyPreserveHost On
       ProxyRequests Off
       <Proxy *>
               Order deny,allow
               Allow from all
       </Proxy>

1 Ответ

0 голосов
/ 01 мая 2019

502 на самом деле «плохие ворота». Это определенно проблема с сервером. У вас есть модуль apache, который проверяет стабильное соединение, и этот модуль обнаруживает, что ваше соединение не в порядке.

Из обновленного вопроса видно, что свойство 'retry' в вашем прокси равно 0. Вот значение из документации:

https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass

1009 * повтор *

Время ожидания повторной попытки работника пула соединений в секундах. Если рабочий пул соединений с внутренним сервером находится в состоянии ошибки, Apache httpd не будет пересылать запросы этому серверу до истечения времени ожидания. Это позволяет отключить сервер бэкэнда для обслуживания и позже вернуть его в оперативный режим. Значение 0 означает, что работники всегда повторяются в состоянии ошибки без тайм-аута.

Так что определенно проблема в другом запросе, а не в другом андроиде. Пожалуйста, проверьте ваши запросы. Запросы, которые вы отправляете, могут отличаться, и сервер может обнаружить соединение как мертвое, что позволяет думать, что проблема в Android. Вы также можете поиграть с параметром retry и установить его по умолчанию retry = 60 .

...