前段時間用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ù)器軟件來處理。
用圖來表示就是如下:
web應(yīng)用服務(wù)器軟件
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