Django + Nginx + Gunicorn 部署

一、前期準(zhǔn)備工作

1、版本

  • Ubuntu 18
  • python 3.6.5
  • Django 1.11.12
  • Nginx 1.14.0
  • Gunicorn 19.9.0
  • gevent 1.4.0

2、安裝(服務(wù)器)

  1. nginx
    sudo apt install nginx
    
  2. 安裝python3(已經(jīng)安裝請忽略)
    # ubuntu 18 自帶的就是3.6.5 其它Ubuntu版本的請使用命令安裝
    sudo apt update
    sudo apt install python3.6
    
  3. 安裝pip(已經(jīng)安裝請忽略)
    sudo apt-get install python3-pip
    
  4. 安裝虛擬環(huán)境
    sudo pip install virtualenv
    

二、Django項(xiàng)目

1、修改相關(guān)配置

  1. 關(guān)閉debug,修改hosts


    image
  2. 修改數(shù)據(jù)連接, 例如下圖所示


    image
  3. 將靜態(tài)文件打包
    image

    使用命令 collectstatic
    image

    收集完成之后如下圖所示
    image
  4. 導(dǎo)出項(xiàng)目所依賴的庫到項(xiàng)目根目錄
    pip freeze > requirements.txt
    
  5. 注意
    一定要確保你的項(xiàng)目在本地運(yùn)行沒有問題,否則在服務(wù)器終端下出了問題對于新手來說不好解決

2、項(xiàng)目上傳

  1. 注意
    最好將本地項(xiàng)目復(fù)制一份,然后將項(xiàng)目下的虛擬環(huán)境刪除
  2. 在windows下可以使用圖形化界面工具WinScp或者Xshel
    scp -r 本地項(xiàng)目根目錄絕對路徑 服務(wù)器用戶名@服務(wù)器ip地址:上傳服務(wù)器的目錄
    
  3. linux或者mac使用命令
    scp -r 本地項(xiàng)目根目錄絕對路徑 服務(wù)器用戶名@服務(wù)器ip地址:上傳服務(wù)器的目錄
    
    scp /home/xxx/work/PycharmProjects/DjangoDeployExample test@192.168.0.112:/home/www/django
    

3、連接遠(yuǎn)程服務(wù)器創(chuàng)建虛擬環(huán)境

  1. 說明
    由于python兼容性的問題,不建議在全局環(huán)境中部署,而且一個(gè)服務(wù)器有可能部署多個(gè)項(xiàng)目,所以推薦在虛擬環(huán)境中部署
  2. 連接遠(yuǎn)程服務(wù)器
    ssh 用戶名@IP地址 -p 端口號(默認(rèn)80)
    
  3. 安裝虛擬環(huán)境
    sudo pip install virtualenv
    
  4. 創(chuàng)建虛擬環(huán)境
    # 1.在項(xiàng)目的根目錄(建議),也可以在其他地方均可
    cd /home/www/django
    # 創(chuàng)建虛擬環(huán)境,名字隨意
    virtualenv venv
    
  5. 激活虛擬環(huán)境
    source .venv//bin/activate
    
    image

4、導(dǎo)入虛擬環(huán)境

  1. 使用pip
    pip install -r requirement.txt
    

三、Gunicorn

1、安裝

  1. 在項(xiàng)目的虛擬環(huán)境安裝gunicorn
    # 如果下載速度過慢使用國內(nèi)源
    pip3 install gunicorn -i https://pypi.douban.com/simple
    
  2. 在項(xiàng)目的虛擬環(huán)境中安裝gevent
    # 基于協(xié)程的庫,提高并發(fā)量
    pip3 install gevent -i https://pypi.douban.com/simple
    

2、通過Gunicorn啟動(dòng)項(xiàng)目

2.1、命令啟動(dòng)(不推薦)

  1. 命令
    # 常見的參數(shù)
    gunicorn -w 10 -k 'gevent' -b 0.0.0.0:9000 DjangoDeployExample.wsgi:application --reload -t 500 -D --access-logfile logs/gunicorn.log
    
  2. 參數(shù)說明
    參數(shù) 說明 備注
    -w 10 開啟10個(gè)進(jìn)程 根據(jù)服務(wù)器配置來定
    -k 'gevent' 使用gevent異步模式,提高了響應(yīng)速度。 必須先安裝好gevent
    -b 0.0.0.0:9000 表示綁定ip地址和端口
    DjangoDeployExample.wsgi:application settings.py文件同級目錄的wsgi.py中 這里使用的是相對路徑
    -–reload 監(jiān)聽到項(xiàng)目文件變動(dòng)自動(dòng)重啟gunicorn 生效
    -D 讓命令后臺執(zhí)行 如果想看命令錯(cuò)誤可不要
    -t 500 配置每個(gè)請求的超時(shí)時(shí)間為500秒
    –access-logfile logs/gunicorn.log 將請求日志保存到該文件中 logs目錄必須創(chuàng)建
  3. 示例圖


    image

    image
  4. 備注
    詳細(xì)參數(shù),請看其他附錄

2.2、通過配置文件啟動(dòng)(常用)

  1. 創(chuàng)建gunicorn.conf文件
    # 并行工作進(jìn)程數(shù)
    workers = 4
    # 指定每個(gè)進(jìn)程的線程數(shù)
    threads = 2
    # 監(jiān)聽內(nèi)網(wǎng)端口8000
    bind = '192.168.58.44:8000'
    # 設(shè)置守護(hù)進(jìn)程(linux有效)
    daemon = 'true'
    # 工作模式協(xié)程
    worker_class = 'gevent'
    # 設(shè)置最大并發(fā)量
    worker_connections = 2000
    # 設(shè)置進(jìn)程文件目錄
    pidfile = '/home/xxx/work/DjangoDeployExample/product/gunicorn//gunicorn.pid'
    # 設(shè)置訪問日志和錯(cuò)誤信息日志路徑
    accesslog = '/home/xxx/work/DjangoDeployExample/product/gunicorn/logs/gunicorn_acess.log'
    errorlog = '/home/xxx/work/DjangoDeployExample/product/gunicorn/logs/gunicorn_error.log'
    # 設(shè)置日志記錄水平
    loglevel = 'error'
    
  2. 啟動(dòng)
    gunicorn -c gunicorn.conf DjangoDeployExample.wsgi:application
    
  3. 注意
    • 注意用戶權(quán)限問題,比如pid文件 訪問日志 errorlog 如果權(quán)限不夠可以給目錄授權(quán)一下

四、nginx

1、說明

本教程是通過命令安裝,一般默認(rèn)安裝在/etc/nginx/,下載安裝包的安裝的可以根據(jù)自己的目錄來配置,具體的一些細(xì)節(jié)這里不介紹,具體請自行查詢

注意:在系統(tǒng)的命令窗口中使用,上面都是在虛擬環(huán)境下使用

2、命令介紹

  1. 查看nginx是否啟動(dòng)
    ps aux|grep nginx
    
    image
  2. 檢查nginx配置文件是否有錯(cuò):
    # -t 測試     nginx的配置文件
    sudo nginx -t xxx/xxx/nginx.conf
    
  3. 通過配置文件啟動(dòng)
    sudo nginx -c xxx/xxx/nginx.conf
    
  4. 關(guān)閉nginx
    nginx -s stop
    # 其它方式
    sudo pkill -9 nginx 
    

3、反向代理

  1. nginx.conf配置文件
    不建議直接修改nginx的配置文件,最好復(fù)制一份通過指定配置文件啟動(dòng)
    # 用戶  用戶名    用戶組
    user  zhangwei  zhangwei;
    #設(shè)置值和CPU核心數(shù)一致
    worker_processes auto;
    # 全局錯(cuò)誤日志 (注意權(quán)限)
    error_log  /home/xxx/work/PycharmProjects/DjangoDeployExample/product/nginx/logs/error.log;
    # pid文件所在目錄 (注意權(quán)限)
    pid  /home/xxx/work/PycharmProjects/DjangoDeployExample/product/nginx//nginx.pid;
    # events塊配置
    events {
      # 事件驅(qū)動(dòng)模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
      use epoll;
      # 單個(gè)work進(jìn)程允許的最大連接數(shù),默認(rèn)為512
      worker_connections 65535;
    }
    # http塊配置
    http {
        # 文件擴(kuò)展名與文件類型映射表。設(shè)定mime類型(郵件支持類型),類型由mime.types文件定義
        # 
        include /etc/nginx/mime.types;
        #默認(rèn)文件類型,默認(rèn)為text/plain
        default_type application/octet-stream;
        # http模塊的的訪問日志
        access_log  /home/zhangwei/work/PycharmProjects/DjangoDeployExample/product/nginx/logs/access.log;
        # #允許sendfile方式傳輸文件,默認(rèn)為off,可以在http塊,server塊,location塊。
        #(sendfile系統(tǒng)調(diào)用不需要將數(shù)據(jù)拷貝或者映射到應(yīng)用程序地址空間中去)
        sendfile  on;
        # 連接超時(shí)時(shí)間,默認(rèn)為75s,可以在http,server,location塊
        keepalive_timeout  65;
        server {
            listen       80;
            #  有域名的話綁定域名,沒域名寫ip地址
            server_name  www.hello.com;
            # 全局錯(cuò)誤的界面
            error_page  404  /404.html;
            # 反向代理的路徑(和upstream綁定),location后面設(shè)置映射的路徑
            location / { 
               # 注意代理的ip地址一定要和gunicorn里的端口一致
               proxy_pass http://192.168.58.44:8000;
               proxy_pass_header       Authorization;
               proxy_pass_header       WWW-Authenticate;
               proxy_set_header Host $host;
               proxy_set_header X-Real-IP $remote_addr;
               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
            # 處理靜態(tài)文件
            location /static {
                alias  /home/xxx/work/PycharmProjects/DjangoDeployExample/static;
                # 過期30天,靜態(tài)文件不怎么更新,過期可以設(shè)大一點(diǎn),
                 # 如果頻繁更新,則可以設(shè)置得小一點(diǎn)。
                expires 30d;
            }
         # 多媒體資源等文件 路徑
            location /media {
                alias /home/xxx/work/PycharmProjects/DjangoDeployExample/media/;
                # 過期30天,靜態(tài)文件不怎么更新,過期可以設(shè)大一點(diǎn),
                # 如果頻繁更新,則可以設(shè)置得小一點(diǎn)。
                expires 30d;
            }
        }
    }
    
  2. 本案例直接將nginx放在工程下
    sudo nginx -c xxx/xxx/nginx.conf
    
  3. 注意
    • 一定要注意文件的權(quán)限問題日志 pid文件的權(quán)限問題
    • 代理的ip地址一定要和gunicorn里的端口一致
    • mime.types注意引入的路徑,因?yàn)椴皇切薷哪J(rèn)的nginx配置文件

五、附錄

1、gunicorn詳細(xì)參數(shù)

命令 簡寫 參數(shù)類型 說明
--config -c 字符串 配置文件路徑,路徑形式的字符串格式
--bind -b ip地址 綁定服務(wù)器套接字
--workers -w 整型 用于處理工作進(jìn)程的數(shù)量,為正整數(shù),默認(rèn)為1。worker推薦的數(shù)量為當(dāng)前的CPU個(gè)數(shù)*2 + 1
--backlog 整型 等待服務(wù)的客戶的數(shù)量, 必須是正整數(shù),一般設(shè)定在64~2048的范圍內(nèi)
--worker-class -k 字符串 要使用的工作模式,默認(rèn)為sync 可選值 gevent tornado
--threads 整型 處理請求的工作線程數(shù),使用指定數(shù)量的線程運(yùn)行每個(gè)worker。為正整數(shù),默認(rèn)為1
--worker-connections 整型 最大客戶端并發(fā)數(shù)量,默認(rèn)情況下這個(gè)值為1000
max_requests 整型 超過這么多秒后工作將被殺掉,并重新啟動(dòng)。一般設(shè)定為30秒
--timeout -t 整型
--keep-alive 整型 `連接上等待請求的秒數(shù),默認(rèn)情況下值為2。一般設(shè)定在1~5秒之間
--limit-request-line 整型 HTTP請求行的最大大小,此參數(shù)用于限制HTTP請求行的允許大小,默認(rèn)情況下,這個(gè)值為4094。值是0~8190的數(shù)字。此參數(shù)可以防止任何DDOS攻擊
--limit-request-fields 整型 限制HTTP請求中請求頭字段的數(shù)量。此字段用于限制請求頭字段的數(shù)量以防止DDOS攻擊,與limit-request-field-size一起使用可以提高安全性。默認(rèn)情況下,這個(gè)值為100,這個(gè)值不能超過32768
--limit-request-field-size 整型 限制HTTP請求中請求頭的大小,默認(rèn)情況下這個(gè)值為8190。值是一個(gè)整數(shù)或者0,當(dāng)該值為0時(shí),表示將對請求頭大小不做限制
--reload 代碼更新時(shí)將重啟工作,默認(rèn)為False。此設(shè)置用于開發(fā),每當(dāng)應(yīng)用程序發(fā)生更改時(shí),都會(huì)導(dǎo)致工作重新啟動(dòng)。
--check-config 布爾 顯示配置文件信息
--chdir 路徑 切換到指定的工作目錄
--daemon -D, 布爾 守護(hù)Gunicorn進(jìn)程,默認(rèn)False
-pid -p 文件 設(shè)置pid文件的文件名,如果不設(shè)置將不會(huì)創(chuàng)建pid文件
--worker-tmp-dir DIR 路徑 設(shè)置工作臨時(shí)文件目錄,如果不設(shè)置會(huì)采用默認(rèn)值
--access-logfile 文件 要寫入的訪問日志目錄
--error-logfile 文件 要寫入錯(cuò)誤日志的文件目錄
--log-file 文件 要寫入日志的文件目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,939評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,916評論 2 372