Здравствуй, дорогой друг!
Затрону тему, которая не раз обсуждалась на форуме. Здесь же можете найти ссылки на многие туториалы по тому, как развернуть свой сайт на сервере.
Также есть уже готовый рецепт.
Я захотел написать вариант немножко в другой связке: Python3 (уж простите, но вот так мне приятнее), в качестве веб-сервера Nginx, в качестве http-сервера Gunicorn, размещаемся на digitalocean.com.
Внимание! Статейка моя адресована больше тем, кто делает первые шаги в разворачивании боевого сервера, она достаточно подробная и может вызвать приступы скуки и, возможно, тошноты у "бывалых".
Почему решил написать свой вариант, несмотря на то, что есть уже рецепты и на самом digitalocean.com? 4 пункта:
просто по их рецепту у меня ничего не вышло, в итоге я слепил картину из трех источников; потому что кому-то, только начавшему, мой вариант может и помочь. Чтоб не натыкались на те же грабли. Я просидел за решением проблем 3 вечера, а знал бы как правильно, сделал бы быстрее; вдруг кто-нибудь увидит в моих шагах сложность и предложит более правильное решение (я буду только рад, т.к. сам еще далеко не гуру); ну и также я оставлю это здесь, чтоб самому в перспективе обращаться. Итак! Пользоваться будем сервисом digitalocean.com (далее DO). Если еще кто-то не знаком, попробуйте. Это провайдер облачного хостинга. Для пробы используйте промо-код "radio-t" и вам на аккаунт упадет 10$ (сейчас июль 2014. Если читаете позже, код может не действовать). На минималке с одним инстансом 10$ хватит на 2 месяца.
Предположу, что вы уже зарегистрировались и денежки у вас на аккаунте уже есть.
1) Первое, что сразу посоветую сделать - создайте пару SSH и закиньте публичный на DO, для этого у них есть вкладка "SSH Keys". Далее это вам сильно облегчит жизнь.
2) Создадим инстанс (у них это называется "droplet"). Очень просто все: Нажимаете "Create" -> В поле ввода вносите имя дроплета (in english, please) -> выбираете размер -> выбираете регион (Для сайтов, которые ориентированы на Евразию, лучше выбрать Амстердам или Лондон) -> Затем выбираете дистрибутив (я ставил Ubuntu 12.04) -> жмакаете на свой ssh key (если создавали, под выбором дистрибутива должен появится пункт по этому поводу) -> и жмакаете "Create droplet". Ждете минтку.
3) Далее, если создавали ssh, заходите в терминал и коннектитесь с вашим дроплетом. Предположим, что ваш IP 111.222.333.44
(можете его найти под именем дроплета).
ssh root@111.222.333.44
Если все сделали правильно, то должно все сработать. При первом заходе, спросит вашего подтверждения, что вы хотите законнектится по этому ключу, это стандартное поведение при работе через ssh. Подтверждайте.
Если вы не захотели заморачиваться с ключами, то можете зайти в дроплет на сайте DO и кликнуть на большую синюю кнопку "Console Access". Т.е. вы будете все то же самое делать через браузер, но для входа нужен будет пароль, который DO вышлют вам на почту.
Ну, это была только прелюдия
Вот вы в консоли. Давайте установим все необходимые программы.
4) Для начала нужно сделать апгрейд
sudo apt-get update
sudo apt-get upgrade
5) Если вы следуете за мной по пятам и поставили Ubuntu 12.04, то вам следует поставить python3 (напомню, что описание для определенной связки. Если работаете на 2.х-версии, то вы молодец, вам это не нужно делать).
sudo apt-get install python3
6) Поставим nginx
sudo apt-get install nginx
7) Ставим третий pip.
sudo apt-get install python3-setuptools
sudo easy_install3 pip
8) Virtualenv
установим само виртуальное окружение
pip3 install virtualenv #если pip не хочет, можете поставить командой easy_install3 virtualenv
virtualenv /opt/myenv # myenv можете заменить на любое другое имя
source /opt/myenv/bin/activate # активируем виртуальное окружение. После этого в начале строки консоли должен появиться маркер (myenv)
Далее внутри виртуального окружения ставим необходимый пакет программ
9) Ставим django и gunicorn.
pip install django gunicorn
На этом все установки закончились. Теперь перейдем к тестам и запуску.
10) Создадим проект
Все стандартно: перейдем в окружение, если еще не там
cd /opt/myenv
source bin/activate
и
django-admin.py startproject myproject
перейдем в папку проекта
cd myproject
11) Тест gunicorn
теперь именно из папки проекта (там, где лежит manage.py) запускаем gunicorn
gunicorn myproject.wsgi:application --bind 111.222.333.44:8000 #пишете ваш ip
Теперь в строке вашего браузера наберите 111.222.333.44:8000
#пишете ваш ip
Должна появиться стартовая страница django "It worked!"
Если работает, я радуюсь вместе с вами.
"Матрица пытается разговаривать с тобой, Нео!" (с)
12) Статика
К сожалению, статика к нашему проекту еще не подключена. И вы можете в этом убедиться, сделав python manage.py syncdb
, затем перезапустить gunicorn и зайти в админку (ваш_ip:8000/admin). Будет все без стилей.
Разместим статику в папке проекта.
Открываем settings.py либо в вашем любимом редакторе, либо через nano.
nano settings.py
и прописываем static_root
STATIC_ROOT = '/opt/myenv/myproject/static/'
сохраняем и выходим
из папки проекта запускаем
python manage.py collectstatic
в папке проекта появится папка с именем static
13) Настроим nginx
перейдем по следующему пути
cd /etc/nginx/sites-available/
открываем файлик default
nano default
Удаляем оттуда все и пишем
server {
listen 80;
server_name 111.222.333.44; #либо ip, либо доменное имя
access_log /var/log/nginx/example.log;
location /static/ {
root /opt/myenv/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;
}
}
Сохраняем, выходим.
14) "Поехали!" (с)
возвращаемся в папку проекта
cd /opt/myenv/myproject
Перезапустим nginx
sudo service nginx restart
Запустим gunicorn
gunicorn myproject.wsgi:application
В браузере набираем 111.222.333.44
It worked!
15) Supervisor.
Чтобы наше приложение стратовало после любого непредвиденного ребута или сбоя, нам нужно обзавестись supervisor-ом.
Установим supervisor
apt-get install supervisor
Создадим конфиг файл для gunicorn
cd /opt/myenv/myproject/myproject #лучше делать именно в каталоге с settings.py
touch gunicorn.conf.py
Открываем на редактирование
nano gunicorn.conf.py
Вносим
bind = '127.0.0.1:8000'
workers = 3
user = "nobody"
создадим конфиг файл для супервизора
cd /etc/supervisor/conf.d/
touch myproject.conf
Откроем
nano myproject.conf
Внутрь внесем
[program:myproject]
command=/opt/myenv/bin/gunicorn myproject.wsgi:application -c /opt/myenv/myproject/myproject/gunicorn.conf.py
directory=/opt/myenv/myproject
user=nobody
autorestart=true
redirect_stderr=true
Команды для supervisor
supervisorctl reread
supervisorctl update
supervisorctl status myproject
supervisor restart myproject
После старта роверяем свой сайт в браузере. Должен работать.
Останавливаем машину
shutdown -r now
Или можно просто вырубить инстанс
Заводим и проверяем. Все должно работать.
=======================================================
=======================================================
Обязательные правки для боевого.
1) в settings.py
DEBUG = False #так должно быть
2) Но при debug = False
обязательно нужно указать ALLOWED_HOSTS
. Это, по идее, должен быть ваш домен
3) если вы просто скопировали проект из другого места, то лучше заменить SECRET_KEY
=======================================================
Какие еще могут появиться проблемы?
Невероятные кейсы
Кейс 1
Если вы запустили gunicorn, а после этого вышли из терминала, вспомнили, что хотели еще небольшие правки внести. Зашли снова в терминал. Внесли правки. Перезапустили nginx. Запускаете gunicorn, а он выдет вам следующее:
Retrying in 1 second… # несколько раз
Can't connect to ваш_IP
Есть вероятность, что просто ваш процесс gunicorn уже запущен.
Проверяем.
ps xa | grep gunicorn
если появилась портянка с гоникорнами, то так и есть
убиваем процесс
killall gunicorn
затем запускаем.
Кейс 2
Если вы создали дроплет и зашли по ключу, а потом этот дроплет кикнули, а потом снова создали ))))), есть вероятность, что вам дадут тот же IP. В этом случае при коннекте по ssh может ругнуться на ошибку. Не беспокойтесь! Откройте known_hosts
(данный файл содержит список адресов и соответствующих им публичных ключей. лежит в .ssh на вашем компьютере) и почистите его. (Не самый лучший способ, если у вас несколько уже "настроенных" пар ключей).
UPD: Похожий гайд на английском.