Python3 + Django + uwsgi + nginx 配置部署

簡介

本來以為最后將代碼部署到服務(wù)器上是一件很容易的事躺坟,沒想到在這里又踩了無數(shù)的坑按声。雖然網(wǎng)上與此相關(guān)的博客有很多很多,但是每一個的方法都略有不同趾牧,很多方法用過之后發(fā)現(xiàn)并不能成功部署(絕望...)故响。于是我寫一篇博客記錄一下我在配置過程中的詳細(xì)步驟傀广,也方便日后有需時看這篇博客回憶一下。

安裝與配置

基本環(huán)境

  • 服務(wù)器:騰訊云 CVM 標(biāo)準(zhǔn)型S3彩届,操作系統(tǒng)為 Ubuntu Server 16.04.1 LTS 64位
  • python:3.5.2
  • mysql:5.7.23
  • pip3:18.1

安裝配置

1伪冰、django及其相關(guān)庫的安裝

在這里我們使用的django版本號為1.9.5,直接運(yùn)行以下命令即可成功安裝:

pip3 install --user django~=1.9.5

:命令中若不加--user樟蠕,則可能出現(xiàn)用戶權(quán)限的問題而無法成功安裝贮聂。
此外靠柑,我們還需要mysqlclientpymysql實(shí)現(xiàn)django與mysql數(shù)據(jù)庫的交互:

pip3 install --user mysqlclient~=1.3.7
pip3 install --user pymysql~=0.9.2

2、uWSGI的安裝

直接運(yùn)行以下命令即可成功安裝:

pip3 install --user uwsgi

:一般這樣安裝的uWSGI是沒有問題的吓懈,如果大家不放心的話歼冰,可以參考網(wǎng)上測試uWSGI的方法,此處省略耻警。

3隔嫡、nginx的安裝

直接運(yùn)行以下命令即可成功安裝:

sudo apt-get install nginx

:我一開始是用make源碼的方式安裝了nginx,但是發(fā)現(xiàn)安裝之后使用起來很不方便榕栏,很多路徑都找不到畔勤;而網(wǎng)上關(guān)于nginx的配置基本都是用上述命令安裝的蕾各,所以為了省事扒磁,我也就改成使用上述命令直接安裝。

使用

在使用nginxuWSGI進(jìn)行配置時式曲,最容易出錯的是路徑問題(捂臉)所以我在這里先給出我的項(xiàng)目架構(gòu)妨托,再說明具體配置方式。

項(xiàng)目架構(gòu)(目錄)

(.env) ubnutu@VM-0-10-ubuntu:~/WeChatTicket$(即在/home/ubuntu/WeChatTicket/目錄下)
.
├── manage.py
├── configs.json
├── static/
├── WeChatTicket/
|  └── wsgi.py              # wsgi模塊
└──  deployment/
    ├── mysite_nginx.conf    # nginx配置文件
    ├── mime.types           # nginx相關(guān)配置文件
    ├── uwsgi_params         # nginx中與uWSGI相關(guān)的參數(shù)引用文件
    ├── nginx_error.log      # nginx錯誤日志文件
    ├── nginx_access.log     # nginx連接日志文件
    ├── mysite_uwsgi.ini     # uWSGI配置文件
    ├── uwsgi.log            # uWSGI日志文件
    └── uwsgi.pid            # uWSGI控制文件

文件配置

1吝羞、在mysite_nginx.conf中寫入如下內(nèi)容:

# mysite_nginx.conf
# 設(shè)置用戶權(quán)限
user root;

events {
  worker_connections 1024;
}
http {
  #加入mime.types配置文件
  include mime.types;

  # nginx需要連接到的地址(即uWSGI在本地開啟的地址兰伤,在這里選用9090端口)
  upstream django {
      server 127.0.0.1:9090;
  }
  # 配置服務(wù)器
  server {
      # 你監(jiān)聽的端口號
      listen  80;

      # 服務(wù)器
      server_name  236584.iterator-traits.com;
      charset  utf-8;

      # 輸出日志
      access_log /home/ubuntu/WeChatTicket/deployment/nginx_access.log;
      error_log /home/ubuntu/WeChatTicket/deployment/nginx_error.log;

      # 最大上傳尺寸
      client_max_body_size 75M; 

      #與uWSGI連接的地址及靜態(tài)文件配置
      location / {
        alias /home/ubuntu/WeChatTicket/static/;
        try_files $uri $uri/ @django;
      }

      location @django {
        uwsgi_pass  django;
        include  uwsgi_params;
     }
  }
}

2、從nginx的配置文件夾conf中直接將uwsgi_params文件拷貝到deployment目錄钧排;或者直接在deployment目錄下創(chuàng)建uwsgi_params文件并寫入如下內(nèi)容:

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;   

3敦腔、從nginx的配置文件夾conf中直接將mime.types文件拷貝到deployment目錄;或者直接在deployment目錄下創(chuàng)建mime.types文件并寫入如下內(nèi)容:

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    application/font-woff                            woff;
    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}

4恨溜、在mysite_uwsgi.ini中寫入如下內(nèi)容:

[uwsgi]
# django相關(guān)設(shè)置
socket          = 127.0.0.1:9090

# 項(xiàng)目所在目錄
chdir           = /home/ubuntu/WeChatTicket

# wsgi模塊所在地址
module          = WeChatTicket.wsgi

# 進(jìn)程相關(guān)設(shè)置

master          = true

# 最大工作進(jìn)程與線程
processes       = 4
threads         = 2

# 離開時清除環(huán)境
vacuum          = true

# pid文件
pidfile        = uwsgi.pid

# 日志文件
daemonize      = uwsgi.log

運(yùn)行(此時終端位于deployment目錄下)

1符衔、啟動uWSGI

uwsgi --ini mysite_uwsgi.ini

此時會發(fā)現(xiàn),目錄下增加了uwsgi.piduwsgi.log兩個文件糟袁。
2判族、啟動nginx

sudo nginx -c /home/ubuntu/WeChatTicket/deployment/mysite_nginx.conf

此時會發(fā)現(xiàn),目錄下增加了nginx_error.lognginx_access.log兩個文件项戴。
使用sudo是為了解決用戶權(quán)限的限制形帮。
3、使用瀏覽器周叮,輸入ip地址辩撑,檢測服務(wù)是否正確部署。

附:常用命令

  • ps aux|grep nginx(或uwsgi):查看進(jìn)程狀態(tài)仿耽。
  • sudo nginx -c nginx.conf:以nginx.conf的配置開啟nginx的服務(wù)合冀。
  • sudo pkill -9 nginx:強(qiáng)制結(jié)束nginx服務(wù)。
  • uwsgi --ini uwsgi.ini:初始化uWSGI服務(wù)并開啟氓仲。
  • uwsgi --stop uwsgi.pid:終止uWSGI服務(wù)水慨,同時會刪除uwsgi.pid得糜。
  • uwsgi --reload uwsgi.pid:重新加載uWSGI服務(wù)。

總結(jié)

Python3 + Django + uwsgi + nginx 配置部署的學(xué)習(xí)就到此結(jié)束了晰洒,如果大家有什么疑問朝抖,可以隨時提出。文檔中有什么錯誤或者不足之處谍珊,也歡迎大家批評指正治宣。

參考資料:
1、uwsgi服務(wù)啟動(start)停止(stop)重新裝載(reload)
2砌滞、uWSGI+django+nginx的工作原理流程與部署歷程
3侮邀、基于nginx和uWSGI在Ubuntu上部署Django

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市贝润,隨后出現(xiàn)的幾起案子绊茧,更是在濱河造成了極大的恐慌,老刑警劉巖打掘,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件华畏,死亡現(xiàn)場離奇詭異,居然都是意外死亡尊蚁,警方通過查閱死者的電腦和手機(jī)亡笑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來横朋,“玉大人仑乌,你說我怎么就攤上這事∏俣В” “怎么了晰甚?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祠够。 經(jīng)常有香客問我压汪,道長,這世上最難降的妖魔是什么古瓤? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任止剖,我火速辦了婚禮,結(jié)果婚禮上落君,老公的妹妹穿的比我還像新娘穿香。我一直安慰自己,他們只是感情好绎速,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布皮获。 她就那樣靜靜地躺著,像睡著了一般纹冤。 火紅的嫁衣襯著肌膚如雪洒宝。 梳的紋絲不亂的頭發(fā)上购公,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音雁歌,去河邊找鬼宏浩。 笑死,一個胖子當(dāng)著我的面吹牛靠瞎,可吹牛的內(nèi)容都是我干的比庄。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼乏盐,長吁一口氣:“原來是場噩夢啊……” “哼佳窑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起父能,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤神凑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后法竞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耙厚,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡强挫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年岔霸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俯渤。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡呆细,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出八匠,到底是詐尸還是另有隱情絮爷,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布梨树,位于F島的核電站坑夯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抡四。R本人自食惡果不足惜柜蜈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望指巡。 院中可真熱鬧淑履,春花似錦、人聲如沸藻雪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勉耀。三九已至指煎,卻和暖如春蹋偏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背至壤。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工暖侨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崇渗。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓字逗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宅广。 傳聞我的和親對象是個殘疾皇子葫掉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容