Разное

Gunicorn django: Настройка Debian, Nginx и Gunicorn для Django проекта / Хабр

Содержание

Настройка Debian, Nginx и Gunicorn для Django проекта / Хабр

Всем доброго времени суток.

Была задача поднять свой Debian сервер на Nginx для проектов Django 3.х. Перерыв кучу информации в интернете, удалось это сделать соединив рекомендации с нескольких разных сайтов. Если вам интересно почитать, как настроить свой первый сервер для Django-проекта, то — добро пожаловать.


Немного расскажу о себе, чтобы вы понимали, кто я. Я не разработчик, не программист, не системный администратор и даже не имею IT-образования. Я учитель информатики. Но по работе мне приходится объяснять ученикам некоторые моменты, очень далёкие от школьного курса информатики и один из них это разработка проектов на Django.

Основные установки

Начнём с того, что у нас уже есть сервер с установленной Debian 10, с установкой Debian проблем возникнуть не должно. У меня была чистая установка, без дополнительных настроек, поэтому я зашёл на свой сервер через root и приступил к установке некоторых основных для меня компонентов.

apt-get update
apt-get install -y sudo htop git curl wget unzip zip gcc build-essential make
apt-get install -y tree redis-server nginx  libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-dev python-pil ython3-pil 
apt-get install -y python3-lxml libxslt-dev python-libxml2 python-libxslt1 python-dev gnumeric libpq-dev libxml2-dev libxslt1-dev libjpeg-dev libfreetype6-dev libcurl4-openssl-dev supervisor libgdbm-dev libnss3-dev ufw

Можно всё это засунуть в одну установку, но у меня выдал ошибку, а при таком порядке всё прошло успешно.

Далее создаём нового пользователя и добавляем его в группу sudo, чтобы он мог запускать процессы от имени суперпользователя.

adduser username 
usermod -aG sudo username

где username — это имя пользователя, которое вы будете использовать в дальнейшем.
Установим последнюю версию Python из исходного кода. На момент написания статьи это была 3.8.2.

cd /home/username
curl -O https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
tar -xf Python-3.8.2.tar.xz
cd Python-3.8.2

Пояснение по действиям

cd — это команда для изменения рабочего каталога, сокращение от change directory;

curl — позволяет взаимодействовать с различными сервисами по URL. Мы её используем для скачивания файла;

tar — распаковка скаченного архива.

После скачивания последней версии Python и перехода в каталог с исходным кодом мы запускаем:

./configure --enable-optimizations
make -j 2

Это позволит нам подготовить всё необходимое для установки Python. Здесь число 2, это количество ядер процессора. Можно узнать командой nproc.
Запускаем установку.

make altinstall

Проверить, что Python установился, можно командой:

python3.8 -V

Она выведет версию Python.
После этого обновляем pip и устанавливаем наиболее часто используемые пакеты для Python.

python3.8 -m pip install -U pip
python3.8 -m pip install -U setuptools
python3.8 -m pip install pillow
python3.8 -m pip install virtualenv

Настройка Django

Перезапускаем систему и заходим под созданным вами пользователем. Перейдём в каталог /var/www и скачаем в него наш проект, который загружен на GitHub.

cd /var/www
sudo git clone LINK_TO_PROJECT

Настроим права, для нормальной работы с каталогом /var/www

sudo chown -R www-data:www-data /var/www
sudo usermod -aG www-data username
sudo chmod go-rwx /var/www
sudo chmod go+x /var/www
sudo chgrp -R www-data /var/www
sudo chmod -R go-rwx /var/www
sudo chmod -R g+rwx /var/www

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

Переходим в наш проект, создаём виртуальное окружение и запускаем его:

cd djangoprojectname/
virtualenv env
source ./env/bin/activate

Если всё активировалось, то будет строка вида: (env) username@server.

Поставим/обновим основные пакеты, которые нужны нам для нашего проекта.

pip install -U pip
pip install -U setuptools
pip install -U pillow

Ставим Django, Gunicorn и адаптер для PostgreSQL.

pip install django gunicorn psycopg2-binary

Можно ещё поставить необходимые для вашего проекта пакеты, я использую summernote для текста:

pip install django-summernote

Мы ставили брандмауэр, поэтому нужно создать для него исключение на порт 8000 (его мы используем по умолчанию, если планируете использовать другой, то укажите его):

sudo ufw allow 8000

Обязательный шаг — это проверка работоспособности сервера:

python3.8 manage.py runserver 0.0.0.0:8000

И перейдите на ваш сайт, DOMAIN_NAME:8000, чтобы убедится в том, что всё работает! Но, на данный момент у нас ещё не настроено очень многое, это только базовые настройки, нам нужно настроить нормальную работу сервера, подключить статику и т.д.
Если у Вас не запустился сайт, то нужно копаться в настройках (возможно прав доступа) и смотреть какой из пакетов не установился, тут всё очень индивидуально.

Завершить выполнение можно нажатием клавиш: CTRL+C.

Далее переходим, только если ваш проект запустился, крайне не рекомендую переходить, если что-то не получилось. Лучше устранить проблему на начальном этапе, чем потом сносить сервер под корень (я сносил 3 раза, а потом начал писать эту инструкцию, фиксируя каждое действие).

Проверяем работу Gunicorn:

gunicorn --bind 0.0.0.0:8000 MAINAPPNAME.wsgi

MAINAPPNAME — это имя основного приложения, в котором лежит settings.py.

Если сервер работает, то идём дальше.

Завершить выполнение можно нажатием клавиш: CTRL+C.

Настройка settings.py

При развёртывании на продакшн сервере нужно отключить дебаг у проекта и поменять несколько настроек, я это сделал следующим образом в settings.py моего проекта.

DEBUG = False
if DEBUG:
    ALLOWED_HOSTS = ['*']
else:
    ALLOWED_HOSTS = ['HOST IP', 'DOMAIN NAIM', 'localhost']
...
STATIC_URL = '/static/'
if DEBUG:
    STATIC_DIR = os.path.join(BASE_DIR, 'static')
    STATICFILES_DIRS = [
        STATIC_DIR,
        '/var/www/static/',
    ]
else:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
    STATICFILES_FINDERS = (
        'django.contrib.staticfiles.finders.FileSystemFinder',
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    )
MEDIA_URL = '/media/'

В urls.py я изменил настройки для статики и медиа.

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

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

Выполним команду:

python3.8 manage.py collectstatic

Для сбора статики и деактивируем виртуальное окружение:

deactivate

Настройка Gunicorn

Откроем для настройки

sudo nano /etc/systemd/system/gunicorn.socket

Пропишем в файле несколько настроек:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Мы создали раздел [Unit] для описания сокета, в разделе [Socket] мы определили расположение сокета и в разделе [Install] нужен для установки сокета в нужное время.

Откроем служебный файл systemd ля настройки работы сервиса:

sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=username
Group=www-data
WorkingDirectory=/var/www/djangoprojectname
ExecStart=/var/www/djangoprojectname/env/bin/gunicorn \
          --access-logfile - \
          --workers 5 \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application

[Install]
WantedBy=multi-user.target

Не забудьте указать вашего пользователя, ваше название проекта и ваше виртуальное окружение.

Как мне пояснили workers вычисляется как количество ядер процессора * 2 + 1.

Теперь мы запускаем и активируем сокет Gunicorn.

sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

И обязательно тестируем, что всё работает!

sudo systemctl status gunicorn.socket

Должен вывести данные о запущенном сервисе.

Нажмите клавишу Q для выхода (обязательно на английской раскладке).

file /run/gunicorn.sock

Последняя команда должна вывести сообщение о наличии файла.

Если первая команда sudo systemctl status gunicorn.socket выдаёт ошибку, или если вторая команда file /run/gunicorn.sock сообщит, что в каталоге отсутствует файл gunicorn.sock, то сокет Gunicorn не удалось создать. Нужно проверить журналы сокета Gunicorn с помощью следующей команды:

sudo journalctl -u gunicorn.socket

Смотреть в чём ошибка и устранять.

Перейдём к тестированию активации сокета.

sudo systemctl status gunicorn

Скорее всего у вас будет запись:

Active: inactive (dead)

Пока всё отлично идём дальше.

Установим соединение с сокетом через curl.

curl --unix-socket /run/gunicorn.sock localhost

Может выдать ошибку Bad Request (400).

Попробуйте вместо localhost указать IP вашего сервера, если всё нормально, то скорее всего это из-за настроек nginx, которые мы ещё не делали. Просто идём дальше.

И снова запросим вывод статуса:

sudo systemctl status gunicorn
Active: active (running)

Если запись будет такой + ещё масса информации, но не об ошибках, то всё отлично.

Иначе смотрим ошибки в журнале

sudo journalctl -u gunicorn

И перезапускаем процессы Gunicorn

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

Настройка NGINX

Создадим новый серверный блок для нашего сайта и настроим его, чтобы при обращении к нашему сайту в адресной строке, сервер понимал что и откуда брать.

sudo nano /etc/nginx/sites-available/djangoprojectname
server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        alias /var/www/djangoprojectname/static/;
    }

    location /media/ {
        alias /var/www/djangoprojectname/media/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

В разделе sever_name можно указать несколько адресов через пробел.

Протестируем на наличие ошибок в синтаксисе:

sudo nginx -t

Если ошибок нет, то перезапускаем сервер и даём нашему брандмауэру необходимые права:

sudo systemctl restart nginx
sudo ufw allow 'Nginx Full'

Можно также удалить доступ к порту 8000

sudo ufw delete allow 8000

На этом этапе всё должно работать, но у меня не работало всё нормально, пока я не настроил https. К сожалению, не могу объяснить с чем это связано, но статика не подгружалась, хотя медиа файлы грузились нормально.

Настройка HTTPS

Для настройки будем использовать Cerbot

sudo apt-get install certbot python-certbot-nginx
sudo certbot –nginx

И следуем подсказкам на экране. Если появились ошибки, то устраните и повторите. Например, ошибка может возникнуть если вы указали доменное имя, не относящееся к данному серверу.
Для автоматического обновления сертификата введите команду.

sudo certbot renew --dry-run 

Теперь тестим сайт и всё должно работать!

Если статика так и не отобразилась, то попробуйте открыть какой-нибудь css файл указав полный адрес до него, если выдал ошибку 403, то всё отлично, но проблема в правах доступа нужно экспериментировать с ними, попробуйте сбросить все настройки прав для www-data на каталог /var/www. Если ошибка 404, то нужно смотреть в сторону настроек location в настройках NGINX.

Настройка PostgreSQL

Настроим PostgreSQL и сделаем импорт данных из SQLite. Если Вам это не нужно, то пропустите этот шаг, либо возьмите только настройки PostgreSQL.

Создадим базу данных и пользователя.

sudo -u postgres psql
CREATE DATABASE dbforproject;
CREATE USER projectdbuser WITH PASSWORD 'password';

Мы будем следовать рекомендациям по проекту Django.

Зададим кодировку по умолчанию UTF-8, схему изоляции транзакций по умолчанию поставим в «read committed», для блокировки чтение со стороны неподтвержденных транзакций. Часовой пояс поставим в значения времени по Гринвичу (UTC).

ALTER ROLE projectdbuser SET client_encoding TO 'utf8';
ALTER ROLE projectdbuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE projectdbuser SET timezone TO 'UTC';

После этого нужно предоставить созданному нами пользователю доступ для администрирования новой базы данных:

GRANT ALL PRIVILEGES ON DATABASE dbforproject TO projectdbuser;

После выполнения всех команд можно закрыть диалог PostgreSQL с помощью команды:

\q

Теперь настройка PostgreSQL завершена, теперь настроим Django для корректной работы с PostreSQL.

Для начала скопируем старые данные из SQLite (если это необходимо). Для этого переходим в ваш проект и запускаем виртуальное окружение:

cd /var/www/djangoprojectname
source ./env/bin/activate
cd mainappname/
python3.8 manage.py dumpdata > datadump.json

Поменяем настройки для подключения к базе данных:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbforproject',
        'USER': 'projectdbuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

Запустите миграцию для БД:

python3.8 manage.py migrate --run-syncdb

После этого shell:

python3 manage.py shell

И пропишите в нём:

>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
>>> quit()

И подгрузим ранее выгруженные данные из SQLite:

python3.8 manage.py loaddata datadump.json

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

При написании использовал:

  1. www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-18-04-ru
  2. vexxhost.com/resources/tutorials/how-to-deploy-django-on-nginx-gunicorn-with-postgres
  3. pythonworld.ru/web/django-ubuntu1604.html

Урок 001. Развёртывание сайта на Django + PostgreSQL + Gunicorn + Nginx

После того, как доступ к серверу с Ubuntu 16.04 был настроен в одной из

предыдущих статей

, настало время развернуть на нём всё необходимое для работы сайта, а именно:

  • Django

    — фреймворк для разработки web-приложений на языке Python;

  • PostgreSQL

    — базу данных SQL ;

  • Gunicorn — WSGI HTTP сервер на Python для UNIX систем;
  • Ngnix — HTTP-сервер и обратный прокси-сервер, почтовый прокси-сервер, а также TCP/UDP прокси-сервер общего назначения;
  • Supervisor — это менеджер процессов, который существенно упрощает управление долго работающими программами, в частности сайтами, которые необходимо автоматически перезапускать после падений.

Шаг 1 — обновление системы

Сделаем обновление существующих пакетов. Мало ли, система имеет устаревшие пакеты.


sudo apt-get update
sudo apt-get upgrade

Шаг 2 — Установка всех необходимых пакетов без установки виртуального окружения

Установим пачкой все необходимые пакеты, которые не будут использоваться через virtualenv, а именно Python 3, PostgreSQL, Nginx.


sudo apt-get install python3-dev python3-setuptools libpq-dev postgresql postgresql-contrib nginx


Pip

я в итоге устанавливал отдельно через утилиту

easy_install3

, которая идёт в комплекте

python3-setuptools

, во-первых потому, что тогда ставится последняя версия, а вторых в случае установки через apt-get были ошибки при установке пакетов в virtualenv.


sudo easy_install3 pip

Шаг 3 — Создание базы данных и пользователя базы данных

А теперь создадим базу данных и пользователя, дав расширенные права пользователю postgres через утилиту sudo, который создаётся при установке PostgreSQL.


sudo -u postgres psql

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

Создадим базу данных:


CREATE DATABASE myproject;

Создадим пользователя:


CREATE USER myprojectuser WITH PASSWORD 'password';

Далее настройка пользователя проекта. Кодировку он будет использовать UTF8, поскольку данная кодировка используется и Django, а Python файлы рекомендует хардкодить с кодировкой UTF8, особенно, если в них присутствует текст, который будет отображаться на страницах сайта. Также устанавливается уровень изоляции в базе данных. То есть когда будут доступны данные для чтения. В данном случае после подтверждения транзакции в общем случае. Конечно, имеются случаи, когда данные доступны до подтверждения, но это отдельная тема для разговора. А также устанавливается тип временных зон, который для Django по умолчанию UTC.


ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';

Далее дадим права доступа к базе данных для этого пользователя:


GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

Ну и выйдем из консоли PostgreSQL.


\q

Если возникнут проблемы с кодировками на сервере, когда сервер будет иметь кодировку LATIN1, а базу данных нужно создать в UTF8, то обратитесь к

следующей статье

, где эта задача решается.

Шаг 4 — Установка виртуального окружения

Установим и активируем виртуальное окружение:


pip3 install virtualenv
virtualenv ~/myprojectenv
source myprojectenv/bin/activate

Шаг 5 — Установка драйвера PostgreSQL

Произведём установку следующей командой


sudo pip install django psycopg2 

Внутри виртуального окружения необходимо пользоваться командой

pip

, а не

pip3

Шаг 6 — Создание проекта

Перейдём в папку с виртуальным окружением, мы по-прежнему должны находиться в режиме работы в виртуальном окружении. И создадим проект.


cd ~/myprojectenv
django-admin.py startproject myproject

Шаг 7 — Настройка подключения к базе данных

А теперь отредактируем конфигурационный файл Django, чтобы он подключался к базе данных PostgreSQL, а не создавал и в дальнейшем подключался к базе данных SQLite.


nano ~/myproject/myproject/settings.py

Для этого найдите в файле следующий кусок кода:


...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
   }
}

...

И замените его следующим, с учётом ваших данных для подключения к базе данных:


...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

...

Шаг 8 — Выполнение миграций базы данных

Django обладает одним очень большим преимуществом — он имеет встроенную админку, что очень облегчает жизнь. Но чтобы она заработала, необходимо выполнить миграцию базы данных, то есть подготовить из моделей данных SQL запросы, которые сформируют структуру базу данных.


cd ~/myproject
python manage.py makemigrations
python manage.py migrate

А ещё создадим суперпользователя, который будет администратором с максимальными правами доступа к вашему сайту. Выполните следующую команду и следуйте инструкциям.


python manage.py createsuperuser

Шаг 9 — Установка Gunicorn

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


sudo pip install django gunicorn

Можете проверить, что сайт уже работает:


gunicorn myproject.wsgi:application --bind 111.222.333.44:8000  # Укажите ваш IP-адрес

Шаг 10 — Настройка статических файлов

Django по умолчанию отдаёт статические файлы только в Debug режиме, который не используется на боевом сервере. Для боевого сервера все статические файлы из всех проектов собираются в отдельную специальную папку с помощью команды

collectstatic

, а саму папку необходимо указывать в файл

settings.py.

Отредактируем его:


nano ~/myproject/settings.py

И добавим строку, которая будет указывать, куда собирать статические файлы.


STATIC_ROOT = '/home/user/myprojectenv/myproject/myproject/static/'

А теперь соберём всю статику в данный каталог:


python manage.py collectstatic

Шаг 11 — Настройка Nginx

Отредактируем конфигурационный файл Nginx.


sudo nano /etc/nginx/sites-available/default

Удалим всё его содержимое и замени следующим.


server {
    listen 80;
    server_name 111.222.333.44; # здесь прописать или IP-адрес или доменное имя сервера
    access_log  /var/log/nginx/example.log;

    location /static/ {
        root /home/user/myprojectenv/myproject/myproject/;
        expires 30d;
    }

    location / {
        proxy_pass http://127.0.0.1:8000; 
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Перезапустим Nginx.


sudo service nginx restart

И запустим gunicorn


gunicorn myproject.wsgi:application

После этого вы обнаружите, что сайт доступен уже на порту 80.

Шаг 12 — Настройка supervisor

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


sudo apt-get install supervisor

Для стабильной работы Gunicorn необходимо создать его конфигурационный файл. Он будет располагаться рядом с файлом, который будет запускаемым для нашего web-приложения.


cd /home/user/myprojectenv/myproject/myproject
touch gunicorn.conf.py
nano gunicorn.conf.py

Добавим следующую конфигурационную информацию:


bind = '127.0.0.1:8000'
workers = 3
user = "nobody"

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


workers =  N

cpu

+ 1

После чего создадим конфигурацию самого supervisor


cd /etc/supervisor/conf.d/
touch myproject.conf
nano myproject.conf

Пропишем в него следующие настройки


[program:myproject]
command=/home/user/myprojectenv/bin/gunicorn myproject.wsgi:application -c /home/user/myprojectenv/myproject/myproject/gunicorn.conf.py
directory=/home/user/myprojectenv/myproject
user=nobody
autorestart=true
redirect_stderr=true

А теперь запустим supervisor. Есть один нюанс при установке supervisor. Он не стартанул в качестве службы после того, как был установлен. Поэтому нужно принудительно добавить его в автозагрузку и запустить вручную, если не хотите перезагружать сервер.


sudo update-rc.d supervisor enable
sudo service supervisor start

Ну а дальше можно обновлять конфиги, проверять статус приложения сайта и его перезапуска.


supervisorctl reread
supervisorctl update
supervisorctl status myproject
supervisor restart myproject

При перезагрузке сервера всё будет стартовать автоматически

Примечание

Если вы изменили файлы проекта, то необходимо перезапускать gunicorn. Для этого достаточно активировать виртуальное окружение и воспользоваться командой killall


source ~/myprojectenv/bin/activate
sudo killall gunicorn

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

Для

Django

рекомендую

VDS-сервера хостера Timeweb

.

Настраиваем Django + virtualenv + nginx + gunicorn + PostgreSQL + memcached + letsencrypt на Ubuntu 16.04

В данной статье я опишу процесс настройки связки Django + virtualenv + nginx + gunicorn + PostgreSQL + memcached + letsencrypt на Ubuntu 16.04 на VPS DigitalOcean для своего форума https://pythonworld.club.

DigitalOcean

Из всех VPS-провайдеров я выбрал DigitalOcean, так как:

  • Начальный бонус 10$ после регистрации по ссылке (это месяц использования VPS в подарок)
  • Бонус в 50$ для студентов
  • Высокое качество и надёжность (за 3 года использования проблемы были только 2 раза, о них старались предупреждать заранее, и устранялись в кратчайшие сроки), а также низкая цена.

Впрочем, большая часть статьи подходит для VPS от любого провайдера.

Для активации аккаунта и получения стартового бонуса необходимо либо привязать банковскую карту, либо заплатить хотя бы 5$ через PayPal.

После этого можно выбрать тариф: для начала достаточно и самого дешёвого за 5$, но как только нагрузка на ваше приложение увеличится, ресурсов может не хватить. Тарифа за 10$ мне хватает вполне, поэтому, если у вас нет ничего экстраординарного, выше брать не стоит.

Ubuntu

Необходимо произвести начальную настройку. Если кратко:

  • Создать нового пользователя (не будем же мы всё из-под root-а делать?)
  • Дать ему права на выполнение команд через sudo
  • (опционально) авторизация не по паролю, а по ключу

Подробнейшие инструкции на русском есть на сайте DigitalOcean, не считаю нужным повторяться.

Предположим, нового пользователя назовём steve (это понадобится в дальнейшем, когда будем прописывать пути, будьте внимательны и меняйте на имя созданного Вами пользователя!)

PostgreSQL

Устанавливаем пакеты

sudo apt-get update
sudo apt-get install libpq-dev postgresql postgresql-contrib

Запускаем консоль PostgreSQL

sudo -u postgres psql
CREATE DATABASE myproject;
CREATE USER myprojectuser WITH PASSWORD 'difficultpassword';
ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

Некоторые приложения (и Misago в том числе) могут устанавливать расширения (extension) для PostgreSQL. Если у вас именно такой случай, необходимо ещё на время дать права суперпользователя базы новому пользователю:

ALTER ROLE myprojectuser superuser;

Теперь можно выйти из консоли PostgreSQL

\q

virtualenv

Устанавливаем pip и virtualenv:

sudo apt-get update
sudo apt-get install python3-pip
sudo pip3 install virtualenv

Создаём новое виртуальное окружение:

mkdir ~/newproject
cd ~/newproject
virtualenv newenv

Если вам нужно будет удалить виртуальное окружение, достаточно сделать rm -rf ~/newproject/newenv/.

Теперь активировать окружение можно с помощью команды

source newenv/bin/activate

запущенной из директории newproject.

Вы увидите, что после этой команды изменится приглашение интерпретатора bash: в начале появится (newenv).

Django

Установить Django в виртуальное окружение можно с помощью

pip install django psycopg2

в вашем окружении (заметьте, не pip3, несмотря на третий Python!)

Для выхода из окружения используйте команду deactivate (заметьте, она работает только в виртуальном окружении!)

По данным 2 пунктам есть туториал на DigitalOcean (на английском) (https://www.digitalocean.com/community/tutorials/how-to-install-the-django-web-framework-on-ubuntu-14-04).

Создаём Django-проект

django-admin.py startproject myproject ~/newproject

В моём случае (приложение Misago) была отдельная команда

pip install misago
cd ~/newproject
misago-admin testforum

Меняем настройки для доступа к базе данных. В settings.py прописываем:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myproject',
        'USER': 'myprojectuser',
        'PASSWORD': 'difficultpassword',
        'HOST': 'localhost',
        'PORT': 5432,
    }
}

Далее, стандартные действия:

python manage.py makemigrations
python manage.py migrate
python manage.py collectstatic
python manage.py createsuperuser
sudo -u postgres psql

После чего следует отобрать права суперпользователя для пользователя базы данных (если вы их выдавали).

ALTER ROLE myprojectuser nosuperuser;
\q

nginx

Устанавливаем свежий nginx

nginx=stable
sudo add-apt-repository ppa:nginx/$nginx
sudo apt-get update
sudo apt-get install nginx

Конфигурируем наш сервер

nano /etc/nginx/sites-available/testforum
server {

    server_name pythonworld.club; # Подставьте свой домен
    listen 80;

    location /.well-known {
        root /var/www/html; # Понадобится для letsencrypt
    }

    # Статические файлы
    location = /favicon.ico {
        alias /home/steve/newproject/testforum/static/favicon.ico;
    }
    location = /robots.txt {
        alias /home/steve/newproject/testforum/static/robots.txt;
    }

    location /static/ {
        root /home/steve/newproject/testforum/;
    }
    location /media/ {
        root /home/steve/newproject/testforum/;
    }

    # Взаимодействуем с Django-приложением через unix-сокет
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/steve/newproject/forum.sock;
    }
}
sudo ln -s /etc/nginx/sites-available/testforum /etc/nginx/sites-enabled

gunicorn

Вернёмся в виртуальное окружение (если вы из него выходили), и установим gunicorn

pip install gunicorn

Создадим файл конфигурации для gunicorn

sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=steve
Group=www-data
WorkingDirectory=/home/steve/newproject/testforum/
ExecStart=/home/steve/newproject/newenv/bin/gunicorn --access-logfile - --error-logfile error.log --workers 2 --bind unix:/home/steve/newproject/forum.sock testforum.wsgi:application

[Install]
WantedBy=multi-user.target

Теперь мы можем запустить gunicorn, а далее он будет автоматически запускаться при загрузке.

sudo systemctl start gunicorn
sudo systemctl enable gunicorn

Подробно на английском (с решением некоторых возможных проблем) описано в статье на DigitalOcean.

memcached

sudo apt-get install memcached libmemcached-dev
sudo nano /etc/memcached.conf
# Start with a cap of 64 megs of memory. It's reasonable, and the daemon default
# Note that the daemon will grow to this size, but does not start out holding this much
# memory
-m 256  # Ставим побольше, например 256Мб

# Default connection port is 11211
#-p 11211  Комментируем, так как хотим связать с помощью UNIX-сокета

# Run the daemon as root. The start-memcached will default to running as root if no
# -u command is present in this config file
-u memcache

# Specify which IP address to listen on. The default is to listen on all IP addresses
# This parameter is one of the only security measures that memcached has, so make sure
# it's listening on a firewalled interface.
#-l 127.0.0.1 Также комментируем
# А UNIX-сокеты добавляем
-s /tmp/memcached.sock
-a 0766

Устанавливаем Python библиотеку (в виртуальное окружение) для связывания Django и memcached

pip install pylibmc

В settings.py Django-проекта добавляем

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
        'LOCATION': '/tmp/memcached.sock',
    }
}

И, наконец, перезапускаем memcached:

sudo systemctl restart memcached

letsencrypt

Устанавливаем letsencrypt

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install --upgrade letsencrypt

Создаём файл конфигурации

sudo nano /etc/letsencrypt/cli.ini
authenticator = webroot
webroot-path = /var/www/html
post-hook = service nginx reload
text = True

Регистрация в letsencrypt

sudo certbot register --email [email protected]

Попробуем получить необходимый сертификат в режиме для тестов

sudo certbot certonly --dry-run -d pythonworld.club -d www.pythonworld.club

В конце вы должны получить сообщение

The dry run was successful.

Если всё прошло успешно, то можно получить сами сертификаты

sudo certbot certonly -d pythonworld.club -d www.pythonworld.club

После этого, редактируем настройки nginx

sudo nano /etc/nginx/sites-available/testforum
server {
    server_name pythonworld.club www.pythonworld.club default_server;
    listen 80;

    return 301 https://pythonworld.club;
}

server {
    server_name www.pythonworld.club;
    listen 443 ssl http2;

    ssl_certificate /etc/letsencrypt/live/pythonworld.club/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pythonworld.club/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/pythonworld.club/chain.pem;

    ssl_stapling on;
    ssl_stapling_verify on;

    add_header Strict-Transport-Security "max-age=31536000";

    return 301 https://pythonworld.club$request_uri;
}

server {

    server_name pythonworld.club;
    listen 443 ssl http2;

    ssl_certificate /etc/letsencrypt/live/pythonworld.club/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/pythonworld.club/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/pythonworld.club/chain.pem;

    ssl_stapling on;
    ssl_stapling_verify on;

    add_header Strict-Transport-Security "max-age=31536000";

    add_header X-Frame-Options "SAMEORIGIN";

    location /.well-known {
        root /var/www/html; # Понадобится для letsencrypt
    }

    # Статические файлы
    location = /favicon.ico {
        alias /home/steve/newproject/testforum/static/favicon.ico;
    }
    location = /robots.txt {
        alias /home/steve/newproject/testforum/static/robots.txt;
    }

    location /static/ {
        root /home/steve/newproject/testforum/;
    }
    location /media/ {
        root /home/steve/newproject/testforum/;
    }

    # Взаимодействуем с Django-приложением через unix-сокет
    location / {
        include proxy_params;
        proxy_pass http://unix:/home/steve/newproject/forum.sock;
    }
}

Перезапускаем nginx

sudo systemctl restart nginx

Установка и настройка gunicorn для Django приложения

Настройка gunicorn обычно нужна для Django. gunicorn является производительным сервером приложений. Обычно он используется с Nginx.

 

 

gunicorn устанавливается в виртуальное окружение через pip

 

После установки можно запустить процесс вручную

Сначала нужно перейти в каталог со скриптами приложения

cd ~/app

 

Точкой входа традиционно является wsgi.py, если это так команда для запуска примет следующий вид:

gunicorn —bind 0.0.0.0:5000 wsgi:app

В wsgi.py идет обращение к переменной app.

 

После запуска в тестовом режиме на порту 5000 вывод в консоль будет таким:

[2018-11-12 21:14:28 +0000] [24344] [INFO] Starting gunicorn 19.9.0
[2018-11-12 21:14:28 +0000] [24344] [INFO] Listening at: http://0.0.0.0:5000 (28217)
[2018-11-12 21:14:28 +0000] [24344] [INFO] Using worker: sync
[2018-11-12 21:14:28 +0000] [24344] [INFO] Booting worker with pid: 28220

 

Современные Ubuntu и CentOS в качестве системы инициализации используют systemd. Чтобы управлять сервисом gunicorn потребуется добавить Unit файл

 

mcedit /etc/systemd/system/app.service

[Unit]
Description=Gunicorn
After=network.target

[Service]
User=django
Group=www-data
WorkingDirectory=/home/django/app
Environment="PATH=/home/django/app/myprojectenv/bin"
ExecStart=/home/django/app/djangoenv/bin/gunicorn --workers 3 --bind unix:app.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

 

 

В нем задается пользователь и группа с правами которых запускается процесс application сервера.

Сам gunicorn запускается командой /home/django/app/djangoenv/bin/gunicorn —workers 3 —bind unix:app.sock -m 007 wsgi:app

 

Будет использоваться 3 воркера и unix сокета вместо IP адреса и порта. Это более безопасное и более быстрое решение, но подходит оно только для случаев когда приложение работает на одной машине.

Если применяется кластер и веб-сервер находится на одном сервере, а приложение на другом использовать получится только TCP сокет.

 

Чтобы использовать gunicorn — в него настраивают проксирование — обычно средствами Nginx с портов 80 и 443.

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

Установка Gunicorn + Nginx + Django на Ubuntu

Сейчас есть широкий выбор серверов, обслуживающих Django[1]. Тесты показывают, что наиболее производительные — это Gunicorn и uWSGI, причем первый развивается и поддерживается более активно.

Нам также понадобится средство для запуска, остановки и перезапуска сервера. В мире Django наиболее популярна система Supervisor, хотя пользователям Ubuntu возможно проще будет воспользоваться Upstart.

Окружение

virtualenv -p /usr/local/bin/python2.7 test
cd test
source bin/activate
pip install gunicorn django
django-admin.py startproject hello
cd hello
$ python manage.py runserver 0.0.0.0:8000

Django работает. Здесь и далее будем полагать, что сервер удаленный, поэтому пишем 0.0.0.0, чтобы иметь возможность подключиться к нему. Разумеется, крайне не рекомендуется тестировать на рабочем сервере. Если же все устанавливаете на локальном, то ip можно не писать, он по умолчанию равен 127.0.0.1:8000. Открываем в браузере http://your_server:8000
Смотрим, выключаем Django Ctrl + D.

Gunicorn

Проверить работу Gunicorn на проекте Django очень просто:

 gunicorn_django -b 0.0.0.0:8000

Опять, указываем адрес 0.0.0.0 только для проверки гуникорна. На рабочем сервере сервере не рекомендуется открывать прямой доступ к gunicorn; желательно запускать его на 127.0.0.1:port и проксировать через веб-сервер (в нашем случае это будет nginx, см. ниже). Открываем севрер в браузере, убеждаемся что гуникорн работает.

Теперь составим конфигурацию для сервера в окружении (вы ведь запускаете проект в виртуальном окружении?). Параметры удобно записать в файле-скрипте:

# script.sh

#!/bin/bash
set -e
LOGFILE=/var/log/gunicorn/hello.log
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=3
# user/group to run as
USER=your_unix_user
GROUP=your_unix_group
PORT=8001 # Этот порт будет разным у каждого django-проекта cd /path/to/test/hello source ../bin/activate test -d $LOGDIR || mkdir -p $LOGDIR exec ../bin/gunicorn_django -w $NUM_WORKERS \ --user=$USER --group=$GROUP --log-level=debug \ --log-file=$LOGFILE 2>>$LOGFILE \ --bind 127.0.0.1:$PORT

NUM_WORKERS — это количество процессов, которые будут обслуживать запросы. Минимальное значение: 1. Обычно его устанавливают равным 1 + 2 * количество_CPU на сервере (логично, половина процессоров постоянно будет в ожидании ввода-вывода, например в базе данных). YMMV.

Устанавливаем разрешения на выполнение скрипта chmod ug+x script.sh. И тестируем в командной строке

./script.sh

Еще раз обращаем внимание, что умолчанию Gunicorn работает на локальном адресе 127.0.0.1:8000 (на том же, что и сервер отладки Django), что есть хорошо, если Nginx находится на той же машине – обычно его не открывают для всех, и только Nginx обрабатывает входящие подключения. Мы взяли адрес 0.0.0.0:port только для целей проверки, чтобы была возможность подключиться удаленно, если вы настраиваете удаленный сервер (см. выше).

Чтобы запустить несколько проектов Django на одной машине, всем проектам нужно указать разные порты.

Update: При очередном развертывании, на которое убил целый день, gunicorn_django заводился только без указания пользователя и группы (строку переместить в конец и закомментировать).

Update 2: Можно запустить демона gunicorn и без супервизора с параметром -D:

gunicorn_django ... -D

Supervisor

У Supervisor отличная документация, здесь ее приводить не будем. Конфигурационный файл для запуска сервера — /etc/supervisord.conf), если его нет, нужно создать шаблонный:

echo_supervisord_conf > /etc/supervisord.conf

В нем указать примерно такие параметры:

[program:hello]
directory = /path/to/test/hello/
user = your_unix_user
command = /path/to/test/hello/script.sh
stdout_logfile = /path/to/logfile.log
stderr_logfile = /path/to/logfile.log

Теперь можно проверить:

supervisorctl {start,stop,restart,reload,status} hello

Если мы добавляем новый процесс в конфигурацию, то его надо добавить командой

supervisorctl update

Просмотр процессов:

supervisorctl avail

или

supervisorctl status

Также можно перечитать файл конфигурации

supervisorctl reread
supervisorctl reload

Важно! Это должно запускаться под тем же пользователем, под которым работает supervisord. Если что-то пойдет не так, отлаживать командой

supervisord -n -edebug

(у меня была проблема в том, что при запуске supervisor уже запущен под рутом (вероятно)).

Upstart

В Ubuntu есть альтернативное средство — Upstart, у которого похожий конфигурационный файл (находится /etc/init/hello.conf). Например:

description "Test Django instance"
start on runlevel [2345]
stop on runlevel [06]
respawn
respawn limit 10 5
exec /path/to/test/hello/script.sh

Тестируем:

service hello {start,status,stop}

Nginx

Настроим Nginx в качестве обратного прокси:

server {
listen 80; server_name example.com; # no security problem here, since / is alway passed to upstream root /path/to/test/hello; # serve directly - analogous for static/staticfiles location /media/ { # if asset versioning is used if ($query_string) { expires max; } } location /admin/media/ { # this changes depending on your python version root /home/my/env/lib/python2.7/site-packages/django/contrib; } location / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_connect_timeout 10; proxy_read_timeout 10; proxy_pass http://localhost:8001/; # У каждого django-проекта свой порт (см. script.sh) } # what to serve if upstream is not available or crashes error_page 500 502 503 504 /media/50x.html; }

Для тестирования конфигурации введите nginx -t или nginx -s reload для перезагрузки конфигурации.

Это все. Поскольку сервер установлен изолировано, на одной машине можно запустить множество приложений django с различными окружениями.

Update конец 2014

Обратите внимание на дату поста — статья довольно старая. С тех пор возобновилась активная поддержка uwsgi. Сейчас я большинство проектов перевел на него, здесь о том как настроить django + uwsgi + nginx под Ubuntu

Как установить Django, Nginx и Gunicorn на виртуальный сервер

В инструкции описано, как установить и настроить некоторые компоненты в Ubuntu 18.04 для поддержки и обслуживания приложений Django, как настроить базу данных PostgreSQL вместо использования базы данных SQLite по умолчанию, как настроить сервер приложений Gunicorn для взаимодействия с приложениями. Затем в инструкции описана конфигурация Nginx для обращения прокси к Gunicorn.

Что это такое?

Django — это мощный фреймворк, который позволяет запустить приложение или веб-сайт на Python. Django включает в себя упрощенный сервер разработки для локального тестирования кода.

Загрузка и установка пакетов

Для начала обновите локальную базу пакетов:

sudo apt update

sudo apt upgrade

Примечание: по умолчанию на серверах Ubuntu 18.04 используется Python 3.

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

sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl

В результате у вас будут установлены средства разработки Python, необходимые для сборки Gunicorn, pip, система баз данных Postgres и библиотеки, необходимые для взаимодействия с ней, а также веб-сервер Nginx.

Создание базы данных и пользователя PostgreSQL

Во время установки Postgres был создан пользователь с именем postgres — администратор СУБД PostgreSQL. Более подробно про работу с PostgreSQL можно ознакомиться в нашей инструкции.

Подключитесь к СУБД с помощью следующей команды:

sudo -u postgres psql

Создайте базу данных для вашего проекта:

CREATE DATABASE cloudproject;

Далее создайте пользователя для созданной БД, указав безопасный пароль:

CREATE USER clouduser WITH PASSWORD 'password';

Для корректной работы Django кодировку необходимо установить в стандарт UTF-8:

ALTER ROLE clouduser SET client_encoding TO 'utf8';

Далее установите схему изоляции транзакции по умолчанию в «зафиксированное чтение», при котором блокируется чтение из незафиксированных транзакций:

ALTER ROLE clouduser SET default_transaction_isolation TO 'read committed';

Установите рекомендуемый стандарт времени UTC:

ALTER ROLE clouduser SET timezone TO 'UTC';

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

GRANT ALL PRIVILEGES ON DATABASE cloudproject TO clouduser;

Выйдите из командной строки PostgreSQL, набрав:

\q

Создание виртуальной среды Python для проекта

Сначала необходимо настроить доступ к команде virtualenv, которую можно установить с помощью pip:

sudo -H pip3 install --upgrade pip

sudo -H pip3 install virtualenv

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

Создайте и перейдите в каталог, где вы собираетесь хранить файлы вашего проекта. В нашем примере используется название каталога 1cloud:

mkdir ~/cloudproject

cd ~/cloudproject

В каталоге проекта создайте виртуальную среду Python. Выберете название среды, которое имеет отношение к вашему проекту, в нашем примере мы используем название cloudenv:

virtualenv cloudenv

В результате этих действий будет создано откружение в вашем каталоге, внутри будет установлена локальная версия Python и локальная версия pip. Это позволяет настроить изолированную среду Python для Jupyter.

Перед установкой Jupyter нам нужно активировать виртуальную среду, указав вместо 1cloud название вашей среды:

source cloudenv/bin/activate

Когда виртуальная среда активирована, установите Django, Gunicorn и адаптер psycopg2 PostgreSQL с помощью локального экземпляра pip:

pip install django gunicorn psycopg2-binary

Создание и настройка проекта Django

Создание проекта

Создадим проект в настроенной виртуальной среде, явно задав название проекта и путь:

django-admin.py startproject cloudproject ~/cloudproject

Настройка параметров проекта

Для запуска созданного проекта необходимо настроить его параметры. Откройте файл настроек в текстовом редакторе, например nano:

nano ~/cloudproject/cloudproject/settings.py

Найдите директиву ALLOWED_HOSTS и в качестве ее значения укажите IP-адрес или доменное имя сервера:

ALLOWED_HOSTS = ['your_server_domain_or_IP']

Например:

ALLOWED_HOSTS = ['111.111.111.111']

Затем найдите раздел, который настраивает доступ к базе данных. Он начинается с ключевого слова DATABASES. Укажите собственные значения переменных NAME,USER,PASSWORD ранее созданных в PostgreSQL:

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.postgresql_psycopg2',

'NAME': 'cloudproject',

'USER': 'clouduser',

'PASSWORD': 'password',

'HOST': 'localhost',

'PORT': '',

}

}

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

STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

Завершение начальной настройки проекта

Перенесите исходную схему базы данных в базу данных PostgreSQL, используя скрипт управления:

~/cloudproject/manage.py makemigrations

~/cloudproject/manage.py migrate

Создайте административного пользователя для проекта, набрав:

~/cloudproject/manage.py createsuperuser

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

Соберите весь статический контент в каталог, который был настроен:

~/cloudproject/manage.py collectstatic

С помощью ufw откройте порт 8000 на котором по умолчанию будет запущен Django:

sudo ufw allow 8000

Наконец, вы можете протестировать проект, запустив сервер Django с помощью этой команды:

~/cloudproject/manage.py runserver 0.0.0.0:8000

В любом удобном веб-браузере перейдите на ваше доменное имя или IP-адрес с указанием порта 8000:
http://server_domain_or_IP:8000

Например:
http://111.111.111.111:8000

Тестирование работы Gunicorn

Перед тем, как покинуть виртуальную среду, необходимо протестировать Gunicorn, чтобы убедиться, что программа может обслуживать приложение. Это можно сделать, перейдя в каталог проекта и используя gunicorn для загрузки модуля WSGI:

cd ~/cloudproject
gunicorn --bind 0.0.0.0:8000 cloudproject.wsgi

В результате Gunicorn будет запущен на том же интерфейсе, на котором работал сервер разработки Django. Вы можете вернуться в браузер и снова протестировать приложение.

Теперь настройка приложения Django завершена. Необходимо выйти из виртуальной среды, набрав:

deactivate

Создание systemd Socket и Service Files для Gunicorn

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

Создайте и откройте служебный файл systemd для Gunicorn в текстовом редакторе, например nano:

sudo nano /etc/systemd/system/gunicorn.service

Вставьте следующие строки:

[Unit]

Description=gunicorn daemon

After=network.target

[Service]

User=root

Group=www-data

WorkingDirectory=/root/cloudproject

ExecStart=/root/cloudproject/cloudenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/root/myproject/myproject.sock myproject.wsgi:application

[Install]

WantedBy=multi-user.target

Раздел [Unit] используется для указания метаданных и зависимостей. Здесь находится описание сервиса и информация для системы инициализации. В разделе [Service] определяется пользователь и группа, от имени которых необходимо выполнять работу. Группа www-data используется не случайно, чтобы Nginx мог легко общаться с Gunicorn. Затем в WorkingDirectory указывается рабочий каталог и в ExecStart команда для запуска сервиса. Наконец, раздел [Install] указывает, чтобы служба стартовала, когда обычная многопользовательская система запущена:

Теперь можно запустить созданную службу Gunicorn и включить ее так, чтобы она запускалась при загрузке:

sudo systemctl start gunicorn

sudo systemctl enable gunicorn

Проверка Gunicorn Socket File

Для начала необходимо проверить состояние процесса, чтобы узнать, удалось ли его запустить:

sudo systemctl status gunicorn

Затем проверьте наличие файла cloudproject.sock в каталоге вашего проекта:

ls /root/cloudproject


Output: manage.py  cloudproject  cloudenv  cloudproject.sock  static

Если вы не нашли файл cloudproject.sock в каталоге, это означает, что Gunicorn не смог правильно запуститься. Проверьте журналы процесса Gunicorn, набрав:

sudo journalctl -u gunicorn

Настройка Nginx

Теперь, когда Gunicorn настроен, нужно настроить Nginx для передачи трафика процессу. Создайте и откройте новый файл в каталоге сайтов Nginx:

sudo nano /etc/nginx/sites-available/cloudproject

Внутри создайте блок сервера, вставив следующие строки:

server {

listen 80;

server_name ;

location = /favicon.ico { access_log off; log_not_found off; }

location /static/ {

root /root/cloudproject;

}

location / {

include proxy_params;

proxy_pass http://unix:/root/cloudproject/cloudproject.sock;

}

}

В блоке указано, что nginx должен прослушивать порт 80 и отвечать на доменное имя или IP-адрес сервера. Далее указано игнорировать любые проблемы с поиском значка и путь до статических ресурсов. Последний блок location / {} соответствует всем другим запросам.

Сохраните и закройте файл после внесения изменений. Теперь мы можем включить файл, связав его с каталогом сайтов:

sudo ln -s /etc/nginx/sites-available/cloudproject /etc/nginx/sites-enabled

Далее необходимо проверить конфигурацию Nginx на наличие синтаксических ошибок, набрав:

sudo nginx -t

Если ошибки не найдены, перезапустите Nginx, набрав:

sudo systemctl restart nginx

Наконец, нужно открыть брандмауэр для нормального трафика через порт 80. Поскольку доступ к серверу разработки больше не нужен, нужно удалить правило, которое открывает порт 8000:

sudo ufw delete allow 8000

sudo ufw allow 'Nginx Full'

В этом руководстве создается проект Django в собственной виртуальной среде. Мы настроили Gunicorn для перевода клиентских запросов, чтобы Django мог их обработать. После этого мы настроили Nginx в качестве обратного прокси-сервера для обработки клиентских подключений и предоставления правильного проекта в зависимости от запроса клиента.

 

P. S. Другие инструкции:




Спасибо за Вашу оценку!
К сожалению, проголосовать не получилось. Попробуйте позже

Что такое Gunicorn и Nginx в двух словах

  • Главная
  • Справочник
  • Информатика
  • Python
  • Что такое Gunicorn и Nginx в двух словах

При размещении веб-приложения Python на продакшене вы не сможете обойтись без использования сервера WSGI и веб-сервера.

Gunicorn и Nginx — это самые надежные и популярные варианты таких приложений. Почему они используются в связке?

Nginx и Gunicorn работают вместе

Nginx принимает все запросы из Интернета. Он может обрабатывать их очень быстро и обычно настраивается так, чтобы пропускать только те запросы, которые действительно должны поступить в ваше веб-приложение. Остальные он блокирует.

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

Они составляют отличную команду! Каждый может сделать что-то, что другой не может. Давайте посмотрим на их сильные стороны подробно, и как они дополняют друг друга.

Nginx

Nginx — это веб-сервер, а если точнее то это HTTP-сервер и IMAP/POP3 прокси-сервер для UNIX-подобных платформ (FreeBSD и GNU/Linux). Он оптимизирован для всех вещей, которые должен делать веб-сервер. Для балансировки нагрузки, защита от DDoS-атак, работает как обратный прокси-сервер.

Под обратным проксированием обычно понимается процесс, в котором сервер, получающий запрос от клиента, не обрабатывает его полностью самостоятельно, а частично или целиком отправляет этот запрос для обработки другим (upstream) серверам. То есть, не перенаправляет клиента, а самостоятельно отправляет запрос и возвращает полученный ответ обратно клиенту.

Вот несколько вещей, в которых он делает свою работу очень хорошо:

  • Маршрутизация доменного имени (решает, куда должны отправляться запросы, или в случае ответа об ошибке)
  • Обслуживание статических файлов
  • Высокая скорость обработки множества запросов, поступающих одновременно
  • Общение с медленными клиентами
  • Направление запросов, которые должны быть динамическими в Gunicorn
  • Работа по SSL (здесь происходит https)
  • Экономия вычислительных ресурсов (процессор и память) по сравнению с кодом Python
  • И многое другое, если вы настроите это (балансировка нагрузки, кэширование и т. Д.)

Вещи, которые Nginx не может сделать:

  • Запуск веб-приложений Python
  • Перевести запросы в WSGI

Gunicorn

Как только Nginx решит, что конкретный запрос должен быть передан в Gunicorn (согласно правилам, по которым он был настроен), в работу вступает Gunicorn.

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

  • Запуск пула рабочих процессов / потоков (выполнение вашего кода!)
  • Переводит запросы, поступающие от Nginx, для совместимости с WSGI
  • Переведит ответы WSGI вашего приложения в правильные ответы HTTP
  • На самом деле вызывает код Python, когда приходит запрос
  • Gunicorn может общаться с различными веб-серверами

Что Gunicorn не может сделать для вас:

  • Не может работать с фронтендом
  • Не может поддерживать работу по SSL (без обработки https)
  • Не может обеспечить работу полноценного веб-сервера, как например Nginx

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

В вашем браузере отключен Javascript.
Чтобы произвести расчеты, необходимо разрешить элементы ActiveX!

Настройка Django с Nginx, Gunicorn, virtualenv, supervisor и PostgreSQL

Django — это эффективная, универсальная и динамично развивающаяся среда разработки веб-приложений. Когда Django изначально приобрел популярность, рекомендуемая установка для запуска приложений Django была основана на Apache с mod_wsgi. Искусство запуска Django продвинулось вперед, и в наши дни рекомендуемая конфигурация более эффективна и надежна, но также более сложна и включает в себя такие инструменты, как Nginx, Gunicorn, virtualenv, supervisord и PostgreSQL.

В этом тексте я объясню, как объединить все эти компоненты в сервер Django, работающий в Linux.

Предварительные требования

Я предполагаю, что у вас есть сервер, на котором у вас есть права root. Я использую сервер под управлением Debian 7, поэтому все здесь также должно работать на сервере Ubuntu или другом дистрибутиве на основе Debian. Если вы используете дистрибутив на основе RPM (например, CentOS), вам нужно будет заменить команды aptitude на их аналоги yum , а если вы используете FreeBSD, вы можете установить компоненты из портов.

Если у вас нет сервера, с которым можно играть, я бы порекомендовал недорогие VPS-серверы, предлагаемые Digital Ocean. Если вы перейдете по этой ссылке при регистрации, вы оплатите небольшую часть моего счета за сервер 🙂

Я также предполагаю, что вы настроили свой DNS так, чтобы домен указывал на IP-адрес сервера. В этом тексте я представляю, что ваш домен — example.com

Обновите вашу систему

Давайте начнем с проверки актуальности нашей системы.

  $ sudo aptitude update
$ sudo aptitude upgrade
  

PostgreSQL

Чтобы установить PostgreSQL в системе на основе Debian, выполните следующую команду:

  $ sudo aptitude install postgresql postgresql-contrib
  

Создайте пользователя базы данных и новую базу данных для приложения.Получите идеальный пароль от GRC.

  $ sudo su - postgres
postgres @ django: ~ $ createuser --interactive -P
Введите имя добавляемой роли: hello_django
Введите пароль для новой роли:
Введите его еще раз:
Будет ли новая роль суперпользователем? (да / нет) нет
Будет ли разрешено новой роли создавать базы данных? (да / нет) нет
Будет ли позволено новой роли создавать новые роли? (да / нет) нет
postgres @ django: ~ $

postgres @ django: ~ $ createdb --owner hello_django привет
postgres @ django: ~ $ выйти
$
  

Пользователь приложения

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

Создайте пользователя для своего приложения с именем hello и назначьте его системной группе webapps .

  $ sudo groupadd - системные веб-приложения
$ sudo useradd --system --gid webapps --shell / bin / bash --home / webapps / hello_django привет
  

Установите virtualenv и создайте среду для своего приложения

Virtualenv — это инструмент, который позволяет вам создавать отдельные среды Python в вашей системе.Это позволяет запускать приложения с разными наборами требований одновременно (например, одно на основе Django 1.5, другое на основе 1.6). virtualenv легко установить на Debian:

  $ sudo aptitude install python-virtualenv
  
Создайте и активируйте среду для вашего приложения

Мне нравится хранить все свои веб-приложения в каталоге / webapps / . Если вы предпочитаете / var / www / , / srv / или что-то еще, используйте это вместо этого.Создайте каталог для хранения вашего приложения в / webapps / hello_django / и измените владельца этого каталога на пользователя вашего приложения hello

  $ sudo mkdir -p / webapps / hello_django /
$ sudo chown привет / webapps / hello_django /
  

Как пользователь приложения создайте виртуальную среду Python в каталоге приложения:

  $ sudo su - привет
привет @ django: ~ $ cd / webapps / hello_django /
привет @ django: ~ $ virtualenv.

Новый исполняемый файл python в hello_django / bin / python
Установка раздачи..............сделанный.
Установка пипса ..................... готово.

привет @ django: ~ $ исходный бин / активировать
(hello_django) привет @ django: ~ $
  

Теперь ваша среда активирована, и вы можете приступить к установке Django внутри нее.

  (hello_django) привет @ django: ~ $ pip установить django

Скачивание / распаковка django
(...)
Установка собранных пакетов: django
(...)
Успешно установлен django
Убираться...
  

Ваша среда с Django должна быть готова к использованию.Идите вперед и создайте пустой проект Django.

  (hello_django) привет @ django: ~ $ django-admin.py startproject привет
  

Вы можете протестировать это, запустив сервер разработки:

  (hello_django) привет @ django: ~ $ cd привет
(hello_django) привет @ django: ~ $ python manage.py runserver example.com:8000
Проверка моделей ...

0 ошибок найдено
09 июня, 2013 - 06:12:00
Django версии 1.5.1, используя настройки hello.settings
Сервер разработки работает по адресу http: // example.com: 8000 /
Закройте сервер, нажав CONTROL-C.
  

Теперь у вас должен быть доступ к серверу разработки с http://example.com:8000

Разрешение другим пользователям доступа для записи в каталог приложения

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

  $ sudo chown -R привет: пользователи / webapps / hello_django
$ sudo chmod -R g + w / webapps / hello_django
  

Чтобы узнать, в каких группах вы состоите, введите команду groups или id .

  $ id
uid = 1000 (michal) gid = 1000 (michal) группы = 1000 (michal), 27 (sudo), 100 (пользователи)
  

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

  $ sudo usermod -a -G пользователи `whoami`
  

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

Настроить PostgreSQL для работы с Django

Чтобы использовать Django с PostgreSQL, вам необходимо установить адаптер базы данных psycopg2 в вашей виртуальной среде. Этот шаг требует компиляции собственного расширения (написанного на C). Компиляция завершится ошибкой, если не удастся найти файлы заголовков и статические библиотеки, необходимые для компоновки программ на C с libpq (библиотека для связи с Postgres) и сборки модулей Python (пакет python-dev ).Сначала мы должны установить эти два пакета, а затем мы можем установить psycopg2 с помощью PIP.

Установить зависимости:

  $ sudo aptitude install libpq-dev python-dev
  

Установите адаптер базы данных psycopg2 :

  (hello_django) привет @ django: ~ $ pip install psycopg2
  

Теперь вы можете настроить раздел баз данных в своем settings.py :

 1
2
3
4
5
6
7
8
9
10
 
  БАЗ ДАННЫХ = {
    'дефолт': {
        'ДВИГАТЕЛЬ': 'django.db.backends.postgresql_psycopg2 ',
        "ИМЯ": "привет",
        'ПОЛЬЗОВАТЕЛЬ': 'hello_django',
        'ПАРОЛЬ': '1Ak5RTQt7mtw0OREsfPhJYzXIak41gnrm5NWYEosCeIduJck10awIzoys1wvbL8',
        'HOST': 'localhost',
        'PORT': '', # По умолчанию пустая строка.
    }
}
  

И, наконец, создайте исходную базу данных для Django:

  (hello_django) hello @ django: ~ $ python manage.py migrate
  

В более старых версиях Django эквивалентная команда была: manage.py syncdb

Gunicorn

В производстве мы будем использовать не однопоточный сервер разработки Django, а специальный сервер приложений, называемый gunicorn.

Установите Gunicorn в виртуальной среде вашего приложения:

  (hello_django) привет @ django: ~ $ pip install gunicorn
Скачивание / распаковка gunicorn
  Скачивание gunicorn-0.17.4.tar.gz (372Kb): 372Kb скачано
  Запуск setup.py egg_info для пакета gunicorn

Установка собранных пакетов: gunicorn
  Запуск настройки.Py установить для Gunicorn

    Установка скрипта gunicorn_paster в / webapps / hello_django / bin
    Установка скрипта gunicorn в / webapps / hello_django / bin
    Установка скрипта gunicorn_django в / webapps / hello_django / bin
Gunicorn успешно установлен
Убираться...
  

Теперь, когда у вас есть gunicorn, вы можете проверить, может ли он обслуживать ваше приложение Django, выполнив следующую команду:

  (hello_django) hello @ django: ~ $ gunicorn hello.wsgi: application --bind example.com: 8001
  

Теперь у вас должен быть доступ к серверу Gunicorn с http://example.com:8001. Я намеренно изменил порт 8000 на 8001, чтобы ваш браузер установил новое соединение.

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

Установить исполняемый бит в скрипте gunicorn_start :

  $ sudo chmod u + x bin / gunicorn_start
  

Вы можете протестировать свой сценарий gunicorn_start , запустив его от имени пользователя hello .

  $ sudo su - привет
привет @ django: ~ $ bin / gunicorn_start
Запуск hello_app как hello
2013-06-09 14:21:45 [10724] [INFO] Запуск Gunicorn 18.0
2013-06-09 14:21:45 [10724] [DEBUG] Arbiter загружен
2013-06-09 14:21:45 [10724] [INFO] Прослушивание: unix: /webapps/hello_django/run/gunicorn.sock (10724)
2013-06-09 14:21:45 [10724] [INFO] Использование worker: sync
2013-06-09 14:21:45 [10735] [INFO] Загрузочный воркер с pid: 10735
2013-06-09 14:21:45 [10736] [INFO] Загрузка worker с pid: 10736
2013-06-09 14:21:45 [10737] [INFO] Загрузочный воркер с pid: 10737

^ C (CONTROL-C, чтобы убить Gunicorn)

2013-06-09 14:21:48 [10736] [INFO] Рабочий выходит (pid: 10736)
2013-06-09 14:21:48 [10735] [INFO] Рабочий выходит (pid: 10735)
2013-06-09 14:21:48 [10724] [INFO] Обработка сигнала: int
2013-06-09 14:21:48 [10737] [INFO] Рабочий выходит (pid: 10737)
2013-06-09 14:21:48 [10724] [INFO] Завершение работы: Мастер
$ exit
  

Обратите внимание на параметры, установленные в gunicorn_start .Вам нужно будет указать пути и имена файлов в соответствии с вашими настройками.

В качестве практического правила установите --workers ( NUM_WORKERS ) по следующей формуле: 2 * CPU + 1. Идея состоит в том, что в любой момент времени половина ваших рабочих будет занята выполнением I / O. Для машины с одним процессором это даст вам 3.

Аргумент --name ( NAME ) указывает, как ваше приложение будет идентифицировать себя в таких программах, как top или ps .По умолчанию используется gunicorn , что может затруднить отличия от других приложений, если у вас есть несколько приложений на основе Gunicorn, работающих на одном сервере.

Для того, чтобы аргумент --name работал, вам необходимо установить модуль Python с именем setproctitle . Для создания этого собственного расширения pip должен иметь доступ к файлам заголовков C для Python. Вы можете добавить их в свою систему с помощью пакета python-dev , а затем установить setproctitle .

  $ sudo aptitude install python-dev
(hello_django) привет @ django: ~ $ pip install setproctitle
  

Теперь, когда вы перечисляете процессы, вы должны видеть, какой пулемет какому приложению принадлежит.

  $ пс доп.
USER PID% CPU% MEM VSZ RSS TTY STAT ВРЕМЯ НАЧАЛА КОМАНДА
(...)
привет 11588 0,7 0,2 58400 11568? S 14:52 0:00 gunicorn: мастер [hello_app]
привет 11602 0,5 0,3 66584 16040? S 14:52 0:00 gunicorn: рабочий [hello_app]
привет 11603 0.5 0,3 66592 16044? S 14:52 0:00 gunicorn: рабочий [hello_app]
привет 11604 0,5 0,3 66604 16052? S 14:52 0:00 gunicorn: рабочий [hello_app]
  

Запуск и контроль с помощью Supervisor

Ваш сценарий gunicorn_start теперь готов и работает. Нам нужно убедиться, что он запускается автоматически вместе с системой и может автоматически перезапускаться, если по какой-то причине он неожиданно завершает работу. С этими задачами легко справится служба под названием supervisord.Установка проста:

  $ sudo aptitude install supervisor
  

Когда Supervisor установлен, вы можете дать ему программы для запуска и просмотра, создав файлы конфигурации в каталоге /etc/supervisor/conf.d . Для нашего приложения hello мы создадим файл с именем /etc/supervisor/conf.d/hello.conf со следующим содержанием:

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

Создайте файл для хранения сообщений журнала вашего приложения:

  привет @ django: ~ $ mkdir -p / webapps / hello_django / logs /
привет @ django: ~ $ touch / webapps / hello_django / logs / gunicorn_supervisor.журнал
  

После сохранения файла конфигурации для вашей программы вы можете попросить супервизора перечитать файлы конфигурации и обновить (что запустит ваше недавно зарегистрированное приложение).

  $ sudo supervisorctl перечитать
привет: доступно
$ sudo supervisorctl update
привет: добавлена ​​группа процессов
  

Вы также можете проверить статус своего приложения или запустить, остановить или перезапустить его с помощью супервизора.

  $ sudo supervisorctl status привет
привет RUNNING pid 18020, время безотказной работы 0:00:50
$ sudo supervisorctl стоп привет
привет: остановился
$ sudo supervisorctl start привет
привет: началось
$ sudo supervisorctl перезапуск привет
привет: остановился
привет: началось
  

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

Nginx

Пора настроить Nginx в качестве сервера для нашего приложения и его статических файлов. Установите и запустите Nginx:

  $ sudo aptitude install nginx
$ sudo service nginx start
  

Вы можете перейти на свой сервер (http://example.com) с помощью браузера, и Nginx должен приветствовать вас словами «Добро пожаловать в nginx!».

Создание конфигурации виртуального сервера Nginx для Django

Каждый виртуальный сервер Nginx должен описываться файлом в каталоге / etc / nginx / sites-available .Вы выбираете, какие сайты хотите включить, создавая символические ссылки на сайты в каталоге / etc / nginx / sites-enabled .

Создайте новый файл конфигурации сервера nginx для вашего приложения Django, запущенного на example.com, в каталоге / etc / nginx / sites-available / hello . Файл должен содержать что-то вроде следующих строк. Более подробный пример доступен у разработчиков Gunicorn.

Создайте символическую ссылку в папке с поддержкой сайтов :

  $ sudo ln -s / etc / nginx / sites-available / hello / etc / nginx / sites-enabled / hello
  

Перезапустите Nginx:

  $ sudo service nginx перезапуск
  

Если вы перейдете на свой сайт, вы должны увидеть приветственную страницу Django, работающую на Nginx и Gunicorn.Идите вперед и развивайтесь как душе угодно.

На этом этапе вы можете обнаружить, что вместо приветственной страницы Django вы встретите по умолчанию « Добро пожаловать в nginx! ”стр. Это может быть вызвано файлом конфигурации по умолчанию , который устанавливается вместе с Nginx и маскирует конфигурацию вашего нового сайта. Если вы не планируете его использовать, удалите символическую ссылку на этот файл из / etc / nginx / sites-enabled .

Если у вас возникнут проблемы с описанной выше настройкой, напишите мне.

Окончательная структура каталогов

Если вы следовали этому руководству, вы должны были создать структуру каталогов, подобную этой:

  / webapps / hello_django /
├── bin <= Каталог, созданный virtualenv
│ ├── activate <= Скрипт активации среды
│ ├── django-admin.py
│ ├── пушечный рог
│ ├── gunicorn_django
│ ├── gunicorn_start <= Скрипт для запуска приложения с Gunicorn
│ └── питон
├── hello <= каталог проекта Django, добавьте это в PYTHONPATH
│ ├── управлять.ру
│ ├── project_application_1
│ ├── project_application_2
│ └── hello <= Каталог настроек проекта
│ ├── __init__.py
│ ├── settings.py <= hello.settings - модуль настроек будет использовать Gunicorn
│ ├── urls.py
│ └── wsgi.py <= hello.wsgi - модуль WSGI будет использовать Gunicorn
├── включить
│ └── python2.7 -> /usr/include/python2.7
├── lib
│ └── python2.7
├── lib64 -> / webapps / hello_django / lib
├── logs <= Каталог журналов приложений
│ ├── gunicorn_supervisor.журнал
│ ├── nginx-access.log
│ └── nginx-error.log
├── media <= Папка с загруженными пользователем файлами
├── беги
│ └── пушечный рог. Носок
└── static <= Отсюда собирать и обслуживать статические файлы
  

Удаление приложения Django

Если придет время удалить программу, выполните следующие действия.

Удалите виртуальный сервер из папки Nginx с поддержкой сайтов :

  $ sudo rm / etc / nginx / с поддержкой сайтов / hello_django
  

Перезапустите Nginx:

  $ sudo service nginx перезапуск
  

Если вы никогда не планируете использовать это приложение снова, вы можете удалить его файл конфигурации также из каталога sites-available

  $ sudo rm / etc / nginx / сайты-доступные / hello_django
  

Остановить приложение с помощью Supervisor:

  $ sudo supervisorctl stop hello
  

Удалите приложение из каталога управляющих скриптов Supervisor:

  $ sudo rm / etc / supervisor / conf.d / hello.conf
  

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

  $ sudo rm -r / webapps / hello_django
  

Различные настройки в производстве

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

Для этого я обычно создаю второй файл настроек с именем settings_local.py , который содержит переопределения некоторых значений, но импортирует каждое значение по умолчанию, например:

 1
2
 
  от привет.импорт настроек *
БАЗЫ ДАННЫХ = ...
  

Затем вы можете указать Django использовать этот файл локальных настроек, указав переменную среды DJANGO_SETTINGS_MODULE = hello.settings_local .

Запуск нескольких приложений

Если вам нужна помощь в настройке сервера Nginx для запуска нескольких приложений Django, ознакомьтесь с моей следующей статьей.

Переводы

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

.

Запуск Gunicorn - документация Gunicorn 20.0.4

Gunicorn также обеспечивает интеграцию с приложениями Django и Paste Deploy.

Джанго

Gunicorn будет искать вызываемое приложение WSGI с именем , если не указано иное.
Итак, для типичного проекта Django вызов Gunicorn будет выглядеть так:

 $ пулемет myproject.wsgi
 

Примечание

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

Вы можете использовать
–Env option
чтобы указать путь для загрузки настроек. В случае необходимости вы также можете
добавьте путь вашего приложения к PYTHONPATH , используя
–Pythonpath
вариант:

 $ gunicorn --env DJANGO_SETTINGS_MODULE = myproject.settings myproject.wsgi
 

Вставить развертывание

Фреймворки

, такие как Pyramid и Turbogears, обычно настраиваются с помощью Paste
Файлы конфигурации развертывания. Если вы хотите использовать эти файлы с
Gunicorn, есть два подхода.

Как исполнитель серверов Gunicorn может обслуживать ваше приложение, используя команды из
ваш каркас, например pserve или редуктор . Чтобы использовать Gunicorn с этими
команд, укажите его как сервер в вашем файле конфигурации:

 [сервер: основной]
use = egg: gunicorn # main
хост = 127.0.0.1
порт = 8080
рабочих = 3
 

Это самый быстрый способ начать работу с Gunicorn, но есть
некоторые ограничения. Gunicorn не будет контролировать работу приложения.
загружен, поэтому такие настройки, как перезагрузка, не будут иметь никакого эффекта, а Gunicorn будет
невозможно выполнить горячее обновление работающего приложения.Использование опции daemon может
запутать инструмент командной строки. Вместо этого используйте встроенную поддержку этих
функции, предоставляемые этим инструментом. Например, введите pserve --reload вместо
указав reload = True в блоке конфигурации сервера. Для продвинутых
конфигурация Gunicorn, например Server Hooks с указанием Gunicorn
файл конфигурации с использованием ключа config поддерживается.

Чтобы использовать всю мощь перезагрузки Gunicorn и обновлений горячего кода, используйте
вставить вариант, чтобы вместо этого запустить приложение.При таком использовании Gunicorn
будет использовать приложение, определенное файлом конфигурации PasteDeploy, но
Gunicorn не будет использовать какую-либо конфигурацию сервера, указанную в файле. Вместо,
настроить пулемет.

Например:

 $ gunicorn --paste development.ini -b: 8080 --chdir / путь / к / проекту
 

Или используйте другое приложение:

 $ gunicorn --paste development.ini # admin -b: 8080 --chdir / путь / к / проекту
 

При обоих подходах Gunicorn будет использовать любой раздел логгеров, найденный в Paste
Файл конфигурации развертывания, если не указано иное, указав
дополнительные настройки ведения журнала.

.HTTP-сервер

Python WSGI для UNIX

Вот краткое изложение того, как начать работу с Gunicorn. Подробнее читайте в документации.

  $ pip install gunicorn
  $ cat myapp.py
    def приложение (среда, start_response):
        data = b "Привет, мир! \ n"
        start_response ("200 ОК", [
            ("Content-Type", "text / plain"),
            ("Content-Length", str (len (данные)))
        ])
        вернуть iter ([данные])
  $ gunicorn -w 4 myapp: приложение
  [2014-09-10 10:22:28 +0000] [30869] [INFO] Слушает: http: // 127.0,0.1: 8000 (30869)
  [2014-09-10 10:22:28 +0000] [30869] [ИНФОРМАЦИЯ] Использование worker: sync
  [2014-09-10 10:22:28 +0000] [30874] [INFO] Загрузочный рабочий с pid: 30874
  [2014-09-10 10:22:28 +0000] [30875] [INFO] Загрузочный рабочий с pid: 30875
  [2014-09-10 10:22:28 +0000] [30876] [ИНФОРМАЦИЯ] Загрузочный рабочий с pid: 30876
  [2014-09-10 10:22:28 +0000] [30877] [INFO] Загрузочный рабочий с pid: 30877
 

Gunicorn - это HTTP-сервер WSGI. Лучше всего использовать Gunicorn за прокси-сервером HTTP.Мы настоятельно рекомендуем вам использовать nginx.

Вот пример, который поможет вам начать работу с nginx:

  server {
    слушать 80;
    имя_сервера example.org;
    access_log /var/log/nginx/example.log;

    место расположения / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $ host;
        proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
    }
  }
 

Nginx настроен как обратный прокси-сервер для сервера Gunicorn, работающего на локальном порту 8000.

Прочтите полную документацию на docs.gunicorn.org

Gunicorn использует GitHub для управления проектами. Проблемы GitHub используются для трех разных целей:

Руководство по сопровождению проекта доступно на вики

.

Канал Gunicorn находится на IRC Freenode
сеть. Вы можете пообщаться с сообществом на канале #gunicorn.

Отчеты об ошибках, запросы на улучшения и задачи обычно помещаются в Github.
трекер проблем.

Список рассылки по безопасности - это место, где можно сообщить о проблемах безопасности. Только
на него подписаны разработчики. Чтобы разместить сообщение в списке, используйте
адрес [email protected]

Более подробную документацию можно найти на docs.gunicorn.org.

Содержимое:

.

python - Gunicorn / Django, ImportError: нет модуля с именем application.wsgi

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

Загрузка…

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *