2017-06-27 323 views
0

我用django制作了一个网站。我想将这个应用程序部署到生产环境中。Django部署网站

现在我感到困惑的几件事情:在开发的时候,我可以用命令来运行我的应用程序:python manage.py runserver IP_OF_SERVER:PORT。 现在通过这种方法,我可以做所有事情。我的工具(网站)只能在本地使用。 我只用这个命令部署我的网站可以吗?是否有必要做Django的生产过程,如果有必要怎么做?我是django的新手。请帮我理解。

+2

如果你只是需要本地项目,使用这种方法是好的。 – David

+0

根据不同的设置,我们在Apache上提供Django应用程序,在Ubuntu上提供mod_wsgi –

+0

Glenn Sampson:为什么需要apache和mod_wsgi?这是对本地部署的褒奖吗?请给出您的想法... –

回答

4

通常,这些类型的东西都以three tier的方式进行部署。

这里,一般的方法是,像这样

[Database] <-(db calls)-> [Django app] <- wsgi -> [gunicorn] <- http -> [nginx] <- http -> public 

您的应用程序是“Django应用程序”块在这里。你可以用类似manage.py runserver的东西运行它,但这是一个非常轻量级的玩具服务器,它不能真正处理高水平的流量。如果您的请求需要1ms来处理,并且有100个用户尝试发出相同请求,则最后一个客户端必须等待100ms才能获得响应。通过运行更多的应用程序实例很容易解决这个问题,但开发服务器无法做到这一点。

所谓的“应用程序服务器”像gunicorn将允许你运行你的应用程序,它可以生成多个过工人和处理某些类型的恶作剧流量模式的一个更强大的Web服务器。

现在,即使gunicorn可以通过高性能的服务器尤其适用于静态资产如图像,CSS,JS等,这有点像nginx的击败。所以,我们建立了一个让nginx面向世界并直接提供所有静态资产的事情。并且实际应用程序的请求将代理到gunicorn,并且将由您的实际应用程序提供。

这并不复杂,因为它听起来,你应该能够得到的东西了一天左右的时间内运行。我所提到的所有技术都有不同的特点。 This是一个很好的教程,介绍如何在部署期间完成任务以及注意什么。

+0

感谢您的答案。因此,manage.py runserver无法同时处理多个客户端? –

+0

不是。你可以尝试一下。在视图中粘贴“睡眠(10)”或类似内容,然后尝试一次点击两个URL。 –

+0

感谢您清理我的干旱。根据我的理解,我们需要进行生产配置(wsgi等),以便一次处理多个客户端请求。 –

1

如果你想设置你的Django生产服务器通过IIS在Windows服务器(如用户少,你甚至可以用普通的Windows 7或10个专业机也一样)。该视频可以帮助你一步一步

https://www.youtube.com/watch?v=kXbfHtAvubc

我带来了几个生产网站这样。

虽然你试图同时做一个工作,但你的方法唯一的问题是,你应该要小心,控制台永远不会被任何人或您关闭意外。但是有更多的隐藏问题,通常用于生产,这是不推荐的。

为了避免意外关闭,您可以在Windows下面做(运行它作为服务):

对于这种方法,你需要pywin32需要安装,从这里安装:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20217/

import win32service 
import win32serviceutil 
import win32event 
import subprocess 
import os 

class PySvc(win32serviceutil.ServiceFramework): 

    # you can NET START/STOP the service by the following name 
    _svc_name_ = "Name your Service here" 
    # this text shows up as the service name in the Service 
    # Control Manager (SCM) 
    _svc_display_name_ = "External Display Name of your service" 
    # this text shows up as the description in the SCM 
    _svc_description_ = "Description what this service does" 

    def __init__(self, args): 
     import platform 
     win32serviceutil.ServiceFramework.__init__(self, args) 
     # create an event to listen for stop requests on 
     self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) 

    # core logic of the service 
    def SvcDoRun(self): 
     os.chdir('your site root directory') 
     subprocess.Popen('python manage.py runserver IP:PORT') 
     # if you need stdout and stderr, open file handlers and keep redirecting to those files with subprocess `stdout` and `stderr` 

    # called when we're being shut down 
    def SvcStop(self): 
     # tell the SCM we're shutting down 
     self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) 

     # fire the stop event 
     win32event.SetEvent(self.hWaitStop) 


if __name__ == '__main__': 
    win32serviceutil.HandleCommandLine(PySvc) 
+0

感谢您的回答。我们可以将python manage.py runserver IP_OF_SERVER:PORT在某些启动脚本中,所以如果服务器启动,那么这个命令将在后台自动执行,并且没有人可以关闭该控制台。这很好吗? –

+0

是的,你可以将PySVC模块作为服务器在后台运行。让我添加该方法以及答案 –