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
Вот на этом всё, у меня всё запустилось и работает, но в случае ошибок это очень индивидуально, поэтому рекомендую не пропускать шаги с тестированием работоспособности, чтобы можно было понять, на каком этапе возникла ошибка.
При написании использовал:
- www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-18-04-ru
- vexxhost.com/resources/tutorials/how-to-deploy-django-on-nginx-gunicorn-with-postgres
- 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:
(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
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
.