poloniumv's

Запуск Django-проекта на nginx с gunicorn в Arch Linux и с БД PostgreSQL

1 февраля 2017 г. 13:27

Первым делом ставим виртуальное окружение

sudo pacman -S python2-pip
sudo pip2 install virtualenv virtualenvwrapper
mkdir ~/Env
echo "export WORKON_HOME=~/Env" >> ~/.bashrc
echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2" >> ~/.bashrc
echo "source /usr/bin/virtualenvwrapper.sh" >> ~/.bashrc
source ~/.bashrc
mkvirtualenv firstsite

Из-под виртуального окружения (в которое мы попадаем после mkvirtualenv) ставим необходимые модули и создаем Django-проект:

pip install django psycopg2 gunicorn
cd ~
django-admin startproject firstsite

Далее правим настройки проекта:

nano ~/firstsite/firstsite/settings.py
# ...
ALLOWED_HOSTS = ['доменные_имена', 'и/или_ip-адрес_проекта']
# ...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'имя_бд',
        'USER': 'имя_пользователя_бд',
        'PASSWORD': 'пароль_пользователя_бд',
        'HOST': 'localhost',
        'PORT': '',
    }
}
# ...
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
# ...

Выходим из виртуального окружения:

deactivate

Ставим БД PostgreSQL:

sudo pacman -S postgresql

Создаем БД для проекта:

sudo -u postgres psql
CREATE DATABASE имя_бд;
CREATE USER имя_пользователя_бд WITH PASSWORD "пароль_пользователя_бд";
ALTER ROLE имя_пользователя_бд SET client_encoding TO 'utf8';
ALTER ROLE имя_пользователя_бд SET default_transaction_isolation TO 'read committed';
ALTER ROLE имя_пользователя_бд SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE имя_бд TO имя_пользователя_бд;
\q

Возвращаемся в виртуальное окружение:

workon firstsite

Из-под него продолжаем развертывание проекта:

cd ~/firstsite
./manage.py migrate
./manage.py createsuperuser
./manage.py collectstatic

Проверяем, не допустили ли где ошибку или не пропустили ли чего:

./manage.py runserver 0.0.0.0:8000

Открываем в браузере ip-адрес_нашего_проекта:8000 (главное не забыть указать его в ALLOWED_HOSTS в settings.py):

Выходим из виртуального окружения:

deactivate

Ставим nginx:

sudo pacman -S nginx

Создаем каталог для конфигов виртуалхостов:

sudo mkdir /etc/nginx/conf.d/

И создаем там конфиг для нашего проекта:

nano /etc/nginx/conf.d/firstsite.conf
server {
    listen 80;
    server_name доменное_имя_проекта www.доменное_имя_проекта;
    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }
    location /static/ {
        root /home/<username>/firstsite;
    }
    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://unix:/home/<username>/firstsite/firstsite.sock;
    }
}

Указываем nginx'у читать все конфиги из новосозданного каталога:

sudo nano /etc/nginx/nginx.conf
...
    http {
        include /etc/nginx/conf.d/*.conf;
...

Создаем systemd-юнит для gunicorn:

sudo nano /etc/systemd/system/gunicorn-firstsite.service
[Unit]
Description=Gunicorn service for firstsite
After=network.target

[Service]
User=<username>
Group=http
WorkingDirectory=/home/<username>/firstsite
ExecStart=/home/<username>/Env/firstsite/bin/gunicorn --workers 3 --bind unix:/home/<username>/firstsite/firstsite.sock firstsite.wsgi:application

[Install]
WantedBy=multi-users.target

Активируем и запускаем gunicorn-юнит и nginx:

sudo systemctl enable gunicorn-firstsite
sudo systemctl start gunicorn-firstsite
sudo systemctl enable nginx
sudo systemctl start nginx

Проверяем в браузере:

Работает. Вот и славно!