Запуск нескольких сайтов с помощью Django Sites Framework через Gunicorn / Nginx - PullRequest
4 голосов
/ 21 сентября 2010

У меня есть CMS на основе Django, которая использует инфраструктуру сайтов Django и виртуальные хосты Nginx / Apache / mod_wsgi для запуска нескольких веб-сайтов в разных доменах.Мы оцениваем другие варианты стека Django и работаем ли CMS с одиночным сайтом на новом сервере, а Nginx проксирует до Gunicorn (в частности gunicorn_django).

Хотя это прекрасно работаетдля одного сайта я не уверен, как настроить Gunicorn для нескольких сайтов.Проблема в том, что с Apache / mod_wsgi мы могли бы установить DJANGO_SETTINGS_MODULE для mod_wsgi на соответствующий сайт settings.py

import os, sys

def inflight(filename):
    """
    Calculate absolute path to the folder containing "myfile.wsgi", then
    append to the PYTHONPATH.
    """
    ROOT = ('/').join(os.path.abspath(os.path.dirname(filename)).split('/')[0:-1])
    sys.path.append(ROOT)
    sys.path.append(os.path.join(ROOT, 'website'))

    sys.stdout = sys.stderr
    # Each website should have a settings file: /www/mysite.com/website/settings.py
    os.environ['DJANGO_SETTINGS_MODULE'] = 'website.settings'
    import django.core.handlers.wsgi
    return django.core.handlers.wsgi.WSGIHandler()

В данный момент я думаю, что у меня должен быть другой экземплярGunicorn для каждого сайта виртуального хоста, который мы запускаем, но это кажется избыточным для трафика, который мы получаем на большинство наших сайтов.

Кто-нибудь запускает Gunicorn с каркасом сайтов Django и может подсказать, как он настроен?

1 Ответ

10 голосов
/ 19 марта 2011

У меня была та же проблема, и я наткнулся на этот вопрос в поисках того же ответа.

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

  • Вам нужно запустить отдельные процессы gunicorn, чтобы заставить работать инфраструктуру сайтов django, потому что вы можете указывать экземпляр gunicorn только на один файл settings.py.Если ваши сайты не получают большого трафика, я бы создал 1 или 2 рабочих-оружейников на сайт.(Я знаю, все еще, вероятно, излишне).

  • В идеале вы хотели бы управлять этими различными процессами с помощью чего-то вроде supervisord , чтобы упростить управление запуском / остановкой /перезапускаю разные сайты, но я не могу заставить его работать.

Сначала запустите ваши серверы gunicorn на локальном хосте в разных портах с помощью командной строки.Пример:

gunicorn_django -w 2 -b 127.0.0.1:1000 /path/to/my/django/project/site1_settings.py --daemon

gunicorn_django -w 2 -b 127.0.0.1:1001 /path/to/my/django/project/site2_settings.py --daemon

Теперь у вас есть 2 сайта django, работающих на локальном хосте через порты 1000 и 1001 (вы можете использоватьнезависимо от того, какие порты вам подходят).

Теперь вам нужно создать два отдельных файла конфигурации сервера nginx, чтобы каждое доменное имя указывало на соответствующий сайт django.Пример:

server {
    listen 80;
    server_name website1.com;
    client_max_body_size 4G;

    keepalive_timeout 4;

    location /media {
        root /path/to/my/django/project/media; #this servers your static files
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header HOST $http_host;
        proxy_redirect off;

        if (!-f $request_filename){
            proxy_pass http://127.0.0.1:1000; #point to the django site already running on local host
            break;
        }
    }

    #add in any additional nginx configuration such as support for 500 errors or proxy apache to server php files etc.
}

Затем создайте дубликат конфигурации nginx для вашего второго сайта, но измените имя сервера и proxy_pass на значения для сайта 2.

Убедитесь, что конфигурация вашего серверафайлы включены в основной файл nginx.conf.

Перезагрузите nginx, и вам будет хорошо.

Если у кого-то есть более простой / лучший способ сделать это, пожалуйста, опубликуйте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...