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進程監(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ā)到本機的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)致無法從別的機器訪問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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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