django2.0+nginx+uwsgi配置

此文純粹記錄個(gè)人在搭建此博客時(shí)候遇到的情況。


nginx、uwsgi、django之間的相互聯(lián)系圖

版本說明:

? ? ? ? ubuntu 16.04 64位

? ? ? ? python 3.5

? ? ? ? django 2.0

? ? ? ? kindeditor

? ? ? ? virtualenv 15.2.0

? ? ? ? mysql? 5.7.21

? ? ? ? nginx? 1.10.3 (Ubuntu)

? ? ? ? uwsgi

主要配置難點(diǎn)在于在django setting.py文件的配置、uwsgi.ini文件配置,nginx配置上。



setting配置

? 1.若要放在云服務(wù)器上部署。

? ? ? ALLOWED_HOSTS = [

? ? ? ? ? ? ? '{云服務(wù)器ip地址}',

? ? ? ? ? ? ? '127.0.0.1',

? ? ? ? ]

? ? ? 首先要對服務(wù)器訪問ip與web程序進(jìn)行綁定才可以由云服務(wù)器的ip訪問web資源。

2.更改數(shù)據(jù)庫配置。

? ? 數(shù)據(jù)庫在云服務(wù)器中使用的是mysql,在此建議在安裝了mysql后,將云服務(wù)器上安裝的mysql配置為可遠(yuǎn)程訪問操控,方便在遠(yuǎn)程使用第三方工具對數(shù)據(jù)庫進(jìn)行操控。

? ? DATABASES = {

? ? 'default': {

? ? ? ? # 'ENGINE': 'django.db.backends.sqlite3',

? ? ? ? # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

? ? ? ? 'ENGINE': 'django.db.backends.mysql',

? ? ? ? 'NAME': '{數(shù)庫名}',

? ? ? ? 'USER': '{數(shù)據(jù)庫訪問用戶}',

? ? ? ? 'PASSWORD': '{數(shù)據(jù)庫訪問密碼}',

? ? ? ? 'HOST': '{數(shù)據(jù)庫所在的ip地址}',

? ? ? ? 'PORT': '3306',

? ? }

}

使用時(shí),對數(shù)據(jù)庫依賴安裝了有以下:

? ? ? sudo apt-get build-dep python-lxml? ?

? ? ? pip install PyMSQL

? ? ? pip install mysqlclient

? ? ? pip install Pollow? ? ? ### model中ImageField需要的依賴

3.對靜態(tài)文件和上傳文件的更改。

? ? ? django框架下,對靜態(tài)文件和上傳文件是需要進(jìn)行配置才會(huì)有效,要指定訪問后綴和文件目錄地址,這一切都可以在setting配置中實(shí)現(xiàn)。

? ? ? #設(shè)置靜態(tài)文件目錄。其中前端js、css、kindeditor富文本、UI第三方都放在其中

? ? #此地址是指在云服務(wù)器上 最后所有的static文件夾都會(huì)集中在此目錄下? ? 運(yùn)行命令為

python manage.py collectstatic

? ? ? MEDIA_ROOT='/var/www/blog/static/'? ?

? ? ? STATIC_URL = '/static/'? ? ? ? ? ? ? ? ? ? ? ? ? #訪問url后綴地址 如? 127.0.0.1/static/js/jq.js

? ? ? STATICFILES_DIRS = (

? ? ? ? ? ? os.path.join(BASE_DIR, "static"),? ? #開發(fā)時(shí)存放靜態(tài)文件目錄

? ? ? )

? ? ? # 設(shè)置媒體文件目錄? 與上靜態(tài)文件目錄配置說明同理

? ? ? MEDIA_URL = '/media/'

? ? ? MEDIA_ROOT ='/var/www/blog/media/'? ?

注:admin的靜態(tài)文件位置與開發(fā)時(shí)的靜態(tài)文件位置不一致,所以MEDIA_ROOT來合并所有的靜態(tài)文件是很有必要的,這樣admin才會(huì)有樣式。



uwsgi 配置

1.基本知識(shí)

wsgi:一種實(shí)現(xiàn)python解析的通用接口標(biāo)準(zhǔn)/協(xié)議,是一種通用的接口標(biāo)準(zhǔn)或者接口協(xié)議,實(shí)現(xiàn)了python web程序與服務(wù)器之間交互的通用性。

利用它,web.py或bottle或者django等等的python web開發(fā)框架,就可以輕松地部署在不同的web server上了;

uwsgi:同WSGI一樣是一種通信協(xié)議

uwsgi協(xié)議是一個(gè)uWSGI服務(wù)器自有的協(xié)議,它用于定義傳輸信息的類型,它與WSGI相比是兩樣?xùn)|西。

uWSGI :一種python web server或稱為Server/Gateway

uWSGI類似tornadoweb或者flup,是一種python web server,uWSGI是實(shí)現(xiàn)了uwsgi和WSGI兩種協(xié)議的Web服務(wù)器,負(fù)責(zé)響應(yīng)python 的web請求。

因?yàn)閍pache、nginx等,它們自己都沒有解析動(dòng)態(tài)語言如php的功能,而是分派給其他模塊來做,比如apache就可以說內(nèi)置了php模塊,讓人感覺好像apache就支持php一樣。

uWSGI實(shí)現(xiàn)了wsgi協(xié)議、uwsgi協(xié)議、http等協(xié)議。 Nginx中HttpUwsgiModule的作用是與uWSGI服務(wù)器進(jìn)行交換。

2.項(xiàng)目運(yùn)行流程

? ??..首先客戶端請求服務(wù)資源,

? ?..nginx作為直接對外的服務(wù)接口,接收到客戶端發(fā)送過來的http請求,會(huì)解包、分析,

???..如果是靜態(tài)文件請求就根據(jù)nginx配置的靜態(tài)文件目錄,返回請求的資源,

???..?如果是動(dòng)態(tài)的請求,nginx就通過配置文件,將請求傳遞給uWSGI;uWSGI 將接收到的包進(jìn)行處理,并轉(zhuǎn)發(fā)給? ?wsgi,

???..?wsgi根據(jù)請求調(diào)用django工程的某個(gè)文件或函數(shù),處理完后django將返回值交給wsgi,

???..?wsgi將返回值進(jìn)行打包,轉(zhuǎn)發(fā)給uWSGI,

???..?uWSGI接收后轉(zhuǎn)發(fā)給nginx,nginx最終將返回值返回給客戶端(如瀏覽器)。

3.實(shí)戰(zhàn)操作

? ? 安裝:sudo pip install uwsgi

? ? 測試uWSGI: 新建文件test.py,寫入以下內(nèi)容:

? ? ? ? def application(env, start_response):

? ? ? ? ? ? ? start_response('200 OK', [('Content-Type','text/html')])

? ? ? ? ? ? ? return "Hello World"

? ? 運(yùn)行 sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py

? ? 若瀏覽器顯示


test.py成功相應(yīng)uwsgi

? ? 在project目錄下興建一個(gè)uwsgi.ini文件

? ??????????[uwsgi]

????????????# Django-related settings

????????????socket = :8000???# Django項(xiàng)目本地端口?

????????????chdir = /www/Blog/Blog/??# 項(xiàng)目根目錄位置

????????????wsgi-file = /Blog/wsgi.py? ?# wsgi.py文件在項(xiàng)目的中的相對位置

????????????module =Blog.wsgi

????????????# master

????????????master = true???# 進(jìn)程設(shè)置,無需變動(dòng)

????????????# maximum number of worker processes

????????????processes = 4???# 啟動(dòng)4個(gè)uwsgi進(jìn)程

????????????# ... with appropriate permissions - may be needed

????????????# chmod-socket? ? = 664

????????????# clear environment on exit

????????????vacuum = true

????????????pidfile=uwsgi.pid

????????????daemonize=uwsgi.log


uwsgi.ini文件配置

Nginx配置

? ? 1.作用:

????????1. 第一級的nginx并不是必須的,uwsgi完全可以完成整個(gè)的和瀏覽器交互的流程;

????????2. 在nginx上加上安全性或其他的限制,可以達(dá)到保護(hù)程序的作用;

????????3. uWSGI本身是內(nèi)網(wǎng)接口,開啟多個(gè)work和processes可能也不夠用,而nginx可以代理多臺(tái)uWSGI完成? ? ? ? ? ? ? ? ? uWSGI的負(fù)載均衡;

????????4. django在debug=False下對靜態(tài)文件的處理能力不是很好,而用nginx來處理更加高效。

? ? 2.實(shí)戰(zhàn)配置

? ? ? ? nginx的配置文件在ubuntu中位置為 /etc/nginx/nginx.conf

? ? ? ? 而我們要寫入的服務(wù)配置在??/etc/nginx/sites-enabled/default

? ??????upstream django {

? ? ????????# 設(shè)置本地服務(wù)的端口

? ????????? server 127.0.0.1:8000; # for a web port socket (we'll use this first)

????????}

????????# configuration of the server

????????server {

? ? ????????# 監(jiān)聽主機(jī)的端口

? ? ????????listen? ? ? 80;

? ? ????????# the domain name it will serve for

? ????????? # server_name .liqian.ink; # substitute your machine's IP address or FQDN

? ????????? charset? ? utf-8;

? ? ????????# max upload size

? ? ????????client_max_body_size 75M;? # adjust to taste

? ????????? # 設(shè)置媒體文件目錄

? ? ????????# Django media

? ????????? location /media? {

? ? ? ? ????????alias /var/www/blog/media;? # your Django project's media files - amend as required

? ? ????????}

? ? ????????# 設(shè)置靜態(tài)文件目錄

? ????????? location /static {

? ? ? ????????? alias /var/www/blog/static; # your Django project's static files - amend as required

? ????????? }

? ?????????# Finally, send all non-media requests to the Django server.

? ????????? location / {

? ? ? ? ????????uwsgi_pass? django;

? ? ? ? ????????include? ? uwsgi_params; ????????# the uwsgi_params file you installed

? ????? }

????}


nginx配置文件寫入



備注

1.注意事項(xiàng)

每次修改了Django項(xiàng)目中的模板/視圖/URL/配置文件,都需要重啟uwsgi服務(wù)。

修改Nginx配置文件,都需要重啟Nginx服務(wù)。

啟動(dòng):uwsgi --ini uwsgi.ini?

停止:uwsgi --stop uwsgi.pid?

重啟:uwsgi --reload uwsgi.pid?

強(qiáng)制停止:killall -9 uwsgi?

nginx -s reload;? nginx重啟? 但自己常使用 service nginx start/restart/stop

2.文件權(quán)限處理

是ubuntu下要先創(chuàng)建關(guān)于django web project的靜態(tài)文件目錄和上傳文件目錄,要保證

修改目錄權(quán)限:sudo chmod 777 /var/www/xxxx?

創(chuàng)建static目錄,注意順序是先分配權(quán)限,再創(chuàng)建目錄:mkdir static

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容