Я собираюсь развернуть сайт среднего размера на базе Django. У меня есть выделенный сервер Ubuntu.
Я действительно не понимаю, какое серверное программное обеспечение использовать. Поэтому я подумал: почему бы не спросить stackoverflow.
Я ищу:
Я слышал о mod_wsgi и mod_python на Apache, nginx и lighty. Каковы их плюсы и минусы, и скучал ли я по кому-то?
@Barry: Почему-то мне кажется, что Apache для меня слишком раздут. А как насчет альтернатив?
@BrianLy: Хорошо, я еще посмотрю mod_wsgi. Но зачем мне Apache, если я обслуживаю статические файлы с помощью lighty? Мне также удалось обслужить само приложение django с помощью lighty. Это вообще плохо? Извините за то, что был таким глупым :-)
ОБНОВИТЬ: А как насчет lighty и nginx - каковы варианты использования, когда это идеальный выбор?






Официально рекомендуемый способ развертывания проекта django - использовать mod_python с apache. Это описано в документация.. Главное преимущество в том, что это лучший документированный, наиболее поддерживаемый и наиболее распространенный способ развертывания. Минус в том, что он, вероятно, не самый быстрый.
Я не мог заставить это работать на apache, и я пытался много раз, я не нашел отличной поддержки, учебные пособия показывают только часть головоломки. Кажется, вы должны стать экспертом по apache ... Я предлагаю nginx / gunicorn с eventlet или nginx / uwsgi с использованием сокетов. Оба отлично работают и просты в настройке!
Как сказал @Barry, в документации используется mod_python. Я не использовал Ubuntu в качестве сервера, но имел хороший опыт работы с mod_wsgi на Solaris. Вы можете найти документацию для mod_wsgi и Django на сайте mod_wsgi.
Быстрый обзор ваших требований:
У меня есть такая настройка - я использую mod_wsgi для обслуживания большей части сайта, но у меня есть директивы Alias, чтобы заставить Apache обрабатывать статические файлы из / media и / admin_media. Учитывая, что мы говорим о «сайте среднего размера», вероятно, нет особой необходимости возиться с «более простыми» альтернативами.
Если вы используете lighthttpd, вы также можете использовать FastCGI для обслуживания Django. Я не уверен, как скорость сравнивается с mod_wsgi, но если память обслуживает правильно, вы получите несколько преимуществ, которые вы получите с mod_wsgi, которых вы не получите с mod_python. Основной из них заключается в том, что вы можете предоставить каждому приложению свой собственный процесс (что действительно полезно для разделения памяти разных приложений, а также для использования преимуществ многоядерных компьютеров.
Обновлено: просто чтобы добавить к вашему обновлению о nginix, если память снова работает правильно, nginix использует «гринлеты» для обработки параллелизма. Это означает, что вам, возможно, придется быть немного осторожнее, чтобы одно приложение не занимало все время сервера.
nginx - однопоточный сервер; но бэкэнды (HTTP, FastCGI или что-то еще) - это отдельные процессы.
Поскольку я искал более подробные ответы, я решил самостоятельно изучить вопрос. Пожалуйста, дайте мне знать, если я что-то неправильно понял.
Некоторые общие рекомендации - использовать отдельный веб-сервер для обработки мультимедиа. Под отдельным я подразумеваю веб-сервер, на котором не работает Django. Этот сервер может быть, например:
Затем для Django вы можете пойти разными путями. Вы также можете:
Обслуживайте Django через Apache и:
mod_python
Это стабильный и рекомендуемый / хорошо документированный способ. Минусы: использует много памяти.
mod_wsgi
Насколько я понимаю, mod_wsgi - более новая альтернатива. Оказывается, это быстрее и проще по ресурсам.
mod_fastcgi
При использовании FastCGI вы делегируете обслуживание Django другому процессу. Поскольку mod_python включает интерпретатор Python в каждый запрос, он использует много памяти. Это способ обойти эту проблему. Также есть некоторые проблемы с безопасностью.
Что вы делаете, так это то, что вы запускаете свой сервер Django FastCGI в отдельном процессе, а затем настраиваете apache с помощью перезаписи для вызова этого процесса при необходимости.
Или вы можете:
Обслуживайте Django без использования Apache, но с другим сервером, который изначально поддерживает FastCGI:
(В документации упоминается, что вы можете сделать это, если у вас нет особых потребностей Apache. Я думаю, причина должна заключаться в экономии памяти.)
Это сервер, на котором работает Youtube. Он кажется быстрым и простым в использовании, однако я видел отчеты об утечках памяти.
Я видел тесты, которые утверждали, что этот сервер даже быстрее, чем lighttpd. Хотя в основном это задокументировано на русском языке.
Другое дело, из-за ограничений Python ваш сервер должен работать в разветвленном режиме, а не в многопоточном.
Это мое текущее исследование, но мне нужно больше мнений и опыта.
Модулю mod_python не нужно потреблять намного больше памяти. Мнение о том, что это действительно так, превратилось в своего рода городской миф, в то время как реальность такова, что проблемы с памятью, которые были у людей, были вызваны тем, как был установлен mod_python / Python и как был настроен Apache. Первая проблема заключалась в том, что в прошлом Python часто не устанавливался с общей библиотекой. Это означало, что mod_python должен был связывать его статически, в результате чего локальная память использовалась из-за перемещения адресов. Другая проблема заключается в том, что люди используют префорк, который лучше для PHP, но отстой для Python.
Мы используем nginx и FastCGI для всех наших развертываний Django. Это в основном потому, что мы обычно развертываем на Slicehost и не хотим отдавать всю нашу память Apache. Думаю, это был бы наш «вариант использования».
Что касается замечаний о том, что документация в основном на русском языке - я считаю, что большая часть информации о Английская вики очень полезна и точна. На этом сайте также есть образцы конфигураций для Django, из которых вы можете настроить свою собственную конфигурацию nginx.
Однажды у меня была проблема с nginx, которая не была полностью объяснена в документации на английском языке. Я пропустил через переводчик (гугл) одну русскую строчку и проблема решилась. Так что русская часть документации более полная.
@stesch: интересно. заботиться о разработке?
Думаю, лучшая конфигурация не так известна. Но вот:
Два самых быстрых решения для веб-сервера на основе Python:
Вам нужно заглянуть в Google, чтобы найти текущую лучшую конфигурацию для django (все еще в разработке).
Я использую nginx (0.6.32 взято у Сида) с mod_wsgi. Он работает очень хорошо, хотя я не могу сказать, лучше ли он, чем альтернативы, потому что я никогда не пробовал их. Nginx имеет встроенную поддержку memcached, которая, возможно, может взаимодействовать с промежуточным программным обеспечением кэширования Django (я фактически не использую его, вместо этого я заполняю кеш вручную с помощью python-memcache и аннулирую его при внесении изменений), поэтому попадания в кеш полностью обходят Django (моя машина для разработки может обслуживать около 3000 запросов в секунду).
Предостережение: nginx mod_wsgi очень не любит именованные местоположения (он пытается передать их в SCRIPT_NAME), поэтому очевидное "error_page 404 = @django" вызовет множество непонятных ошибок. Чтобы это исправить, мне пришлось пропатчить исходный код mod_wsgi.
Я тоже изо всех сил пытаюсь понять все варианты. В это сообщение в блоге я обнаружил некоторые преимущества mod_wsgi по сравнению с объяснением mod_python.
Несколько сайтов с низким трафиком на небольшом VPS делают потребление оперативной памяти основной проблемой, и mod_python кажется здесь плохим вариантом. Используя lighttpd и FastCGI, мне удалось получить минимальное использование памяти простого сайта Django до 58 МБ виртуальной и 6,5 МБ резидентной (после перезапуска и обслуживания одного запроса, не связанного с ОЗУ).
Я заметил, что обновление с Python 2.4 до 2.5 в Debian Etch увеличило минимальный объем памяти, занимаемой процессами Python, на несколько процентов. С другой стороны, лучшее управление памятью в 2.5 может иметь больший обратный эффект на длительные процессы.
Я использую Чероки.
Согласно их ориентиры (немного скептически), он справляется с нагрузкой лучше, чем Lighttpd и nginx ... Но я использую его не поэтому.
Я использую его, потому что, если вы наберете cherokee-admin, он запустит новый сервер, на который вы можете войти (с одноразовым паролем) и настроить весь сервер с помощью прекрасно выполненного webmin. Это потрясающая функция. Это уже сэкономило мне много времени. И это экономит моему серверу много ресурсов!
Что касается django, я запускаю его как многопоточный SCGI-процесс. Работает хорошо. Чероки тоже может держать его в рабочем состоянии. Опять же, очень приятная функция.
Текущая версия репозитория Ubuntu очень старая, поэтому я бы посоветовал вам использовать их PPA. Удачи.
Будьте проще: Django рекомендует Apache и mod_wsgi (или mod_python). Если обслуживание файлов мультимедиа является очень важной частью вашего сервиса, рассмотрите возможность использования Amazon S3 или Rackspace CloudFiles.
+1. Рекомендуется Apache + mod_wsgi. Однако отсутствуют ссылки на претензии.
Настроить apache не проще, чем nginx / lighttpd.
Есть много способов сделать это, поэтому я рекомендую внимательно прочитать статью о процессе развертывания на DjangoAdvent.com: Эрик Флоренцано - Развертывание Django с FastCGI: http://djangoadvent.com/1.2/deploying-django-site-using-fastcgi/ Читайте тоже: Майк Мэлоун - Масштабирование Django Блог Stochastictechnologies: идеальная установка Django Блог Миккеля Хоэга: 35% -ное время отклика-переключение-uwsgi-nginx
С Уважением
На мой взгляд, лучший / самый быстрый стек - varnish-nginx-uwsgi-django. И я успешно им пользуюсь.
У меня есть предупреждение за использование Cherokee. Когда вы вносите изменения в Django Cherokee, он поддерживает СТАРЫЙ процесс, вместо того, чтобы убивать его и запускать новый.
На Apache я настоятельно рекомендую эту статью.
http://www.djangofoo.com/17/django-mod_wsgi-deploy-exampl
Его легко настроить, легко убить или сбросить после внесения изменений.
Просто введите терминал
sudo /etc/init.d/apache2 restart
и изменения видны мгновенно.
Хотя сообщество поддержки Django на #django freenode соглашается, что документация просто устарела, официально рекомендуемый способ - mod_wsgi.