Яке "налаштування" ви бачили як найкраще працює? Я використав virtualenv і перемістив свій проект django всередину цього середовища, однак я бачив і інші установки, де є папка для віртуального середовища та інші для проектів.
virtualenv - це спосіб ізолювати середовища Python; як такий, він не має великої ролі при розгортанні, проте під час розробки та тестування це є вимогою, якщо не настійно рекомендується.
Цінність, яку ви отримаєте від virtualenv, полягає в тому, що вона дозволяє вам переконатися, що для програми встановлені правильні версії бібліотек. Тож не має значення, куди ви вкладаєте саме віртуальне оточення. Тільки переконайтеся, що ви не включаєте його як частину системи версій вихідного коду.
Макет файлової системи не є критичним. Ви побачите безліч статей, які прославляють достоїнства макетів каталогів і навіть скелетні проекти, які ви можете клонувати як вихідну точку. Я вважаю, що це більше особисті переваги, ніж важка вимога. Звичайно, це приємно мати; але якщо ви не знаєте чому , це не додає ніякої цінності вашому процесу розгортання - тому не робіть цього, оскільки деякі блоги рекомендують це, якщо це не має сенсу для вашого сценарію. Наприклад - немає необхідності створювати setup.py
файл, якщо у вас немає приватного сервера PyPi, який є частиною вашого робочого процесу розгортання.
Як я можу налаштувати речі таким чином, що дозволяє розміщувати кілька сайтів на одному сервері?
Існує дві речі, які потрібно зробити для кількох налаштувань сайту:
- Сервер, який прослуховує загальнодоступний IP на порту 80 та / або порту 443, якщо у вас SSL.
- Купа "процесів", на яких запущений власне вихідний код django.
Люди використовують nginx для №1, оскільки він дуже швидкий проксі-сервер, і він не постачається із накладними витратами на такий серверний сервер, як Apache. Ви можете користуватися Apache, якщо вам це зручно. Немає вимоги, що "для кількох сайтів використовуйте nginx"; вам просто потрібна послуга, яка прослуховує цей порт, знає, як перенаправити (проксі-сервер) на ваші процеси, що виконують фактичний код django.
Для №2 існує кілька способів запустити ці процеси. gevent / uwsgi - найпопулярніші. Єдине, що слід пам’ятати, це не використовувати runserver у виробництві .
Це абсолютні мінімальні вимоги. Зазвичай люди додають якийсь диспетчер процесів, щоб керувати всіма запущеними «серверами django» (№2). Тут ви побачите upstart
і згадаєте supervisor
. Я віддаю перевагу супервізору, оскільки йому не потрібно брати на себе всю систему (на відміну від запуску). Однак знову ж таки - це не важка вимога . Ви могли б чудово провести купу screen
сеансів і відокремити їх. Недоліком є те, що якщо ваш сервер перезапуститься, вам доведеться перезапустити сеанси екрану.
Особисто я б порекомендував:
- Nginx для №1
- Вибирайте між uwsgi та gunicorn - я використовую uwsgi.
- супервізор для управління серверними процесами.
- Індивідуальні системні облікові записи (користувачі) для кожної програми, яку ви розміщуєте.
Причиною, яку я рекомендую №4, є ізоляція дозволів; знову ж таки, не вимога.
Чому деякі люди пропонують використовувати gunicorn_django -b 0.0.0.0:8000, а інші пропонують gunicorn_django -b 127.0.0.1:8000? Я тестував останню в екземплярі Amazon EC2, але вона не працювала, поки перша працювала без проблем.
0.0.0.0
означає "всі IP-адреси" - це мета-адреса (тобто адреса заповнювача). 127.0.0.1
- це зарезервована адреса, яка завжди вказує на локальну машину. Ось чому його називають "localhost". Він доступний лише для процесів, що працюють в одній системі.
Зазвичай передній сервер (№1 у списку вище) прослуховує загальнодоступну IP-адресу. Вам слід явно прив’язати сервер до однієї IP-адреси .
Однак, якщо з якихось причин ви використовуєте DHCP або не знаєте, якою буде IP-адреса (наприклад, її нещодавно надана система), ви можете сказати nginx / apache / будь-який інший процес, до якого потрібно прив’язатись 0.0.0.0
. Це має бути тимчасовим запобіжним заходом .
Для робочих серверів у вас буде статичний IP. Якщо у вас є динамічний IP (DHCP), ви можете залишити 0.0.0.0
. Дуже рідко ви отримуєте DHCP для своїх виробничих машин.
Прив'язувати gunicorn / uwsgi до цієї адреси не рекомендується у виробництві. Якщо ви прив'яжете свій серверний процес (gunicorn / uwsgi) до 0.0.0.0
, він може стати доступним "безпосередньо", минаючи ваш інтерфейсний проксі (nginx / apache / і т.д.); хтось може просто запитати http://your.public.ip.address:9000/
та отримати безпосередній доступ до вашої програми, особливо якщо ваш інтерфейсний сервер (nginx) та ваш внутрішній процес (django / uwsgi / gevent) працюють на одній машині .
Ви можете це зробити, якщо не хочете клопоту з запуском інтерфейсного проксі-сервера.
У чому полягає логіка конфігураційного файлу nginx? Існує стільки підручників, в яких використовуються кардинально різні конфігураційні файли, що я збентежений, який з них краще. Наприклад, деякі люди використовують "псевдонім / шлях / до / static / папки", а інші - "root / path / to / static / folder". Можливо, ви можете поділитися улюбленим файлом конфігурації.
Перше, що ви повинні знати про nginx, це те, що це не веб-сервер, як Apache або IIS. Це проксі. Отже, ви побачите різні терміни, такі як "вище за течією" / "нижче за течією" та кілька "серверів", які визначаються. Витратьте трохи часу і спершу перегляньте посібник nginx.
Існує безліч різних способів налаштування nginx; але ось одна відповідь на питання про alias
VS. root
. root
це явна директива, яка пов'язує корінь документа ("домашній каталог") nginx. Це каталог, який він буде дивитись, коли ви надсилаєте запит без такого шляхуhttp://www.example.com/
alias
означає "зіставити ім'я з каталогом". Псевдоні каталоги можуть не бути підкаталогом кореневого документа.
Чому ми створюємо символічне посилання між доступними сайтами та сайтами з підтримкою в / etc / nginx?
Це щось унікальне для debian (і подібних до debian систем, таких як ubuntu). sites-available
перераховує файли конфігурації для всіх віртуальних хостів / сайтів у системі. Символьне посилання з sites-enabled
на sites-available
"активує" цей сайт або віртуальний хост. Це спосіб відокремити конфігураційні файли та легко ввімкнути / вимкнути хости.