【问题标题】:How do I run Django as a service?如何将 Django 作为服务运行?
【发布时间】:2012-05-14 06:55:02
【问题描述】:

我在我的 Ubuntu 服务器上运行 Django 时遇到了困难。我能够运行 Django,但我不知道如何将它作为服务运行。

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

这是我正在做的事情:

  1. 我登录到我的 Ubuntu 服务器
  2. 启动我的 Django 进程:sudo ./manage.py runserver 0.0.0.0:80 &
  3. 测试:流量通过,应用显示正确的页面。
  4. 现在我关闭终端窗口,一切都停止了。我想我需要以某种方式将其作为服务运行,但我不知道该怎么做。

即使我没有登录,如何让我的 Django 进程在端口 80 上运行?

另外,我知道我应该通过 Apache 链接它,但我还没有准备好。

【问题讨论】:

  • 这不是 django 问题,而是与 linux 进程的运行方式有关。

标签: python django ubuntu


【解决方案1】:

如果你使用 virtualenv,sudo 命令会在虚拟环境上下文之外执行manage.py runserver 命令,你会得到各种错误。

为了解决这个问题,我做了以下操作:

在处理虚拟环境类型时:

which python

输出:/home/oleg/.virtualenvs/openmuni/bin/python

然后输入:

sudo !!

输出:/usr/bin/python

那么剩下要做的就是在全局 python 和你当前使用的 virtualenv 上的 python 之间创建一个符号链接,并希望在 0.0.0.0:80 上运行

首先将全局 python 文件夹移动到备份位置:

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

/usr/bin/python

应该这样做:

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

就是这样!现在您可以在 virtaulenv 上下文中运行 sudo python manage.py runserver 0.0.0.0:80

请记住,如果您在本地开发设置中使用 postgres DB,您可能需要 root 角色。

感谢@ydaniv

【讨论】:

    【解决方案2】:

    无论如何,如果在阅读了其他 cmets 之后,您仍然想使用 manage.py 的进程,只需在命令行前添加“nohup”即可:

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

    【讨论】:

      【解决方案3】:

      对于这种工作,既然你在 Ubuntu 上,你应该使用很棒的Ubuntu upstart

      只需指定一个文件,例如django-fcgi,如果你要去deploy Django with FastCGI

      /etc/init/django-fcgi.conf
      

      并放入所需的新贵语法说明。

      那么您可以简单地使用以下命令启动和停止您的runserver 命令:

      start runserver
      

      stop runserver
      

      使用 Upstart 管理 Django 进程部署的示例:herehere。在自己设置此部署结构时,我发现这两个链接很有帮助。

      【讨论】:

      • 当我刚开始收到这条消息时: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)" requested_reply= 0 destination="com.ubuntu.Upstart" (uid=0 pid=1 comm="/sbin/init")) 这是什么意思?
      • @codingJoe Ehh 不是一个线索:/ 还阅读了其他答案。我没想到你会尝试在 80 端口上本地运行东西!
      • 更新:现在我使用 supervisor 来管理运行 Django 的 uWSGI 或 gunicorn 进程:supervisord.org/index.html
      【解决方案4】:

      不要使用 manage.py runserver 在端口 80 上运行您的服务器。甚至用于开发。如果您的开发环境需要它,最好还是使用通过 iptables 将流量从 8000 重定向到 80,而不是以 root 身份运行 django 应用程序。

      在 django 文档(或本文的其他答案)中,您可以了解如何使用真实的网络服务器运行它。

      如果出于任何其他原因您需要在关闭终端后继续在后台运行进程,您不能只使用& 运行该进程,因为它将在后台运行但保留您会话的会话 id,并在会话负责人(您的终端)终止时关闭。

      您可以通过setsid 实用程序运行该进程来规避此行为。有关详细信息,请参阅 setsid手册页

      【讨论】:

      • 即使是为了开发?如果您不能信任自己机器上的应用程序,那么您将面临更大的问题......
      • @Cerin 这通常是个坏主意,避免比考虑所有细节更容易,特别是对于预计会出现问题的开发人员。假设你在你的机器上以 root 身份在端口 80 上运行开发服务器。你刚刚保存了一些还不能工作的代码,所以突然 werkzeug 调试器弹出。如果由于某种原因你的 80 端口可以访问互联网,你只是不小心在你的机器上向世界打开了一个 root shell。那,以及我特别不信任我自己的代码这一事实:-)
      • 我不同意。是的,如果可行,应该避免这种情况,但有时这可能会派上用场。我偶然发现了这篇文章,因为我需要这样做,因为我需要测试一些在我的生产域和端口上触发的外部 Javascript 小部件,因此不能在 localhost:8000 上进行测试。并且仅仅因为您使用端口 80 并不意味着它必须可以从外部访问。提供诸如“永远不要做 X”这样忽略用户问题细节的笼统建议很少有帮助。
      • 如果它在虚拟机或容器中呢?
      • 问题不在于 在端口 80 中运行,而在于 以 root 身份运行代码。但是,您不需要一个来拥有另一个。您可以将端口 80 重定向到其他一些 (>1024) 端口,或者只给进程 CAP_NET_BIND_SERVICE 而不是整个 root 权限。请参阅stackoverflow.com/a/414258/19401 了解如何执行此操作。
      【解决方案5】:

      问题在于& 在后台运行程序,但没有将其与生成过程分开。但是,另一个问题是您正在运行开发服务器,该服务器仅用于测试目的,不应用于生产环境。

      使用 gunicorn 或 apache 与 mod_wsgi。 django 和这些项目的文档应该明确说明如何正确提供它。

      如果您只是想要一种真正快速而简单的方式来在端口 80 上运行 django 开发服务器并将其留在那里——这不是我推荐的——你可以在 screen 中运行它。 screen 将创建一个即使您关闭连接也不会关闭的终端。您甚至可以在屏幕终端的前台运行它并断开连接,让它一直运行直到重新启动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-13
        • 2011-01-27
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-15
        相关资源
        最近更新 更多