Дано: Машинка с Arch linux, роутер с openWrt, ssh доступ, желание запилить проектик c nginx и uwsgi своими ручками.
ok, deploy
Итак у вчерашнего студента/манагера/просто веселого парня (нужное подчеркнуть) вдруг появился смысл жизни, а именно настройка бэкенда хоста "на антресоли". А именно хочется иметь связку:
browser <-> host (барахло на антрисоли) <-> web-server (nginx) <-> soket (uwsgi) <-> application (django)
Прежде прежде всего ставим настраиваем роутер. А именно, в разделе Network / DHCP and DNS поставим Static Leases на машину с линью. Потом в Hostname пропишем имя проекта proj_name и поставим на уже сохраненный ip.
Если уже есть зареганное имя на http://freedns.afraid.org/ например, mcgrog.now.im, которое ссылается на внешний ip данный провайдером, то нужно еще настроить роутер:
1) идем в Network -> Frewall -> Port Forwards
2) пробрасываем 80 порт из внешки на 80 порт сервака (определяем по айпи):
Вообще об этом писали много всего разного.
Логинимся, в на машину, просимся под рут и выполняем
Условимся что мы храним проект в /srv/http/proj_name/ внутри создаем папку /srv/http/proj_name/conf и кладем туда конфиги nginx и usgi
Для веб-сервера создаем файл proj_name.conf
ok, deploy
Итак у вчерашнего студента/манагера/просто веселого парня (нужное подчеркнуть) вдруг появился смысл жизни, а именно настройка бэкенда хоста "на антресоли". А именно хочется иметь связку:
browser <-> host (барахло на антрисоли) <-> web-server (nginx) <-> soket (uwsgi) <-> application (django)
Прежде прежде всего ставим настраиваем роутер. А именно, в разделе Network / DHCP and DNS поставим Static Leases на машину с линью. Потом в Hostname пропишем имя проекта proj_name и поставим на уже сохраненный ip.
Если уже есть зареганное имя на http://freedns.afraid.org/ например, mcgrog.now.im, которое ссылается на внешний ip данный провайдером, то нужно еще настроить роутер:
1) идем в Network -> Frewall -> Port Forwards
2) пробрасываем 80 порт из внешки на 80 порт сервака (определяем по айпи):
Вообще об этом писали много всего разного.
Логинимся, в на машину, просимся под рут и выполняем
pacman -S nginx uwsgi python-mysqldb python2 git-core virtualenvчто означает, что мы поставили 5 системных пакетов.
Условимся что мы храним проект в /srv/http/proj_name/ внутри создаем папку /srv/http/proj_name/conf и кладем туда конфиги nginx и usgi
Для веб-сервера создаем файл proj_name.conf
server { listen 80; server_name proj_name; access_log /srv/http/proj_name/logs/nginx-access.log; error_log /srv/http/proj_name/logs/nginx-errors.log; location /favicon.ico {#эта секция временно empty_gif;# что бы не было паники в логах }#о несущестующем фавиконе location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9002; } }делаем симлинк из папки конфигов до папки nginx
ln -s /srv/http/proj_name/conf/proj_name.conf /etc/nginx/sites-available/Теперь надо положиь симлинк на конфиг в /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/proj_name.conf /etc/nginx/sites-available/proj_name.conf
В директории проекта создаем папку под логи, что бы джинкс мог туда класть логи, закрепляем успех и релоадим нджнкс
Переходим туда и далее выполняем:
Видим, как все поставилось. Отмечу, что я не указывал путь до интерпритатора, так как по умолчанию пакман выкачал последнюю версию второго питона и virualtnv ее и подсосал.
Если хотим использовать блага цивилизации, то через пакмам ставим пакет python-virtualenvwrapper (есть зависимость от третьего питона) и делаем следующие телодвижения:
0) если не установлен, то ставим пакет python3
1) Делаем симлинк с python на python2 (ну вот не хочется мне пока 3ю верию использовать)
4) создаем oкружение командой
Теперь следует сделать следующие телодвижения в консоли. Проверим что джанга встала и работает:
sudo uwsgi -- ini proj_name.ini
правда, есть небольшая беда: если править исходники на сервере, то висги не узнает что ему надо перезапустиься, потому что он не умеет следить за содержимым папки. Можно конечно трогать спец файл, который релоадит висги:
Да, и если нормально сконфигурили роутер, то при выключенном runsrver, если в браузере пойти по http://proj_name/ то, можно посмотреть результат работы django приложения - радостно скажет, что все работает и надо прогать.
sudo systemctl reload nginxПришел черед настроить uwsgi: идем в /etc/uwsgi/ тут надо создать конфиг для имератора emperor.ini , что бы он присматривал за вассалами:
[uwsgi] emperor = /etc/uwsgi/apps master = 1смотрим что лежит в /etc/uwsgi/apps - а ничего. Тогда в директории проекта/conf/ создаем файл proj_name.ini (строго так же не обязательно называть, интерфейс будет понимать что к нему обратились по имени сокета 9002)
[uwsgi] socket = /srv/http/%n/pid/uwsgi.socket chdir = /srv/http/%n/src pythonpath = .. module = %n.wsgi:application virtualenv = /srv/http/%n/env env = DJANGO_SETTINGS_MODULE=%n.settings logto = /srv/http/%n/logs/uwsgi.log enable-threads uid = http gid = http touch-reload = /srv/http/%n/touchmeА теперь делаем симлинк на папку вассалов
ln -s /srv/http/proj_name/conf/proj_name.ini /etc/uwsgi/apps/как мы договорились, размещаем сорцы в директории
/srv/http/proj_name
Переходим туда и далее выполняем:
virtualenv2 --prompt="<proj_name>" ./envДанная модель удобна тем, что в одой директории будет весь проект со всем окружением и его удобно бэкапить. Но если на хостинге несколько проектов и гениальная мысль посещает неожиданно, то лучше вынести папку окружений на директорию вверх, то есть хранить их в /srv/http/.envs, и использовать virtualenvwrapper.
Видим, как все поставилось. Отмечу, что я не указывал путь до интерпритатора, так как по умолчанию пакман выкачал последнюю версию второго питона и virualtnv ее и подсосал.
Если хотим использовать блага цивилизации, то через пакмам ставим пакет python-virtualenvwrapper (есть зависимость от третьего питона) и делаем следующие телодвижения:
0) если не установлен, то ставим пакет python3
1) Делаем симлинк с python на python2 (ну вот не хочется мне пока 3ю верию использовать)
ln -s /usr/bin/python2 /usr/local/bin/python2) модифицируем свой пользовательский .bashrc (заодно можно его дополнить другими записями) - в конец добавляем
export WORKON_HOME=/srv/http/.venvs export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 export VIRTUALENVWRAPPER_VIRTUALENV=/usr/bin/virtualenv2 source /usr/bin/virtualenvwrapper.sh3) перелогиниваемся в терминал
4) создаем oкружение командой
mkvirtualenv proj_name deactvateВидим, что изменения на лицо. Заводим sql клиент и создаем базу
mysql -uroot -p CREATE DATABASE proj_name CHARACTER SET utf8 COLLATE utf8_general_ci; create user 'proj_db_user'@'localhost' IDENTIFIED BY 'userpass'; GRANT ALL PRIVILEGES ON proj_name.* TO 'proj_db_user'@'localhost';Теперь активируем песочницу и ставим в нее все необходимое
source env/bin/activate export PIP_REQUIRE_VIRTUALENV=true pip install djangoЕсли воспользовались советом и сделали одну папку и поставили virtualenvwrapper, то все выглядит красивее и работает с автокомплитом по табу
workon proj_name pip install djangoТеперь можно перейти в проект /srv/http/proj_name, там запустим
dgjango-admin.py startproject proj_nameДля удобства восприятия, и что бы не было куча вложенный папаок с одинаковым именем, переименуем /srv/http/proj_name/proj_name в /srv/http/proj_name/src. В конфиги висги лезть не надо, там это уже учтено.
Теперь следует сделать следующие телодвижения в консоли. Проверим что джанга встала и работает:
python proj_name/manage.py runserverтеперь осталось пнуть висги, что бы он подсосал инишник и мог проксировать запрос от джинкса до application в django
sudo uwsgi -- ini proj_name.ini
правда, есть небольшая беда: если править исходники на сервере, то висги не узнает что ему надо перезапустиься, потому что он не умеет следить за содержимым папки. Можно конечно трогать спец файл, который релоадит висги:
sudo touch /srv/http/proj_name/touchmeО кастылях плюшках и прочем - в следующей части. Главное, что сейчас есть на руках - джанго запускается в режиме дебага и говорить, что все заработало.
Да, и если нормально сконфигурили роутер, то при выключенном runsrver, если в браузере пойти по http://proj_name/ то, можно посмотреть результат работы django приложения - радостно скажет, что все работает и надо прогать.