21.10.2010

Насколько нужен второй Apache в качестве бэкэнда?

До недавнего времени использовал один Nginx на 80-м порту и один Apache на 8080 в качестве бэкэнда. PHP обрабатывается как FastCGI.
Пока на сервере всего 250 сайтов, ничего не предвещает беды.

Но вот что будет, если натравить на сервер бэнчмарк...


Если Apache работает в штатном режиме и никто его не дергает:
Concurrency Level:      10
Time taken for tests:   9.982 seconds
Complete requests:      3000
Failed requests:        0
Write errors:           0
Total transferred:      8778000 bytes
HTML transferred:       7929000 bytes
Requests per second:    300.53 [#/sec] (mean)
Time per request:       33.275 [ms] (mean)
Time per request:       3.327 [ms] (mean, across all concurrent requests)
Transfer rate:          858.74 [Kbytes/sec] received

А теперь попробуем во время бенчмарка сделать reload (всего лишь reload, а не restart):
Concurrency Level:      10
Time taken for tests:   11.518 seconds
Complete requests:      3000
Failed requests:        0
Write errors:           0
Total transferred:      8778000 bytes
HTML transferred:       7929000 bytes
Requests per second:    260.46 [#/sec] (mean)
Time per request:       38.394 [ms] (mean)
Time per request:       3.839 [ms] (mean, across all concurrent requests)
Transfer rate:          744.24 [Kbytes/sec] received

Потери порядка 10% на пустом сервере (250 сайтов - 8-я часть от его "крейсерской" загрузки). Не сложно угадать, что начнется на сервере с 2000-2300 сайтами при простом советском релоаде.

Тут нам приходит на помощь директива Nginx:

http {
    upstream backend {
    server aaa.bbb.ccc.ddd:8080;
    server aaa.bbb.ccc.ddd:8090 backup;
    }
}

Пока перегружается первый Apache, второй продолжает обслуживать запросы.

А самое интересное, что теперь можно решить проблему HTTP503, когда Apache просит Nginx постоять в очереди на обслуживание, так как у него нету свободных воркеров на обслуживание запроса. Nginx умеет менять свое поведение в зависимости от ошибки. Например отправить запрос на бэкэнд в случае 503. Делается это через директиву proxy_next_upstream.

Комментариев нет:

Отправить комментарий