Введение
Django — это веб-фреймворк, упрощающий запуск приложений Python или веб-сайтов. Django включает в себя сервер разработки для локального тестирования кода.
В этом руководстве мы увидим, как установить и настроить Django с базой данных PostgreSQL на сервере Gunicorn, который взаимодействует с приложениями, написанными на Python. Наконец, мы установим Nginx в качестве обратного прокси для Gunicorn.
Убунту 18.04 ЛТС.
Предпосылки
Прежде чем приступить к работе с этим руководством, на вашем сервере должен быть установлен пользователь без полномочий root с привилегиями sudo. Следуйте этому руководству: Первоначальная настройка в Ubuntu 18.04 LTS
Установите Python PostgreSQL Nginx
Загрузите все пакеты, необходимые для выполнения этого руководства, вы можете напрямую использовать официальные репозитории Ubuntu. Обновите локальный индекс пакетов apt, а затем загрузите и установите необходимые пакеты. Из терминала:
sudo apt update
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl
Настроить PostgreSQL
На этапе установки Postgres будет создан новый системный пользователь postgres с тем же именем, что и у администратора PostgreSQL. Мы должны использовать этого пользователя для выполнения административных задач. Затем войдите под новым пользователем с параметром -u:
sudo -u postgres psql
Создайте базу данных для нашего приложения:
CREATE DATABASE myapp;
Создайте пользователя для нашей новой базы данных:
CREATE USER myappuser WITH PASSWORD 'TUA_PASSWORD';
Установите некоторые рекомендуемые параметры для новой базы данных:
ALTER ROLE myappuser SET client_encoding TO 'utf8';
ALTER ROLE myappuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myappuser SET timezone TO 'UTC';
Предоставьте новому пользователю права администратора базы данных:
GRANT ALL PRIVILEGES ON DATABASE myapp TO myappuser;
Закройте приглашение PostgreSQL:
\q
Создайте виртуальную среду на Python для управления нашим приложением.
Установите virtualenv с помощью pip:
sudo -H pip3 install --upgrade pip
sudo -H pip3 install virtualenv
Создайте новую папку для нашего приложения:
mkdir ~/myappdir
Войдите в только что созданную папку:
cd ~/myappdir
Создайте виртуальную среду в Python:
virtualenv myappenv
Эта команда создаст каталог с именем myappenv внутри каталога myappdir. Внутри он установит локальную версию Python и локальную версию pip. Мы можем использовать его для установки и настройки изолированной среды Python для нашего проекта.
Активируйте виртуальную среду:
source myappenv/bin/activate
Ваше приглашение должно измениться, чтобы указать, что вы сейчас работаете в виртуальной среде Python. Пример:
(myappenv) user@host:~/myappdir$.
Когда виртуальная среда активирована, используйте pip вместо pip3, даже если вы используете Python 3.
Установите требования Python нашего проекта:
pip install django gunicorn psycopg2-binary
Создайте приложение Джанго
Поскольку у нас уже есть каталог проекта, мы скажем Django установить файлы в тот же каталог:
django-admin.py startproject myapp ~/myappdir
Измените настройки в файле settings.py.
nano ~/myappdir/myapp/settings.py
Найдите запись ALLOWED_HOSTS. Эта запись определяет список IP-адресов серверов или доменных имен, которые можно использовать для подключения к экземпляру Django. Любой запрос, поступающий с заголовком Host, отсутствующим в этом списке, вызовет исключение.
В квадратных скобках укажите IP-адреса или доменные имена, связанные с вашим сервером Django. Каждый IP-адрес или доменное имя должны быть записаны в двойных кавычках с элементами, разделенными запятой. Пример:
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['NOME_DOMINIO', 'INDIRIZZO_IP',..., 'localhost']
Затем найдите запись DATABASES, чтобы настроить доступ к нашей базе данных PostgreSQL.
Измените настройки с информацией о вашей базе данных PostgreSQL:
...
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myapp',
'USER': 'myappuser',
'PASSWORD': 'TUA_PASSWORD',
'HOST': 'localhost',
'PORT': '',
}
}...
Затем перейдите в конец файла и добавьте параметр, указывающий, где следует размещать статические файлы. Это необходимо для того, чтобы Nginx обрабатывал запросы:
...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
Перенесите исходную схему базы данных в нашу базу данных PostgreSQL:
~/myappdir/manage.py makemigrations
~/myappdir/manage.py migrate
Создайте пользователя-администратора для нашего проекта:
~/myappdir/manage.py createsuperuser
Введите всю информацию, необходимую для создания нового пользователя-администратора.
Переместите все статические файлы в папку с именем static внутри нашего проекта:
~/myappdir/manage.py collectstatic
Если у вас активен брандмауэр (UFW), вам необходимо включить порт 8000:
sudo ufw allow 8000
Протестируйте приложение
Запустите приложение из терминала:
~/myappdir/manage.py runserver 0.0.0.0:8000
Откройте браузер и подключитесь к IP-адресу или доменному имени сервера:
http://DOMINIO_OPPURE_IP:8000
Для входа в админ панель добавьте /admin в конце ссылки:
http://DOMINIO_OPPURE_IP:8000/admin
Войдите в систему с пользователем и паролем, сгенерированным с помощью команды createsuperuser.
Чтобы закрыть приложение и выключить сервер, нажмите CTRL-C в терминале.
Протестируйте приложение с помощью Gunicorn
Войдите в каталог нашего проекта и используйте gunicorn для загрузки модуля проекта WSGI:
cd ~/myappdir
gunicorn --bind 0.0.0.0:8000 myapp.wsgi
Интерфейс администратора не будет иметь никакого стиля, поскольку Gunicorn не знает, как найти статический контент CSS.
Нажмите CTRL-C в окне терминала, чтобы остановить Gunicorn.
Мы можем выйти из нашей виртуальной среды, набрав:
deactivate
Создайте сокеты и служебные файлы systemd для Gunicorn. Сокет Gunicorn будет создан при запуске и будет прослушивать соединения. Когда происходит соединение, systemd автоматически запускает процесс Gunicorn для управления соединением.
Создайте и откройте файл сокета systemd для Gunicorn:
sudo nano /etc/systemd/system/gunicorn.socket
Вставьте следующие строки кода:
[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
Сохраните и закройте файл.
Затем создайте и откройте служебный файл systemd для Gunicorn. Имя файла службы должно совпадать с именем файла сокета, за исключением расширения:
sudo nano /etc/systemd/system/gunicorn.service
Указываем пользователя и группу, которых мы хотим использовать для выполнения. Введите следующие строки кода, заполнив нужные поля своими данными:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=TUO_UTENTE
Group=www-data
WorkingDirectory=/home/TUO_UTENTE/myappdir
ExecStart=/home/TUO_UTENTE/myappdir/myappenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myapp.wsgi:application
[Install]
WantedBy=multi-user.target
Сохраните и закройте файл
Теперь мы можем запустить и включить сокет Gunicorn. Это создаст файл сокета в /run/gunicorn.sock сейчас и при запуске. Когда к этому сокету будет установлено соединение, systemd автоматически запустит gunicorn.service для его обработки:
sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
Проверьте статус файла сокета Gunicorn:
sudo systemctl status gunicorn.socket
Проверьте наличие файла gunicorn.sock:
file /run/gunicorn.sock
Вы должны получить выходное сообщение, подобное следующему:
/run/gunicorn.sock: socket
Если команда systemctl status указывает, что произошла ошибка или если файл gunicorn.sock не найден в каталоге, это указывает на то, что сокет Gunicorn не может быть успешно создан. Проверьте журналы сокета Gunicorn, набрав:
Чтобы проверить журналы сокетов, в том числе на наличие ошибок:
sudo journalctl -u gunicorn.socket
Впоследствии, после активации gunicorn.socket, вы также должны активировать gunicorn.service с помощью этой команды:
curl --unix-socket /run/gunicorn.sock localhost
Чтобы проверить статус сервиса Gunicorn:
sudo systemctl status gunicorn
Вы должны получить выходное сообщение, подобное следующему:
● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2018-07-09 20:00:40 UTC; 4s ago
Main PID: 1157 (gunicorn)
Tasks: 4 (limit: 1153)
CGroup: /system.slice/gunicorn.service
├─1157 /home/noviello/myappdir/myappenv/bin/python3 /home/noviello/myappdir/myappenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myapp.wsgi:application
├─1178 /home/noviello/myappdir/myappenv/bin/python3 /home/noviello/myappdir/myappenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myapp.wsgi:application
├─1180 /home/noviello/myappdir/myappenv/bin/python3 /home/noviello/myappdir/myappenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myapp.wsgi:application
└─1181 /home/noviello/myappdir/mypmyappenvrojectenv/bin/python3 /home/noviello/myappdir/myappenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/run/gunicorn.sock myapp.wsgi:application
Jul 09 20:00:40 django1 systemd[1]: Started gunicorn daemon.
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Starting gunicorn 19.9.0
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Listening at: unix:/run/gunicorn.sock (1157)
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1157] [INFO] Using worker: sync
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1178] [INFO] Booting worker with pid: 1178
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1180] [INFO] Booting worker with pid: 1180
Jul 09 20:00:40 django1 gunicorn[1157]: [2018-07-09 20:00:40 +0000] [1181] [INFO] Booting worker with pid: 1181
Jul 09 20:00:41 django1 gunicorn[1157]: - - [09/Jul/2018:20:00:41 +0000] "GET /HTTP/1.1" 200 16348 "-" "curl/7.58.0"
Чтобы проверить статус любых ошибок:
sudo journalctl -u gunicorn
Если в файл /etc/systemd/system/gunicorn.service внесены изменения, процессы Gunicorn необходимо будет перезапустить:
sudo systemctl daemon-reload
sudo systemctl restart gunicorn
Настроить Nginx
Создайте новый блок сервера в Nginx:
sudo nano /etc/nginx/sites-available/myapp
Настройте файл следующим образом, обязательно заменив необходимые поля своими данными:
server {
listen 80;
server_name DOMINIO_OPPURE_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/{
root /home/TUO_UTENTE/myappdir;
}
location /{
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Мы настроили Nginx для поиска статических файлов в нашем ранее созданном каталоге и добавили параметры proxy_params и proxy_pass для пропуска трафика непосредственно в сокет Gunicorn.
Сохраните и закройте файл.
Включите только что созданный серверный блок:
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled
Проверьте настройки nginx:
sudo nginx -t
Если ошибок нет, перезапустите nginx:
sudo systemctl restart nginx
Если вы используете брандмауэр Ubuntu (Ufw), теперь необходимо изменить правила:
sudo ufw delete allow 8000
sudo ufw allow 'Nginx Full'
Установка и настройка Django с Postgres Nginx и Gunicorn на Ubuntu 18.04 завершена.