如何部署Django應用程序:

向大家問好,這是我在 <» 的第一篇文章 DesdeLinux (我的草稿中有幾個xD),我希望它對你有用😀

好吧,在我目前的新工作中,目前正在執行將多個系統遷移到Django的工作(多麼奇怪eh ?? xD),除了開發,我的任務之一就是將這些系統投入生產,然後作為一名好徒弟,因為這是我第一次將應用程序投入生產在真實服務器上:$我開始閱讀堆棧中每個必需軟件包(Gunicorn和Supervisord的大多數)的正式文檔,並看到教程在西班牙語中,它們在某些方面對我不太清楚,我決定根據Django,Gunicorn,Supervisord,Nginx和Postgresql堆棧創建一個迷你指南,其中包含按照我將應用程序投入生產的步驟。

在我工作的情況下,服務器仍在運行Debian Squeeze,但是該指南對於其他發行版應該是完全有效的...因此,讓我們直接開始吧:

我將以超級用戶身份工作。 首先,需要以下軟件包:

PIP ->安裝和管理Python軟件包的工具
aptitude install python-pip

Nginx的 -> Web服務器(我們將其用作反向代理,並緩存靜態文件“ img,js,css”),我們使用以下命令進行安裝:
aptitude install nginx

Supervisord ->用於管理和監視我們的應用程序的應用程序,儘管它用於更多用途。 我們通過以下方式安裝它:
aptitude install supervisor

虛擬環境 ->它可以幫助我們為應用程序創建自定義的虛擬執行環境。 我們通過以下方式安裝它:
aptitude install python-virtualenv

獨角獸 ->適用於python的網絡服務器(我們尚未安裝)

我認為他們應該已經安裝和配置了postgresql

心理諮詢師2 ->用於python的Postgresql連接器(我們也不會安裝它)

使用virtualenv創建虛擬環境:

首先,我們將移至將用於生產的工作目錄:
cd /var/www/

然後,在此目錄中,我們將創建虛擬環境:
virtualenv ENV-nombreApp

我們移到我剛剛創建的virtualenv目錄
cd ENV-nombreAPP

我們將應用程序複製到此目錄中,現在我們使用以下方法激活環境:
source bin/activate

提示現在看起來應該像 (ENV)usuario@host:

現在這將使我們所做的一切都存儲在目錄中 / var / www / ENV-appname / 不影響系統軟件包

現在我們轉到應用程序目錄:
cd nombreApp

我們繼續安裝應用程序依賴項列表(如果需要),在文件中指定依賴項列表 requirements.txt:
pip install -r requirements.txt

我們還可以單獨安裝軟件包,例如,安裝 PostgreSQL的:
pip install psycopg2

GUnicorn安裝和配置:

要安裝它,我們以相同的方式進行:
pip install gunicorn

現在我們將對其進行配置,為此,我們將創建一個名為 Gunicorn-deploy.py 在我們應用程序的根目錄中(儘管名稱可以是任何東西),其內容如下:

bind = "127.0.0.1:8001" # dirección a donde accederá Nginx
logfile = "/var/www/logs/nombreApp/gunicorn.log" # dirección donde estarán los logs de la aplicación
workers = 1 # dependerá en medida de la carga de trabajo que tenga la aplicación, también depende del hardware con que se cuente
loglevel = 'info' # tipo de logging

Supervisord配置:

現在讓我們設置 supervisord,為此,我們使用

echo_supervisord_conf > /etc/supervisord.conf

現在,我們編輯配置文件:
vim /etc/supervisord.conf

我們通過刪除來取消註釋以下幾行: (分號):

[unix_http_server]文件= /tmp/supervisor.sock [supervisord]日誌文件= / var / log / supervisord.log logfile_maxbytes = 50MB logfile_backups = 10 loglevel =調試pidfile = / var / run / supervisord.pid nodaemon = false minfds = 1024 minprocs = 200 [rpcinterface:主管] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl = unix:[program:appname]命令= / var / www / ENV-appname / bin / django_unicorn -c / var / www / ENV -appname / appname / gunicorn-deploy.py目錄= / var / www / ENV-appname / appname / autostart = true autorestart = true用戶=用戶名redirect_stderr = true stdout_logfile = / var / www /日誌/ appname / supervisord.log

現在,我們將為supervisor創建腳本以從系統開始,為此我們將創建文件:
vim /etc/init.d/supervisord

我們添加以下內容:

 #Supervisord自動啟動##描述:自動啟動超級用戶#進程名:超級用戶#pidfile:/var/run/supervisord.pid SUPERVISORD = / usr / local / bin /超級用戶SUPERVISORCTL = / usr / local / bin /超級用戶案例$ 1在開始)echo -n“正在啟動監督:” $ SUPERVISORD echo ;; 停止)echo -n“停止監視:” $ SUPERVISORCTL shutdown echo ;; 重新啟動)echo -n“正在停止監視:” $ SUPERVISORCTL關閉echo echo -n“正在開始監視:” $ SUPERVISORD echo ;; 那C

現在,我們授予文件執行權限,使其可以從系統啟動:
sudo chmod +x /etc/init.d/supervisord

我們更新鏈接以啟動服務:
sudo update-rc.d supervisord defaults

我們啟動服務:
sudo /etc/init.d/supervisord start

設置nginx:

這一步也很簡單,我們將創建以下配置文件 nginx的 對於我們的應用程序:

vim /etc/nginx/sites-enabled/nombreApp

我們將為您添加以下內容

服務器{聽9001; #他們希望nginx server_name監聽www.domain.com的端口; #或192.168.0.100,我們將訪問的地址access_log /var/log/nginx/Appname.access.log; #我們將在其中找到應用程序日誌的位置/ {#訪問www.dominio.com/ proxy_pass http://127.0.0.1:8001時,nginx將在其中調用; proxy_set_header主機$ http_host; } location / static / {#當我們輸入www.domain.com/static/ alias / var / www / ENV-appname / appname / staticfiles /時,nginx將在其中訪問; }}

然後我們重新啟動nginx:
service nginx restart

設置Django:

讓我們修改django配置文件:
vim nombreApp/settings.py

我們尋找的行說 調試=正確 我們改變價值,剩餘 調試=假

我們添加數據庫參數:

DATABASES = {'default':{'ENGINE':'django.db.backends.postgresql_psycopg2',#或mysql,或任何他們使用的'NAME':'DBName','USER':'DBUser','PASSWORD' :'password DB','HOST':'localhost',#或他們需要的一個'PORT':'',#或他們正在使用的一個}}

我們尋找線 ALLOWED_HOSTS = [] 然後添加要訪問的域或地址,留下類似 ALLOWED_HOSTS = ['www.domain.com']

我們為靜態文件配置目錄,我們尋找顯示以下內容的行 STATIC_ROOT = ' ' 然後我們更改該值,將絕對路徑放置在我們希望我們的靜態文件所在的位置,在我的情況下,我或多或少地將其保留為 STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

差不多完成了,我們執行以下命令:
./manage.py collectstatic

這將創建一個名為“靜力學 在我們在 settings.py ,這就是我們所有的靜態文件所在的位置。

最後,我們重新啟動主管以進行新的更改:
supervisorctl restart nombreApp

僅此而已,最後不是那麼真實嗎? 對我來說似乎很簡單😀

希望對您有用,問候😉

GUnicorn文檔

主管文檔


9條評論,留下您的評論

發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   F3NIX 他說:

    我知道Django應用不應放置在Web服務器文件夾(/ var / www)的根目錄下嗎? 為了安全起見,我不知道我是否錯了。

    問候。

    1.    尿激酶 他說:

      行 !!! 這是我完全不知道的事情,我將更新條目😛,並在星期一返回後立即在xD應用程序中進行更改
      謝謝

  2.   羅德里戈·布拉沃(侍應生) 他說:

    Epale兄弟不錯的教程。 最近我也同在一個地方,但是在Debian 7中,我不得不或多或少地閱讀和閱讀。 我建議您在用戶主目錄的隱藏文件夾中創建virtualenv的虛擬環境。

    的問候!

  3.   服務芬里茲 他說:

    哈哈哈ctm我昨天在記錄Django,您已經通過了銀河系999999問候人xD

  4.   丹尼爾2ac 他說:

    很好的文章=)就在一周前,我部署了django應用程序,但是我使用uwsgi和nginx進行了此操作,您知道gunicorn有什麼優勢嗎? 我看過它提到很多。
    很高興看到django變得非常流行,事實是我見過的最好的框架=)

  5.   是厄茲坎 他說:

    對於STATIC_ROOT,我要做的是定義一個全局變量。 像這樣:

    import os
    PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
    STATIC_ROOT = os.path.join(PROJECT_PATH, '../backend/static')

    後端是我創建的應用。 這樣,我可以確保將項目部署到哪裡,全局路徑是相同的。

  6.   斯瑪特 他說:

    有趣的是,我將來會嘗試。

    順便說一句,有人知道如何在Django應用程序中啟用重音符號和非ASCII字符嗎?

    我到處都看過,以下方法都不適合我:
    sites.py中的sys.setdefaultencoding('utf-8')#

    #-*-編碼:utf-8-*-#每個python文件中

    編輯site.py,然後放置utf-8而不是ascii應該可以,但是$ file models.py告訴我我的文件仍然是ascii。

    有什麼建議?

    1.    斯瑪特 他說:

      有效!!!!

  7.   動漫230 他說:

    很好的教程,但是您可以執行以下操作之一,將我的應用程序上傳到已經投入生產的Web服務器上
    謝謝