2017-06-27 320 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模塊作爲服務器在後臺運行。讓我添加該方法以及答案 –