Nginx Varnish Nginx Django?

13

У меня есть приложение django, и я хочу настроить Varnish на сервере перед ним. В другой ветке о серверных ошибках кто-то предложил поставить Nginx перед Varnish.

Должен ли я поставить Nginx перед Varnish на сервере кэширования? Если да, должен ли я использовать Nginx на сервере приложений?

Энрико
источник

Ответы:

10

Мы говорим всего о 1-3 интерфейсных серверах, а не о большой ферме серверов с балансировкой нагрузки между уровнями?

Помещение nginx перед Vanish позволяет вам выполнять сжатие HTTP на лету. Это лучшая практика производительности, но от нее можно отказаться. (Содержимое в Varnish часто остается несжатым, поэтому ESI включает в себя работу, и вам не нужно иметь дело с несколькими кэшированными версиями одного и того же объекта в зависимости от соответствия заголовка / браузера Vary.)

Что касается nginx на сервере приложений - разве Apache с mod_wsgi не является рекомендуемым и наиболее распространенным способом развертывания новых установок Django в настоящее время? Я не знаю убедительной причины использования nginx / fastcgi над Apache / mod_wsgi для Django; но вы должны получить совет от эксперта Django.

Что касается Varnish, имеющего привлекательные функции балансировки нагрузки, которых нет в nginx, я не понимаю, что это такое? Лак имеет случайную и круговую балансировку. У nginx есть циклический перебор, клиентский IP и постоянное хеширование - я не вижу существенной выгоды для Varnish? Это изящная перезагрузка конфигурации VCL или Varnish или что-то еще?

Для небольшой настройки сервера 1-3, я думаю, я бы просто сделал

Лак -> Apache / mod_wsgi / Django

или, может быть

Squid -> Apache / mod_wsgi / Django

и игнорировать HTTP-сжатие для простоты, если пропускная способность не является дорогой.

Обновить:

Грэм Дамплтон написал ценный комментарий ниже. Он упоминает очень распространенную настройку, например, блог на VPS или небольшую веб-ферму без кэширования:

nginx -> Apache / mod_wsgi / Django

Это очень хорошее решение по нескольким причинам:

  1. Простая настройка
  2. nginx, обладающий высокой скоростью и минимальными издержками, обрабатывает статическую обработку файлов и поддержку активности соединения с браузером.
  3. Django работает в отличной mod_wsgi Грэма Дамплтона, рекомендуемой платформы для Django.

Первоначально я не упомянул об этом из-за того, что OP, казалось, требовал Varnish, очень высокопроизводительного решения для кэширования. Комбо nginx / Apache / mod_wsgi не может выполнять кэширование с уровнем производительности и гибкости, который соответствует Varnish.

Джеспер М
источник
2
Вы даже можете использовать 'nginx -> Apache / mod_wsgi / Django', как это делают многие люди по разным причинам.
Грэм Дамплтон
4
Другая вещь, которую nginx предоставляет в этом случае использования, который многие не осознают, это то, что nginx изолирует Apache от медленных клиентов. Это связано с тем, что nginx не запрашивает содержимое до определенного размера. Вместо этого он буферизует заголовки запросов и контент и только прокси-запрос, когда он у него есть. Это означает, что он передает его Apache только тогда, когда доступна вся информация, необходимая для обработки запроса. Таким образом, Apache / mod_wsgi будет занят как можно дольше, а процессы / потоки не будут связаны медленным клиентом. Мера буферизации также происходит на оборотной стороне, поэтому Apache также может завершить работу быстрее.
Грэм Дамплтон
2
@Graham Dumpleton: Очень приятно, что ты здесь, надеюсь, ты останешься рядом. :-) Что касается nginx HTTP-мультиплексирования / интеллектуальной обработки соединений, я полностью согласен.
Джеспер М
Прежде всего, спасибо Джесперу и Грэму за то, что они нашли время, чтобы написать такие исчерпывающие ответы. Я планирую разместить сервер балансировки нагрузки перед двумя серверами приложений. Один сервер будет обрабатывать большую часть трафика, а второй используется в основном для восстановления после отказа и бета-тестирования новых функций.
Энрико
Varnish привлекателен, потому что дает мне полный контроль над тем, какие запросы отправляются на какой сервер. Лак также проверяет работоспособность бэкэнд-серверов, отработка отказа проста в настройке и изящно обрабатывает медленные / мертвые бэкэнды (если оба сервера умирают).
Энрико
4

Вы можете использовать nginx без лака для прокси и кеширования контента.

молчаливый
источник
2
У лака есть несколько привлекательных функций балансировки нагрузки, которых нет в nginx
Энрико,
4
какие особенности например?
молчание
4

Я успешно использую Nginx, Varnish и Apache / mod_wsgi / Django. Я начал со следующего конфига:

Nginx -> Apache / mod_wsgi / Django

Как только я начал видеть значительную нагрузку на Apache, я добавил Varnish:

Nginx -> Лак -> Apache / mod_wsgi / Django

Я использую Nginx как своего рода «маршрутизатор URL». Запросы администратора Django отправляются напрямую из Nginx в Apache. Клиентские запросы отправляются из Nginx в Varnish, который кэширует запросы от Apache, а также обслуживает «грациозные» элементы из кэша, если серверы приложений недоступны.

Мой сервер Nginx также напрямую обслуживает определенный статический контент (например, изображения, CSS и файлы javascript).

В целом, производительность была превосходной. Я заметил пару предостережений, о которых следует упомянуть:

  1. На загруженном сайте перезапуск Varnish может привести к скачку нагрузки на серверах приложений, поэтому лучше всего сводить перезапуски Varnish к минимуму. (Кажется, у Varnish нет «перезагрузки», как у Nginx / Apache, где он просто перечитывает свои файлы VCL). И наоборот, перезагрузка конфигурации Nginx оказывает минимальное влияние. По этой причине я делаю большую часть перезаписи URL и «маршрутизации» в Nginx.
  2. Лак легко заложить между Nginx и Apache. Если вы начнете замечать высокую нагрузку на серверы приложений, добавление лака даже с конфигурацией по умолчанию может действительно изменить ситуацию.
  3. Если вы используете Varnish, вам определенно нужно подумать о том, как вы собираетесь обрабатывать аннулирование кэша.
  4. Мой опыт показывает, что Varnish обрабатывает неудачные бэкэнды немного более изящно, чем Nginx (как вы указывали ранее).
Давид Нараян
источник
Я никогда не видел лака за чем-то другим. Varnish - это обычно балансировщик нагрузки, который выполняет URL-маршрутизатор. Итак, у вас есть 2 веб-сервера и 1 прокси-сервер или 2 прокси-сервера и 1 веб-сервер? Q
ioanb7
2

Я использую Nginx-> Varnish-> uWSGI-> Django

Механизм
источник