Заброшенный процесс Apache, как долго он будет продолжаться? - PullRequest
0 голосов
/ 10 ноября 2009

Допустим, есть серверный процесс, который занимает слишком много времени. Клиент жалуется на то, что он «вышел из строя».

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

Настройка времени ожидания вступит в силу, если возникнут проблемы с подключением к клиенту, как описано в документации . Но если с подключением все в порядке, клиент должен был закрыть его (я верю).

Я предположил, что это также означало, что если клиент закрыл свой браузер, Apache достигнет лимита тайм-аута (в моем случае 300 секунд) и завершит процесс. Похоже, это не так.

Вот как я это проверил:
Я добавил цикл while для некоторого кода на сервере:

too_long = 2000
tstart = time.time()
f = open('/tmp/timeout_test.txt', 'w')
while True:
    time.sleep(100)
    elapsed = time.time() - tstart
    f.write('Loop, %s elapsed\n' % elapsed)
    if elapsed > too_long:
        break

Затем я открываю веб-страницу для запуска этого цикла и запускаю netstat на сервере:

~$ netstat -np | grep ESTAB | grep apache
tcp        0      0 10.102.123.6:443        10.102.119.101:53519    ESTABLISHED 16534/apache2
tcp        0      0 127.0.0.1:60299         127.0.0.1:5432          ESTABLISHED 16534/apache2

(это я на 10.102.119.101, сервер на 10.102.123.6)
Затем я закрыл свой браузер и перезапустил эту строку netstat:

~% netstat -np | grep ESTAB | grep apache
tcp        0      0 127.0.0.1:60299         127.0.0.1:5432          ESTABLISHED 16534/apache2

Мое соединение исчезло, но сервер все еще был в цикле, я мог подтвердить, запустив:

~% lsof | grep timeout
apache2   16534   www-data   14w      REG        8,1        0     536533 /tmp/timeout_test.txt 

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

~% cat /tmp/timeout_test.txt

У меня ничего нет. Через 2000 секунд строка netcat вообще ничего не дала, и файл tmp был заполнен выводом из цикла while.

Итак, похоже, что процесс Apache просто выполняет то, что ему было предложено, независимо от клиентского подключения? А что это за петлевое соединение?

1 Ответ

1 голос
/ 10 ноября 2009

Правильно. В модуле C apache вы можете добавить проверку как:

/* r is the 'request_rec' object from apache */
if (r->connection->aborted) {
    /* stop processing and return */
}

чтобы убедиться, что клиент все еще подключен. Вероятно, интерфейс Python имеет нечто подобное.

Что касается петлевого соединения, это соединение с базой данных postgresql, которое остается открытым до тех пор, пока работает этот цикл.

...