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

版本說明:
? ? ? ? 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
? ? 若瀏覽器顯示

? ? 在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

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
? ????? }
????}

備注
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