Django2.0+CentOS7.2+Nginx+uwsgi部署過(guò)程

這幾天做了一個(gè)簡(jiǎn)單的博客站點(diǎn),開發(fā)基本完成之后發(fā)現(xiàn)部署真的是一個(gè)大問(wèn)題太颤,在網(wǎng)上看了好多經(jīng)驗(yàn)貼,跟著他們一步一步的做盹沈,因?yàn)榫W(wǎng)上的教程中使用的系統(tǒng)和版本都不是完全相同的龄章,所以后來(lái)還是沒(méi)有部署成功。后來(lái)一步一步捋清Nginx和uwsgi之間的關(guān)系乞封,把他們的原理搞明白做裙,這才成功部署,這個(gè)過(guò)程花了大概two days肃晚。

一菇用、背景+環(huán)境說(shuō)明

1、Nginx

Nginx 是俄羅斯人編寫的十分輕量級(jí)的 HTTP 服務(wù)器,Nginx陷揪,它的發(fā)音為“engine X”惋鸥,是一個(gè)高性能的HTTP和反向代理服務(wù)器菲嘴,同時(shí)也是一個(gè) IMAP/POP3/SMTP 代理服務(wù)器佩谣。Nginx 是由俄羅斯人 Igor Sysoev 為俄羅斯訪問(wèn)量第二的 Rambler.ru 站點(diǎn)開發(fā)的。Nginx 以事件驅(qū)動(dòng)的方式編寫,所以有非常好的性能裹芝,同時(shí)也是一個(gè)非常高效的反向代理、負(fù)載平衡曲饱。其擁有匹配 Lighttpd 的性能添寺,同時(shí)還沒(méi)有 Lighttpd 的內(nèi)存泄漏問(wèn)題,而且 Lighttpd 的 mod_proxy 也有一些問(wèn)題并且很久沒(méi)有更新溅漾。

其特點(diǎn)主要有:

  • 處理靜態(tài)文件山叮,索引文件以及自動(dòng)索引;打開文件描述符緩沖.
  • 無(wú)緩存的反向代理加速添履,簡(jiǎn)單的負(fù)載均衡和容錯(cuò).
  • FastCGI屁倔,簡(jiǎn)單的負(fù)載均衡和容錯(cuò).
  • 模塊化的結(jié)構(gòu)。包括 gzipping, byte ranges, chunked responses,以及 SSI-filter 等 filter暮胧。如果由 FastCGI 或其它代理服務(wù)器處理單頁(yè)中存在的多個(gè) SSI锐借,則這項(xiàng)處理可以并行運(yùn)行,而不需要相互等待往衷。
  • 支持 SSL 和 TLSSNI.

2钞翔、WSGI

WSGI,全稱 Web Server Gateway Interface席舍,或者 Python Web Server Gateway Interface 布轿,是為 Python 語(yǔ)言定義的 Web 服務(wù)器和 Web 應(yīng)用程序或框架之間的一種簡(jiǎn)單而通用的接口。從名字就可以看出來(lái)来颤,這東西是一個(gè)Gateway驮捍,也就是網(wǎng)關(guān)。網(wǎng)關(guān)的作用就是在協(xié)議之間進(jìn)行轉(zhuǎn)換脚曾。也就是說(shuō)东且,WSGI就像是一座橋梁,一邊連著web服務(wù)器本讥,另一邊連著用戶的應(yīng)用珊泳。但是呢,這個(gè)橋的功能很弱拷沸,有時(shí)候還需要?jiǎng)e的橋來(lái)幫忙才能進(jìn)行處理色查。

WSGI 的作用如圖所示:


WSGI

3、uWSGI

uWSGI是一個(gè)Web服務(wù)器撞芍,它實(shí)現(xiàn)了WSGI協(xié)議秧了、uwsgi、http等協(xié)議序无。Nginx中HttpUwsgiModule的作用是與uWSGI服務(wù)器進(jìn)行交換验毡。
要注意 WSGI / uwsgi / uWSGI 這三個(gè)概念的區(qū)分衡创。

  • WSGI看過(guò)前面小節(jié)的同學(xué)很清楚了,是一種通信協(xié)議晶通。
  • uwsgi同WSGI一樣是一種通信協(xié)議璃氢。
  • 而uWSGI是實(shí)現(xiàn)了uwsgi和WSGI兩種協(xié)議的Web服務(wù)器。

4狮辽、uwsgi

uwsgi協(xié)議是一個(gè)uWSGI服務(wù)器自有的協(xié)議一也,它用于定義傳輸信息的類型(type of information),每一個(gè)uwsgi packet前4byte為傳輸信息類型描述喉脖,它與WSGI相比是兩樣?xùn)|西椰苟。

為什么有了uWSGI為什么還需要nginx?因?yàn)閚ginx具備優(yōu)秀的靜態(tài)內(nèi)容處理能力树叽,然后將動(dòng)態(tài)內(nèi)容轉(zhuǎn)發(fā)給uWSGI服務(wù)器舆蝴,這樣可以達(dá)到很好的客戶端響應(yīng)。

5菱皆、環(huán)境說(shuō)明

Django==2.0,CentOS==7.2挨稿,Nginx==1.12.2仇轻,uwsgi==2.0.17

這里服務(wù)器使用的是阿里云入門級(jí)ECS,目前作為一個(gè)網(wǎng)站的服務(wù)器完全夠用了奶甘,后續(xù)可以根據(jù)需要提升配置篷店。期間使用xshell和xftp來(lái)遠(yuǎn)程連接服務(wù)器并上傳代碼和其他一些文件。

二臭家、上傳源代碼

1疲陕、在CentOS中新建一個(gè)新用戶

首先在服務(wù)器中新建一個(gè)用戶,因?yàn)楹竺嬗胾wsgi的時(shí)候用root操作會(huì)提示一些警告信息钉赁,所以事先新建一個(gè)用戶蹄殃,并為用戶分配超級(jí)管理員權(quán)限。然后su - newuser切換到新建的用戶下面進(jìn)行操作你踩。

2诅岩、安裝Python3

CentOS7.2自帶了Python2.7.5,但是Django2.0已經(jīng)不支持Python2了带膜,所以需要安裝Python3吩谦。

The Django 1.11.x series is the last to support Python 2. The next major release, Django 2.0, will only support Python 3.5+【來(lái)自Django官網(wǎng)】

但是在安裝Python3,和系統(tǒng)自帶的Python2如何區(qū)分呢膝藕?而且很多CentOS中的庫(kù)都依賴于Python2式廷,所以這是一個(gè)問(wèn)題,不過(guò)你能遇到的問(wèn)題別人已經(jīng)遇到了而且已經(jīng)完美的解決了芭挽,詳細(xì)操作請(qǐng)看這里滑废。

3蝗肪、使用virtualenv為Django2.0開辟一個(gè)獨(dú)立的環(huán)境

使用virtualenv為Django2.0一個(gè)獨(dú)立的運(yùn)行環(huán)境,注意在創(chuàng)建的時(shí)候加上下面這個(gè)命令行參數(shù):--python=python3策严,加入你要在某個(gè)文件夾中用virtualenv新建一個(gè)Django2.0的項(xiàng)目穗慕,可以使用:virtualenv --no-site-packages venv --python=python3便可以完成這一步。

除此之外妻导,還要安裝好項(xiàng)目中所有的依賴庫(kù)逛绵,比如pillow,django-ckeditor等等倔韭。

4术浪、在3中創(chuàng)建的獨(dú)立環(huán)境里面再創(chuàng)建一個(gè)Django2.0項(xiàng)目

這里使用:

django-admin startproject your_project_name【your_project_name=開發(fā)好的項(xiàng)目名稱】

cd your_project_name

django-admin startapp your_app_name【your_app_name=開發(fā)好的項(xiàng)目中的APP名稱】

5、上傳你的源代碼

使用xftp直接將開發(fā)好的項(xiàng)目下的文件上傳到4中新建好的空項(xiàng)目中:

上傳源代碼
項(xiàng)目結(jié)構(gòu)

在我的項(xiàng)目中:project_name=myblog app_name=blog

這時(shí)可以使用django自帶的:python manage.py runserver 0:8080測(cè)試項(xiàng)目是否可以正常運(yùn)行寿酌,按理來(lái)說(shuō)是可以的胰苏。

三、安裝和配置uwsgi

1醇疼、安裝uwsgi

進(jìn)入你的項(xiàng)目中硕并,注意這里需要進(jìn)入virtualenv環(huán)境中,并用source venv/bin/activate激活這個(gè)獨(dú)立的環(huán)境秧荆。然后使用pip install uwsgi來(lái)安裝uwsgi倔毙。

安裝完成之后編寫一個(gè)文件來(lái)測(cè)試一下

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

然后在終端使用測(cè)試一下uwsgi安裝 是否成功:

uwsgi --http :80--wsgi-filetest.py,出現(xiàn)下面即成功
uwsgi測(cè)試成功

使用uwsgi測(cè)試項(xiàng)目是否可以正常運(yùn)行:

uwsgi --http :8080 --chdir /home/walker/walkerblog/myblog/ --module myblog.wsgi    
#用--chdir指定項(xiàng)目所在位置乙濒;用--module指定項(xiàng)目的wsgi文件陕赃,這里直接使用項(xiàng)目名稱.wsgi即可

這是按理來(lái)說(shuō)是可以訪問(wèn)你的站點(diǎn)了,只是還不能加載靜態(tài)文件颁股。
使用下面這句來(lái)指定靜態(tài)文件么库,從而讓站點(diǎn)可以像和使用 python manage.py runserver一樣來(lái)運(yùn)行,注意這種只是臨時(shí)的一種方式甘有。

uwsgi --http :8080 --chdir /home/walker/walkerblog/myblog/ --module myblog.wsgi --static-map=/static=static

此時(shí)诉儒,已經(jīng)可以正常訪問(wèn)你的站點(diǎn)了。

2亏掀、編寫uwsgi配置文件

在項(xiàng)目目錄中新建一個(gè)uwsgi.ini文件允睹,和manage.py在同一個(gè)文件夾內(nèi)即可,文件內(nèi)容如下:

#uwsgi.ini file
[uwsgi]

# Django-related settings
socket = 127.0.0.1:8001

# the base directory (full path)
chdir          = /home/walker/walkerblog/myblog  #你的項(xiàng)目路徑

# Django's wsgi file
module          = myblog.wsgi  #項(xiàng)目名稱.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes      = 2

# ... with appropriate permissions - may be needed
# chmod-socket    = 666
# chown-socket = nginx:nginx
# clear environment on exit
vacuum          = true
# enable-threads = true
uwsgi配置文件

這里注意socket中127.0.0.1表示本機(jī)幌氮,后面的8001表示端口缭受,你可以指定一個(gè)范圍從1024到65535的整數(shù)作為動(dòng)態(tài)端口,因?yàn)榍懊娴?023個(gè)是固定使用的端口该互,并且不能和已有程序中使用的port沖突米者,這個(gè)端口要和后面Nginx配置文件中的socket端口相同

四、安裝個(gè)配置Nginx

1蔓搞、安裝Nginx

在root用戶下使用yum -y install nginx便可以完成安裝Nginx

安裝完成之后使用 nginx -t測(cè)試一下胰丁,出現(xiàn)successful表示安裝成功

Nginx測(cè)試

2、配置Nginx

nginx的配置文件在:/etc/nginx/nginx.conf喂分,使用vim進(jìn)行編輯

    upstream django {     #自己加入的部分
        server 127.0.0.1:8001;    #端口8001必須和uwsgi配置文件中的socket端口一樣
    }

    server {

        listen      80 default_server;

        listen      [::]:80 default_server;

        server_name  www.your_domain.com your_domain.com  your_ip_addr;

        root        /home/walker/walkerblog/myblog;    #項(xiàng)目路徑

        # Load configuration files for the default server block.

        include /etc/nginx/default.d/*.conf;

        location / {

                include uwsgi_params;

                uwsgi_pass django;

        }

        location /static/ {    #加入靜態(tài)文件路徑锦庸,包括css文件,image文件和js文件

                autoindex on;

                alias /home/walker/walkerblog/myblog/static/;

        }

        location /media/ {    #加入其他資源文件蒲祈,上傳文件

                autoindex on;

                alias /home/walker/walkerblog/myblog/meida/;

        }

到這里甘萧,按理來(lái)說(shuō)就可以正常訪問(wèn)網(wǎng)站了,切換到新建的用戶下使用:uwsgi --ini uwsgi.ini & nginx就OK了梆掸。

但是

還是有點(diǎn)問(wèn)題扬卷,靜態(tài)文件還是訪問(wèn)不了,在/var/log/nginx/error.log發(fā)現(xiàn)是

因?yàn)闄?quán)限

造成的酸钦,在nginx.conf的最上面怪得,有一句

user nginx;

把它改成:

user root;

即可解決問(wèn)題!

3卑硫、Nginx常用操作及說(shuō)明

(1) 日志文件和錯(cuò)誤信息

/etc/nginx/nginx.conf中已經(jīng)指定好了日志文件和錯(cuò)誤信息:

日志文件
如果不能成功配置徒恋,可以打開這兩個(gè)文件看詳細(xì)原因,然后對(duì)癥下藥欢伏,這樣問(wèn)題解決得還是比較快的入挣。

(2) nginx常用操作
nginx -t    #測(cè)試nginx是否安裝成功;
nginx -s stop/quit    #停止nginx服務(wù)進(jìn)程
nginx -s reload    #在不停止服務(wù)的條件下重新加載一些配置文件颜懊,比如css和js文件财岔;

好了风皿,如果整個(gè)過(guò)程還是有問(wèn)題河爹,我建議你先好好想一想它們之間的關(guān)系,不要只跟著別人的去盲目的“配置”桐款,因?yàn)樽约旱沫h(huán)境或者其他信息都不太一樣咸这,所以你首先要想清楚,然后再去動(dòng)手魔眨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末媳维,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子遏暴,更是在濱河造成了極大的恐慌侄刽,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋凉,死亡現(xiàn)場(chǎng)離奇詭異州丹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門墓毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吓揪,“玉大人,你說(shuō)我怎么就攤上這事所计∧牵” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵主胧,是天一觀的道長(zhǎng)叭首。 經(jīng)常有香客問(wèn)我,道長(zhǎng)讥裤,這世上最難降的妖魔是什么放棒? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮己英,結(jié)果婚禮上间螟,老公的妹妹穿的比我還像新娘。我一直安慰自己损肛,他們只是感情好厢破,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著治拿,像睡著了一般摩泪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劫谅,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天见坑,我揣著相機(jī)與錄音,去河邊找鬼捏检。 笑死荞驴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贯城。 我是一名探鬼主播熊楼,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼能犯!你這毒婦竟也來(lái)了鲫骗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤踩晶,失蹤者是張志新(化名)和其女友劉穎执泰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渡蜻,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡术吝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顿苇。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峭咒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纪岁,到底是詐尸還是另有隱情凑队,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布幔翰,位于F島的核電站漩氨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏遗增。R本人自食惡果不足惜叫惊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望做修。 院中可真熱鬧霍狰,春花似錦、人聲如沸饰及。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)燎含。三九已至宾濒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間屏箍,已是汗流浹背绘梦。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赴魁,地道東北人卸奉。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像尚粘,于是被迫代替她去往敵國(guó)和親择卦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敲长,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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