這幾天做了一個(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 的作用如圖所示:
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)目中: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è)試項(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
這里注意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表示安裝成功
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ò)誤信息:
(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)手魔眨。