nginx + uwsgi + centos部署 django攻略

前段時間用django寫了一個小東西脾还,得益于django完善的架構(gòu)體系和令人驚艷的admin管理界面忆绰,我本人用很少的代碼就完成了功能。 然后命令行鍵入

python manage.py runserver 8080

就爽快的運行起來了仇奶。

對于要拿來給人的東西捻艳,怎么著也要部署到nginx上才行吧驾窟,這不僅僅是因為慣例,更重要的是因為django本身自帶的用于開發(fā)的web服務(wù)器并不穩(wěn)定(說白了就是僅僅只是開發(fā)測試用的)认轨。

作為一名運維工程師绅络,當(dāng)然要熟練掌握各種部署作業(yè),由于我只是個新手好渠,那就拿它來練練手吧昨稼。于是在網(wǎng)上搜了很多部署的文章,按照相應(yīng)的步驟走下來拳锚,會發(fā)現(xiàn)有很多坑假栓,填完一個又來一個,導(dǎo)致搞了N多天才部署成功霍掺。究其原因:

  • 一是大多數(shù)文章只是講解部署步驟匾荆,并沒有對其中的原理有所涉及,對于我這種新手來說感覺是云里霧里杆烁;
  • 二是不同的linux系統(tǒng)版本存在差異牙丽,系統(tǒng)依賴和軟件安裝存在不確定性,自我摸索是不二法則兔魂。

前面廢話太多烤芦,下面是重點。對web開發(fā)和部署有些許經(jīng)驗的同學(xué)應(yīng)該知道析校,對于生產(chǎn)環(huán)境的web應(yīng)用部署构罗,應(yīng)該是對 web應(yīng)用 + web應(yīng)用服務(wù)器軟件 + web服務(wù)器軟件 的組合操作铜涉。web應(yīng)用顧名思義就是你的web project,這可以是java web項目遂唧,django項目或者php項目芙代;web應(yīng)用服務(wù)器軟件就是運行web應(yīng)用的地方,例如java用的tomcat服務(wù)器盖彭,django用的uwsgi服務(wù)器纹烹,正常情況下你只需要將web項目部署在應(yīng)用服務(wù)器軟件上就可以對外提供服務(wù)了。只不過這種情況下外部所有的請求不管是(動態(tài)請求還是靜態(tài)請求)都是由web應(yīng)用服務(wù)器軟件來處理召边,在用戶較少的情況下這樣其實是夠用的铺呵,但是當(dāng)用戶數(shù)增大,就必須要考慮到服務(wù)器系統(tǒng)的負(fù)載掌实,如果不能做到服務(wù)器負(fù)載的均衡分配陪蜻,必然會導(dǎo)致在訪問高峰情況下出現(xiàn)不可預(yù)知的嚴(yán)重后果。這時就是我們的web服務(wù)器軟件派上用場的時候了贱鼻,web服務(wù)器軟件常見的當(dāng)然就是著名的apache和nginx了,使用它們再配合應(yīng)用服務(wù)器軟件我們就能輕松的實現(xiàn)web網(wǎng)站的動靜分離滋将,靜態(tài)文件請求就交給apahce和nginx邻悬,動態(tài)請求就會由apache和nginx轉(zhuǎn)發(fā)到相應(yīng)的應(yīng)用服務(wù)器軟件來處理。
用圖來表示就是如下:

  1. web應(yīng)用服務(wù)器軟件

  2. web應(yīng)用服務(wù)器軟件 + web服務(wù)器軟件

本文主要介紹的是nginx + uwsgi 來為django應(yīng)用提供服務(wù)随闽,之所以沒有選擇apache是因為公司的生產(chǎn)環(huán)境大部分是nginx做服務(wù)器軟件的父丰。

首先有必要介紹一下本文的系統(tǒng)環(huán)境:
本文的采用的是 centos 6.7 + python 2.7.9 + django1.9, 僅供參考掘宪,畢竟部署配置雖然環(huán)境很重要蛾扇,但是萬變不離其宗,懂得原理+搜索魏滚,一切都會變得簡單镀首。

一、運行起你的django應(yīng)用

1. 安裝linux系統(tǒng)所需的一些軟件依賴

這些依賴如果不安裝鼠次,很可能在后面編譯安裝python更哄、pip、django和uwsgi等軟件時出現(xiàn)一些錯誤腥寇。雖然目前還不了解這些依賴間的關(guān)系成翩,也許有些是多余的,但是就目前而言部署成功才是王道赦役!

  sudo yum groupinstall "Development tools"
  sudo yum install openssl openssl-devel sqlite-devel zlib-develbzip2-devel  ncurses-devel readline-devel tk-devel 
  sudo yum install pcre pcre-devel pcre-static

2.編譯安裝python2.7

centos6.7 自帶的是python2.6麻敌,而2.6運行django1.9的項目會報錯,所以重新編譯安裝了python2.7.9:

  sudo ./configure
  sudo make && sudo make install

3.安裝django

  sudo pip install django

默認(rèn)下載的就是django1.9的版本掂摔。 至于pip的安裝這里不多做介紹术羔,只要已經(jīng)安裝了上述的環(huán)境职辅,編譯安裝pip7.2還是很easy的。
如果默認(rèn)的pip安裝速度緩慢可以使用douban鏡像作為下載源:

sudo pip install django -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

4.運行django

切換到django項目所在的目錄聂示,運行

python manage.py runserver 8080,

然后在瀏覽器中輸入127.0.0.1:8080 域携,如果訪問成功說明django運行環(huán)境正常。

二鱼喉、使用uwsgi提供服務(wù)

1.安裝uwsgi

  sudo pip install uwsgi

2.啟動uwsgi

切換到django項目的主目錄下秀鞭,對于djano1.9 ,如果你是使用

  django-admin startproject  your_proj_name

那么在主目錄下會有your_proj_name/wsgi.py文件扛禽。
這時你只需在主目錄下輸入

  uwsgi --http :8080 --module your_proj_name.wsgi

就可以運行你的web項目了锋边,這時如果在瀏覽其中輸入127.0.0.1:8080 能夠成功訪問,說明你的應(yīng)用服務(wù)器部署成功编曼,已經(jīng)可以對外提供服務(wù)豆巨。
這種提供服務(wù)的方式可以表示為:

the web client <-> uWSGI <-> Django

多數(shù)情況下我們不會讓瀏覽器直接與uwsgi交互,而是加入nginx作為中間設(shè)備轉(zhuǎn)發(fā)或處理請求掐场。

三往扔、部署到nginx

1.安裝nginx

  sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm #安裝nginx yum源
  sudo yum info
  sudo yum install nginx

2.設(shè)置nginx啟動的配置文件

因為/etc/nginx/nginx.conf 文件會include /etc/nginx/conf.d/目錄下的所有配置文件,為了方便管理配置文件熊户,我們在/etc/nginx/conf.d/ 下創(chuàng)建自己的web項目的配置文件萍膛,例如新建一個my_site.conf文件。 在配置文件里我們輸入如下信息(其中easy_sysman是我的工程名):

server {
  listen 8080;  #啟動的nginx進(jìn)程監(jiān)聽請求的端口
  server_name localhost;  #域名
  error_log /var/log/easy_sysman/error.log;   #nginx錯誤日志嚷堡,可自行設(shè)置蝗罗,但必須保證提前建立好該目錄和文件
  location / {
    include /etc/nginx/uwsgi_params;  
    uwsgi_pass 127.0.0.1:9090;  #對于動態(tài)請求,轉(zhuǎn)發(fā)到本機(jī)的9090端口蝌戒,也就是uwsgi監(jiān)聽的端口
  }
  #error_page 404 /404.html;
  error_page 500 502 503 504 /50x.html;  
  location = /50x.html {
     root /usr/share/nginx/html;
  }
  location /static/ {
    alias /var/www/easy_sysman/static/;   #設(shè)定靜態(tài)文件所在目錄
  }
  location /media/ {  
    alias /var/www/easy_sysman/media/;    #同樣自行設(shè)置串塑,要保證目錄已經(jīng)建好
  }
}

配置文件寫好后,我們要檢查配置文件的正確性:

nginx -t -c /etc/nginx/nginx.conf 

3.同步靜態(tài)文件到nginx設(shè)置的目錄下

首先修改django項目setting.py北苟,增加

 STATIC_ROOT = '/var/www/easy_sysman/static/'

在命令行輸入

 python manage.py collectstatic  

自動將所有靜態(tài)文件復(fù)制到nginx的索引目錄桩匪。

4.啟動uwsgi:

切換到django項目目錄

uwsgi --socket 9090 --module easy_sysman.wsgi

這里可以使用更復(fù)雜的配置文件來啟動,可以參考uwsgi-to-run-with-a-ini-file

5.啟動nginx

sudo service nginx start 

就可以訪問 服務(wù)器ip:8080/ 就能出現(xiàn)頁面粹淋,如果不行就檢查 /var/log/easy_sysman/error.log里的錯誤內(nèi)容吸祟,一點點修正。

這種服務(wù)提供方式可以表述為:

the web client <-> the web server <-> the socket <-> uWSGI <-> Django

四.踩過的坑

1.啟動nginx后出錯

查看錯誤日志時有可能出現(xiàn)
connect() to 127.0.0.1:9090 failed (13: Permission denied) while connecting to upstream 的錯誤
原因是 selinux 導(dǎo)致的桃移。
敲入 /usr/sbin/sestatus 查看selinux狀態(tài)屋匕,enable說明開啟
解決方法就是 setenforce 0
然后getenforce 查看狀態(tài)為permissive , 應(yīng)該就可以正常訪問了借杰。

2.防火墻

centos最小化安裝會默認(rèn)啟動 firewalld服務(wù)过吻,導(dǎo)致無法從別的機(jī)器訪問web應(yīng)用。第一反應(yīng)是關(guān)閉iptables試一試,可是本身還沒有安裝iptables服務(wù)纤虽,后來才知道還有個firewalld乳绕。

 systemctl stop firewalld ;systemctl mask firewalld 

輸入上述命令解決

3.運行django出錯

Traceback (most recent call last):File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/site-packages/django/__init__.py", line 1, in <module>
from django.utils.version import get_versionFile "/usr/lib/python2.6/site-packages/django/utils/version.py", line 7, in <module>
from django.utils.lru_cache import lru_cacheFile "/usr/lib/python2.6/site-packages/django/utils/lru_cache.py", line 28
fasttypes = {int, str, frozenset, type(None)},
^SyntaxError: invalid syntax

解決辦法是安裝python2.7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逼纸,隨后出現(xiàn)的幾起案子洋措,更是在濱河造成了極大的恐慌,老刑警劉巖杰刽,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菠发,死亡現(xiàn)場離奇詭異,居然都是意外死亡贺嫂,警方通過查閱死者的電腦和手機(jī)滓鸠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來第喳,“玉大人糜俗,你說我怎么就攤上這事∏ィ” “怎么了悠抹?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長渔工。 經(jīng)常有香客問我锌钮,道長,這世上最難降的妖魔是什么引矩? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮侵浸,結(jié)果婚禮上旺韭,老公的妹妹穿的比我還像新娘。我一直安慰自己掏觉,他們只是感情好区端,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澳腹,像睡著了一般织盼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酱塔,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天沥邻,我揣著相機(jī)與錄音,去河邊找鬼羊娃。 笑死唐全,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕊玷。 我是一名探鬼主播邮利,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼弥雹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了延届?” 一聲冷哼從身側(cè)響起剪勿,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎方庭,沒想到半個月后厕吉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡二鳄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年赴涵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片订讼。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡髓窜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欺殿,到底是詐尸還是另有隱情寄纵,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布脖苏,位于F島的核電站程拭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棍潘。R本人自食惡果不足惜恃鞋,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亦歉。 院中可真熱鬧恤浪,春花似錦、人聲如沸肴楷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赛蔫。三九已至砂客,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呵恢,已是汗流浹背鞠值。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留瑰剃,地道東北人齿诉。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粤剧。 傳聞我的和親對象是個殘疾皇子歇竟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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