Django2+uwsgi+nginx部署詳解(Ubuntu18.04)

(歡迎訪問(wèn)我的博客: yicheng's site)(目前采用hugo,django是上個(gè)版本的反感)

Django項(xiàng)目寫好了,最后一步就是部署(deployment)了,部署十分關(guān)鍵消请,只有部署在服務(wù)器上,別人才能從互聯(lián)網(wǎng)上通過(guò)ip地址或域名直接訪問(wèn)到你的網(wǎng)頁(yè)类腮。

第一步是購(gòu)買vps(Virtual Private Server 虛擬服務(wù)器)臊泰,這個(gè)很簡(jiǎn)單而且網(wǎng)上教程一大把,這里就不詳述蚜枢,我在vultr購(gòu)買的海外服務(wù)器缸逃,這樣不用浪費(fèi)時(shí)間去備案了,vultr的一大特色就是按時(shí)長(zhǎng)收費(fèi)厂抽,如果你的vps出了什么問(wèn)題需频,可以隨時(shí)關(guān)停,并且它還支持微信支付寶筷凤,價(jià)格也很便宜昭殉。(vultr官網(wǎng):https://vultr.com)

Django的本地預(yù)覽十分方便,一行python manage.py runserver就能搞定藐守,但部署上線可沒(méi)有這么簡(jiǎn)單挪丢。因?yàn)榫W(wǎng)上關(guān)于Django部署的教程都很雜亂,當(dāng)時(shí)部署的時(shí)候就踩了很多很多坑卢厂,為了給之后一個(gè)參考乾蓬,我又重新部署了一次,來(lái)記錄詳細(xì)的過(guò)程慎恒。

相關(guān)軟件版本:

Django 2.1.3
Python 3.6.6
nginx 1.14.0
uwsgi 2.0.17.1

服務(wù)器:
Ubuntu-server 18.04


準(zhǔn)備工作

首先打開ssh軟件任内,Xshell、Putty什么的都行融柬,通過(guò)vultr上vps詳情頁(yè)上給的ip和root密碼連接到這臺(tái)vps死嗦。

剛拿到的船新Linux,第一步先給它來(lái)個(gè)更新:

sudo apt-get update
sudo apt-get upgrade

建議使用非root用戶粒氧,部署時(shí)最好使用python虛擬環(huán)境越走,具體操作不是本文的重點(diǎn),便不贅述了

系統(tǒng)自帶Python3.6、vim和git廊敌,所以不用裝

安裝python3-pip铜跑、python3-setuptools、gcc骡澈、python3-dev锅纺、wheel:
(缺一不可,不然之后用pip安裝uwsgi會(huì)有各種各樣的報(bào)錯(cuò))

sudo apt-get install python3-pip python-setuptools python3-dev wheel


放置Django項(xiàng)目

直接在服務(wù)器端用vim什么的寫Django當(dāng)然可壤吲埂(雖然會(huì)很酸爽)囤锉,但更多的時(shí)候我們是在本地寫好了Django項(xiàng)目,要把它挪到服務(wù)器上护锤。

在傳輸之前官地,要做一些工作:

先更改一下setting.py里的ALLOWED_HOSTS,把服務(wù)器的ip加進(jìn)去烙懦,有域名的話順便把域名也加進(jìn)去驱入,要不然之后會(huì)無(wú)法加載Django項(xiàng)目

在本地的Python虛擬環(huán)境上使用pip freeze > requirements.txt,生成一個(gè)txt文件,里面是需要的Python庫(kù)以及其版本氯析,之后一并傳給服務(wù)器

傳輸文件到服務(wù)器的方法非常之多:可以使用Xshell自帶的文件傳輸亏较,也可以使用linux命令scp或安裝更直觀的lrzsz,或者使用本地的FileZilla掩缓、Winscp等軟件雪情,當(dāng)然萬(wàn)能的git也很不錯(cuò)。

不過(guò)考慮到之后這個(gè)web項(xiàng)目之后也要修改你辣,用上面的方法感覺都不是特別方便巡通,介紹一個(gè)非常好用的方法,那就是使用Pycharm自帶的deployment功能舍哄,可以實(shí)現(xiàn)實(shí)時(shí)上傳以及下載文件宴凉,很是方便。

Tools->Deployment->Configuration中配置好與自己服務(wù)器的連接蠢熄,IP地址跪解、用戶名炉旷、密碼以及對(duì)應(yīng)項(xiàng)目路徑

image
image

Settings->Project Interpreter里把項(xiàng)目解釋器更改為服務(wù)器里的Python签孔,mappings里填寫兩邊項(xiàng)目的目錄,再加一條manage.py的映射

image

apply之后Pycharm右下角會(huì)出現(xiàn)上傳進(jìn)度條窘行,會(huì)有點(diǎn)慢饥追,喝杯茶等一段時(shí)間即可

傳輸完畢后會(huì)發(fā)現(xiàn)本地的項(xiàng)目已經(jīng)全部上傳到服務(wù)器了

但這個(gè)畢竟不是這篇文章的重點(diǎn),不重點(diǎn)介紹罐盔,遇到了什么問(wèn)題可以留言或者私信我但绕。

最后別忘了把requirements.txt上傳到服務(wù)器,用pycharm的話只要直接把文件拖進(jìn)本地項(xiàng)目目錄,Pycharm就會(huì)自動(dòng)幫我們上傳到服務(wù)器捏顺。

在服務(wù)器上使用pip install -r requirements.txt來(lái)安裝必要的Python packages

安裝與配置uwsgi

使用pip3安裝uwsgi(注意是pip安裝六孵,不是apt-get,否則之后會(huì)各種報(bào)錯(cuò))

pip3 install uwsgi

下面來(lái)試一下uwsgi是否好使:
找個(gè)位置新建一個(gè)py文件幅骄,就叫uwsgi_test.py好了劫窒,然后用vim打開

touch uwsgi_test.py
vim uwsgi_test.py

寫入以下內(nèi)容:

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

wq保存退出(vim的基本操作不贅述,網(wǎng)上教程一大把)

然后輸入以下命令啟動(dòng)uwsgi拆座,把這個(gè)部署到某個(gè)端口主巍,以9090端口為例

uwsgi --http :9090 --wsgi-file uwsgi_test.py

這時(shí)會(huì)出現(xiàn)spawned uWSGI worker 1 (and the only) (pid: 11812, cores: 1)
找個(gè)瀏覽器,訪問(wèn)http://<你的服務(wù)器ip>:9090/挪凑,不出意外的話你會(huì)看到Hello Uwsgi的字樣孕索,說(shuō)明uwsgi能正常運(yùn)行。

在項(xiàng)目目錄下新建uwsgi.ini文件并編輯加入以下內(nèi)容:

[uwsgi]
# 直接訪問(wèn)uwsgi的端口號(hào)躏碳,繞過(guò)nginx
http = :8010
# 轉(zhuǎn)發(fā)給nginx的端口號(hào)
socket = 127.0.0.1:8001
# 是否使用主線程
master = true
# 項(xiàng)目的絕對(duì)路徑
chdir = /var/www/<PROJECT_NAME>/
# Django項(xiàng)目wsgi.py文件的相對(duì)路徑
wsgi-file = <PROJECT_NAME>/wsgi.py
# 進(jìn)程數(shù)
processes = 4
# 每個(gè)進(jìn)程的線程數(shù)
threads = 2
# 監(jiān)聽端口
stats = 127.0.0.1:9191
# 每次退出時(shí)是否清理環(huán)境配置
vacuum = true
# 目錄中一旦有文件被改動(dòng)就自動(dòng)重啟
touch-reload = /var/www/my_site
# 存放日志
daemonize = /var/www/my_site/uWSGI.log

加入uwsgi.ini的目的是使讓uwsgi對(duì)接Django項(xiàng)目的啟動(dòng)變得更簡(jiǎn)便搞旭,否則就得在終端敲很長(zhǎng)的代碼

有了uwsgi.ini我們只需要輸入uwsgi --ini uwsgi.ini就可以運(yùn)行,瀏覽器輸入ip地址加:8010端口(先繞過(guò)nginx因?yàn)檫€沒(méi)配置呢)唐断,發(fā)現(xiàn)可以顯示我們的項(xiàng)目了选脊,這時(shí)css等靜態(tài)文件可能沒(méi)獲取到,別急

安裝和配置nginx

sudo apt-get install nginx安裝nginx脸甘,安裝后nginx會(huì)自動(dòng)啟動(dòng)恳啥,默認(rèn)端口為80端口,瀏覽器輸入ip地址加:80丹诀,可以看到"Welcome to nginx"的歡迎界面

把/etc/nginx/目錄下的uwsgi_params復(fù)制到項(xiàng)目目錄下钝的,也可以直接項(xià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;

前往/etc/nginx/目錄铆遭,查看nginx.conf(nginx基礎(chǔ)配置)硝桩,發(fā)現(xiàn)里面有這么兩行,意思就是包含conf.d文件夾中所有以conf后綴的配置和site-enabled文件夾中的內(nèi)容

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

我們不更改nginx.conf基礎(chǔ)配置枚荣,只需要修改conf.d目錄下的conf文件即可碗脊,進(jìn)入conf.d文件夾,修改default.conf文件橄妆,沒(méi)有的話就新建一個(gè)

然后寫入以下內(nèi)容:(務(wù)必根據(jù)自己的情況做相應(yīng)更改)

upstream django {
   server 127.0.0.1:8001;
}

server {
    # 監(jiān)聽端口衙伶,可改
    listen       80;
    # 修改為你的ip或者域名
    server_name  1.2.3.4;
    # 編碼方式
    charset utf-8;

    # 日志記錄,可選
    access_log      /var/www/<PROJECT_NAME>/nginx_access.log;
    error_log       /var/www/<PROJECT_NAME>/nginx_error.log;

    # 靜態(tài)文件所在目錄(自行修改)
    location /static {
        alias /var/www/my_site/blog/static;
    }
    # 媒體文件所在目錄(自行修改)
    #location /media  {
    #    alias /home/www/djangotest/Hello/media; # 媒體文件所在文件夾
    #}
    location / {
        include /var/www/<PROJECT_NAME>/uwsgi_params;
        uwsgi_pass django;
    }
}

運(yùn)行service nginx restart

如果報(bào)錯(cuò)nginx.service failed because the control process exited with error code害碾,那么運(yùn)行一下nginx -t -c /etc/nginx/nginx.conf矢劲,可以很容易的找到問(wèn)題在哪。

瀏覽器輸入ip地址慌随,發(fā)現(xiàn)看到的還是"Welcome to nginx"芬沉,這個(gè)是因?yàn)樵?code>nginx.conf中還include了一個(gè)sites-enabled/*躺同,它覆蓋了我們?cè)?code>default.conf中的配置,可以干脆直接去nginx.conf里把include /etc/nginx/sites-enabled/*;這一行刪掉丸逸,或者調(diào)換兩行位置蹋艺。

這時(shí)再訪問(wèn)我們的ip,就能看到自己在本地搭建的Django項(xiàng)目了黄刚,因?yàn)樵谂渲胣ginx的時(shí)候?qū)懭肓藄tatic的路徑车海,所以css什么的都加載進(jìn)來(lái)了。

至此nginx配置完畢

后續(xù)工作

服務(wù)器上的Django還沒(méi)有執(zhí)行數(shù)據(jù)庫(kù)遷移與管理員創(chuàng)建隘击,所以記得執(zhí)行

python manage.py makemigrations
python manage.py migrate

以及

python manage.py createsuperuser

每次有更新時(shí)都要重載uwsgi與nginx才能生效侍芝,為了方便uwsgi的重載,在項(xiàng)目目錄下新建一個(gè)uwsgi文件夾埋同,然后在里面新建兩個(gè)文件:uwsgi.pid(用于重載停止等操作)和uwsgi.status(用于查看狀態(tài))

修改uwsgi.ini州叠,把原先的stats那行刪掉,下面加上這兩行:

stats=%(chdir)/uwsgi/uwsgi.status
pidfile=%(chdir)/uwsgi/uwsgi.pid

這樣如果項(xiàng)目有更新凶赁,就可以使用這兩個(gè)命令來(lái)分別重載uwsgi和nginx了

uwsgi --reload uwsgi/uwsgi.pid
systemctl reload nginx.service

至此我們的Django項(xiàng)目就部署完成了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末咧栗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虱肄,更是在濱河造成了極大的恐慌致板,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咏窿,死亡現(xiàn)場(chǎng)離奇詭異斟或,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)集嵌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門萝挤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人根欧,你說(shuō)我怎么就攤上這事怜珍。” “怎么了凤粗?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵酥泛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嫌拣,道長(zhǎng)柔袁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任亭罪,我火速辦了婚禮瘦馍,結(jié)果婚禮上歼秽,老公的妹妹穿的比我還像新娘应役。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布箩祥。 她就那樣靜靜地躺著院崇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袍祖。 梳的紋絲不亂的頭發(fā)上底瓣,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音蕉陋,去河邊找鬼捐凭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凳鬓,可吹牛的內(nèi)容都是我干的茁肠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼缩举,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼垦梆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起仅孩,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤托猩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辽慕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體京腥,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年溅蛉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绞旅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡温艇,死狀恐怖因悲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情勺爱,我是刑警寧澤晃琳,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站琐鲁,受9級(jí)特大地震影響卫旱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜围段,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一顾翼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奈泪,春花似錦适贸、人聲如沸灸芳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)烙样。三九已至,卻和暖如春蕊肥,著一層夾襖步出監(jiān)牢的瞬間谒获,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工壁却, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留批狱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓展东,卻偏偏與公主長(zhǎng)得像精耐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琅锻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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