2012-05-04 2 views
3

У меня возникли трудности с запуском Django на моем сервере Ubuntu. Я могу запустить Django, но я не знаю, как запустить его как службу.Как запустить Django в качестве службы?

Distributor ID: Ubuntu 
Description:  Ubuntu 10.10 
Release:   10.10 
Codename:   maverick 

Вот что я делаю:

  1. Я вхожу на моем сервере Ubuntu
  2. Start мой процесс Джанго: sudo ./manage.py runserver 0.0.0.0:80 &
  3. Тест: Трафик проходит и приложение отображает нужную страницу.
  4. Теперь я закрываю окно терминала, и все это останавливается. Я думаю, мне нужно как-то запустить его как услугу, но я не могу понять, как это сделать.

Как сохранить процесс Django на порту 80, даже если я не вошел в систему?

Кроме того, я понимаю, что я должен связывать его через Apache, но я пока не готов к этому.

+3

Это не проблема, но Джанго должен делать с тем, как Linux процессы запускаются. – Rodrigue

ответ

3

Для такого рода работы, поскольку вы находитесь на Ubuntu, вы должны использовать удивительный Ubuntu upstart.

Просто укажите файл, например. django-fcgi, в случае, если вы собираетесь deploy Django with FastCGI:

/etc/init/django-fcgi.conf 

и поставить необходимую выскочку инструкцию синтаксиса.

Тогда вы можете вы могли бы начать и остановить команду runserver просто с:

start runserver 

и

stop runserver 

Примеры управления развертыванием Джанго процессов с Upstart: here и here , Я нашел эти две ссылки полезными при настройке этой структуры развертывания самостоятельно.

+0

Когда я выскочил, я получаю это сообщение: ubuntu @ ip-10-202-94-157:/etc/init $ start django start: Отклонено сообщение отправки, 1 соответствие правилам; type = "method_call", sender = ": 1.22" (uid = 1000 pid = 6758 comm = "start" interface = "com.ubuntu.Upstart0_6.Job "member =" Start "error name =" (unset) "request_reply = 0 destination =" com.ubuntu.Upstart "(uid = 0 pid = 1 comm ="/sbin/init ")) Что это значит? – codingJoe

+0

@codingJoe Ehh не подсказка:/также читайте другие ответы. Я не думал, что вы пытаетесь запустить файл локально на порту 80! –

1

Проблема в том, что & запускает программу в фоновом режиме, но не отделяет ее от процесса нереста. Тем не менее, дополнительная проблема заключается в том, что вы используете сервер разработки, который предназначен только для тестирования и не должен использоваться для производственной среды.

Использование gunicorn или apache с mod_wsgi. Документация для django и этих проектов должна четко указывать, как правильно ее обслуживать.

Если вам нужен очень быстрый и грязный способ запустить ваш сервер django dev на порту 80 и оставить его там, что я не рекомендую, вы можете запустить его в screen. screen создаст терминал, который не будет закрыт, даже если вы закроете соединение. Вы даже можете запустить его на переднем плане экрана терминала и отключить, оставив его работать до перезагрузки.

13

Не используйтеmanage.py runserverдля запуска вашего сервера на порт 80. Даже для разработки. Если вам нужно это для вашей среды разработки, все же лучше перенаправить трафик с 8000 до 80 через iptables, чем запустить приложение django с правами root.

В документации django (или в других ответах на этот пост) вы можете узнать, как запустить его с помощью реального веб-сервера.

Если по какой-либо другого причины вам нужен процесс, чтобы продолжать работать в фоновом режиме после закрытия терминала, вы не можете просто запустить процесс с &, потому что он будет работать в фоновом режиме, но сохранить сеанс вашей группы id, и будет закрыт, когда лидер сеанса (ваш терминал) будет завершен.

Вы можете обойти это поведение, запустив процесс с помощью утилиты setsid. См. Свою manpage для setsid для получения более подробной информации.

+0

Или вы можете использовать ['screen'] (http://www.gnu.org/software/screen /) и отсоединить его. –

+1

Даже для разработки? Если вы не можете доверять своему собственному приложению на своей собственной машине, у вас гораздо больше проблем ... – Cerin

+0

@Cerin это просто плохая идея, и это проще чтобы избежать, чем думать обо всех деталях, особенно для разработчиков, где ожидается разрыв. Предположим, вы запустили сервер dev на своем компьютере с правами root на порт 80. Вы только что сохранили код, который еще не работает, так внезапно werkzeug отладчик выскакивает. Если по какой-либо причине ваш порт 80 доступен в Интернете, вы просто случайно открыли корневую оболочку в своей маме chine к миру. Это и тот факт, что я не доверяю особо моему собственному коду :-) –

8

Во всяком случае, если после прочтения других комментариев, вы все еще хотите использовать этот процесс с manage.py, просто добавьте «поЬир» перед командной строкой:

sudo nohup /home/ubuntu/django_projects/myproject/manage.py runserver 0.0.0.0:80 & 
0

Если вы используете virtualenv, команда Судо будет выполнять команду manage.py runserver вне контекста виртуального окружения, и вы получите всевозможные ошибки.

Чтобы исправить это, я сделал следующее:

при работе на виртуальном типа ENV:

which python 

выходов: /home/oleg/.virtualenvs/openmuni/bin/python

введите:

sudo !! 

выходы : /usr/bin/python

Тогда все, что осталось сделать, это создать символическую связь между глобальным питоном и питоном в virtualenv, что в настоящее время используется, и хотел бы работать на 0.0.0.0:80

первого переместить глобальную папку питона к резервному месту:

mv /usr/bin/python /usr/bin/python.old 

/USR/бен/питон

, что должно это сделать:

ln -s /usr/bin/python /home/oleg/.virtualenvs/openmuni/bin/python 

вот и все! теперь вы можете запустить sudo python manage.py runserver 0.0.0.0:80 в контексте virtaulenv!

Имейте в виду, что если вы используете базу данных postgres при локальной настройке разработки, вам, вероятно, потребуется роль root.

Кредит @ydaniv