Могу ли я использовать Apache mod_proxy в качестве пула соединений под Prefork MPM? - PullRequest
5 голосов
/ 10 февраля 2012

Сводка / вопросы:

У меня Apache работает с Prefork MPM, работает php.Я пытаюсь использовать Apache mod_proxy для создания обратного прокси-сервера, через который я могу перенаправить свои запросы, чтобы я мог использовать Apache для создания пула соединений.Пример impl:

в httpd.conf:

SSLProxyEngine On
ProxyPass /test_proxy/ https://destination.server.com/ min=1 keepalive=On ttl=120

, но когда я запускаю свой тест, который является следующей командой в цикле:

curl -G 'http://localhost:80/test_proxy/testpage'

это неКажется, я не использую соединения повторно.

После некоторого прочтения кажется, что я не получаю функциональность пула соединений, потому что я использую Prefork MPM, а не Worker MPM.Поэтому каждый раз, когда я обращаюсь к прокси-серверу, он запускает новый процесс со своим собственным пулом соединений (размером один) вместо использования одного рабочего, который поддерживает свой собственный пул.Правильно ли это истолковано?


Справочная информация:

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

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

Поэтому я пытаюсь использовать обратный прокси-сервер под Apache, чтобы функционировать как пул соединений, чтобы сохранить соединения между процессами php, поэтому я нене нужно делать SSL рукопожатие так часто.

Источники, которые дали мне эту идею:

Ответы [ 3 ]

2 голосов
/ 05 июля 2012

Прежде всего, ваш метод тестирования не может продемонстрировать пул соединений, так как для каждого вызова рождается клиент curl, а затем он умирает.Как мертвые люди не много говорят, мертвый процесс не может поддерживать соединение живым.

У вас есть клиенты, которые беспокоят ваш прокси-сервер.

Client ====== (A) =====> ProxyServer

Давайте назовем это соединение A. Вашепрокси-сервер ничего не делает, это просто понты.Красивый и трудолюбивый сервер настолько скромен, что прячется за ним.

Client ====== (A) =====> ProxyServer ====== (B) =====> WebServer

Здесь, если я не ошибаюсь, защищенное соединение - А, а не В, верно?

Повторение моего первогона вашем тесте вы создаете отдельного клиента для каждого запроса.Каждому клиенту нужно отдельное соединение.Связь - это то, что происходит между двумя сторонами.Одна сторона уходит, и соединение потеряно.

Хорошо, давайте сейчас забудем curl и вместе посмотрим, что мы действительно хотим сделать.

Мы хотим иметь SSL на A, и мы хотим, чтобы сторона AТрафик должен быть максимально быстрым.Для этой цели мы уже разделили сторону B, поэтому она не сделает A еще медленнее, верно?

Пул соединений?Нет такой вещи как пул соединений в A. Каждый клиент приходит и уходит, производя много шума.Единственное, что может помочь вам уменьшить этот шум, это «Keep-Alive», что означает, что соединение с клиентом a будет поддерживаться в течение некоторого короткого промежутка времени, чтобы тот же самый клиент мог запрашивать другие файлы, которые будуттребуется по этому запросу.Когда мы закончим, мы закончим.

Для соединений на B соединения будут объединены;но это не принесет вам никакой производительности, поскольку при настройке с одним сервером у вас не было этой части производства шума.

Как мы можем помочь этой системе работать быстрее?

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

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

Если вы хотите продолжить работу с Apache, переключитесь на mpm_worker с mpm_prefork.В случае более 300 одновременных запросов это будет работать намного лучше.Я действительно понятия не имею о емкости вашего оборудования;но если обработка 300 запросов затруднена, я полагаю, что это небольшое изменение очень поможет вашей системе.

Если вы хотите иметь еще более легкую систему, рассмотрите nginx как альтернативу Apache. очень просто настроить для работы с PHP, и он будет иметь лучшую производительность.

Помимо внешней стороны, также рассмотрите возможность проверки сервера базы данных.Пул соединений будет иметь реальное значение здесь.Убедитесь, что ваша установка PHP настроена на повторное использование подключений к базе данных.

Кроме того, если вы размещаете статические файлы в той же системе, переместите их либо на другой веб-сервер, либо сделайте еще лучше, переместив статический файл.файлы в облачную систему с CDN, например AWS S3 + CloudFront или CloudFiles Rackspace .Даже без CloudFront S3 порадует вас.Решение Rackspace поставляется с Akamai!

Удаление статических файлов сделает ваш веб-сервер "о, что случилось, что это за тишина? Ооо, рай!"так как вы упомянули, что это веб-сайт, и на веб-страницах есть много статических файлов для каждой динамически генерируемой html-страницы.

Я надеюсь, что вы можете спасти беднягу от убийственной работы.

1 голос
/ 06 июля 2012

Проблема в моем случае заключалась в том, что пул соединений между обратным прокси-сервером и внутренним сервером не выполнялся из-за того, что Apache Backend Server закрывал SSL-соединение в конце каждого запроса HTTPS.Apache Server делал это из-за наличия в httpd.conf следующей директивы:

SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown

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

1 голос
/ 03 июля 2012

Prefork по-прежнему может объединять в пул 1 соединение на внутренний сервер для каждого процесса.

Prefork не обязательно создает новый процесс для каждого запроса веб-интерфейса, процессы сервера «объединяются» сами по себе, и поведение зависит, например, от MinSpareServers./ MaxSpareServers и друзья.

Чтобы максимизировать частоту, с которой процесс prefork будет иметь для вас бэкэнд-соединение, избегайте очень высоких или низких значений maxspareservers или очень высоких minspareservers, поскольку это приведет к тому, что «новые» процессы будут принимать новые соединения.1005 *

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

...