此文純粹記錄個人在搭建此博客時候遇到的情況。
版本說明:
? ? ? ? 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
主要配置難點在于在django setting.py文件的配置蚤假、uwsgi.ini文件配置特石,nginx配置上荐糜。
setting配置
? 1.若要放在云服務器上部署宋舷。
? ? ? ALLOWED_HOSTS = [
? ? ? ? ? ? ? '{云服務器ip地址}',
? ? ? ? ? ? ? '127.0.0.1',
? ? ? ? ]
? ? ? 首先要對服務器訪問ip與web程序進行綁定才可以由云服務器的ip訪問web資源绪撵。
2.更改數(shù)據(jù)庫配置。
? ? 數(shù)據(jù)庫在云服務器中使用的是mysql祝蝠,在此建議在安裝了mysql后音诈,將云服務器上安裝的mysql配置為可遠程訪問操控,方便在遠程使用第三方工具對數(shù)據(jù)庫進行操控续膳。
? ? 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ù)據(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)文件和上傳文件是需要進行配置才會有效,要指定訪問后綴和文件目錄地址摔桦,這一切都可以在setting配置中實現(xiàn)社付。
? ? ? #設置靜態(tài)文件目錄。其中前端js邻耕、css鸥咖、kindeditor富文本、UI第三方都放在其中
? ? #此地址是指在云服務器上 最后所有的static文件夾都會集中在此目錄下? ? 運行命令為
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ā)時存放靜態(tài)文件目錄
? ? ? )
? ? ? # 設置媒體文件目錄? 與上靜態(tài)文件目錄配置說明同理
? ? ? MEDIA_URL = '/media/'
? ? ? MEDIA_ROOT ='/var/www/blog/media/'? ?
注:admin的靜態(tài)文件位置與開發(fā)時的靜態(tài)文件位置不一致兄世,所以MEDIA_ROOT來合并所有的靜態(tài)文件是很有必要的啼辣,這樣admin才會有樣式。
uwsgi 配置
1.基本知識
wsgi:一種實現(xiàn)python解析的通用接口標準/協(xié)議御滩,是一種通用的接口標準或者接口協(xié)議鸥拧,實現(xiàn)了python web程序與服務器之間交互的通用性。
利用它削解,web.py或bottle或者django等等的python web開發(fā)框架富弦,就可以輕松地部署在不同的web server上了;
uwsgi:同WSGI一樣是一種通信協(xié)議
uwsgi協(xié)議是一個uWSGI服務器自有的協(xié)議氛驮,它用于定義傳輸信息的類型腕柜,它與WSGI相比是兩樣東西。
uWSGI :一種python web server或稱為Server/Gateway
uWSGI類似tornadoweb或者flup,是一種python web server盏缤,uWSGI是實現(xiàn)了uwsgi和WSGI兩種協(xié)議的Web服務器砰蠢,負責響應python 的web請求。
因為apache唉铜、nginx等娩脾,它們自己都沒有解析動態(tài)語言如php的功能,而是分派給其他模塊來做打毛,比如apache就可以說內(nèi)置了php模塊柿赊,讓人感覺好像apache就支持php一樣。
uWSGI實現(xiàn)了wsgi協(xié)議幻枉、uwsgi協(xié)議碰声、http等協(xié)議。 Nginx中HttpUwsgiModule的作用是與uWSGI服務器進行交換熬甫。
2.項目運行流程
? ??..首先客戶端請求服務資源胰挑,
? ?..nginx作為直接對外的服務接口,接收到客戶端發(fā)送過來的http請求,會解包、分析椿肩,
???..如果是靜態(tài)文件請求就根據(jù)nginx配置的靜態(tài)文件目錄瞻颂,返回請求的資源,
???..?如果是動態(tài)的請求,nginx就通過配置文件,將請求傳遞給uWSGI郑象;uWSGI 將接收到的包進行處理贡这,并轉(zhuǎn)發(fā)給? ?wsgi,
???..?wsgi根據(jù)請求調(diào)用django工程的某個文件或函數(shù)厂榛,處理完后django將返回值交給wsgi盖矫,
???..?wsgi將返回值進行打包,轉(zhuǎn)發(fā)給uWSGI击奶,
???..?uWSGI接收后轉(zhuǎn)發(fā)給nginx,nginx最終將返回值返回給客戶端(如瀏覽器)辈双。
3.實戰(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"
? ? 運行 sudo uwsgi --http 0.0.0.0:8000 --wsgi-file test.py
? ? 若瀏覽器顯示
? ? 在project目錄下興建一個uwsgi.ini文件
? ??????????[uwsgi]
????????????# Django-related settings
????????????socket = :8000???# Django項目本地端口?
????????????chdir = /www/Blog/Blog/??# 項目根目錄位置
????????????wsgi-file = /Blog/wsgi.py? ?# wsgi.py文件在項目的中的相對位置
????????????module =Blog.wsgi
????????????# master
????????????master = true???# 進程設置柜砾,無需變動
????????????# maximum number of worker processes
????????????processes = 4???# 啟動4個uwsgi進程
????????????# ... 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完全可以完成整個的和瀏覽器交互的流程;
????????2. 在nginx上加上安全性或其他的限制痰驱,可以達到保護程序的作用证芭;
????????3. uWSGI本身是內(nèi)網(wǎng)接口,開啟多個work和processes可能也不夠用萄唇,而nginx可以代理多臺uWSGI完成? ? ? ? ? ? ? ? ? uWSGI的負載均衡檩帐;
????????4. django在debug=False下對靜態(tài)文件的處理能力不是很好,而用nginx來處理更加高效另萤。
? ? 2.實戰(zhàn)配置
? ? ? ? nginx的配置文件在ubuntu中位置為 /etc/nginx/nginx.conf
? ? ? ? 而我們要寫入的服務配置在??/etc/nginx/sites-enabled/default
? ??????upstream django {
? ? ????????# 設置本地服務的端口
? ????????? server 127.0.0.1:8000; # for a web port socket (we'll use this first)
????????}
????????# configuration of the server
????????server {
? ? ????????# 監(jiān)聽主機的端口
? ? ????????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
? ????????? # 設置媒體文件目錄
? ? ????????# Django media
? ????????? location /media? {
? ? ? ? ????????alias /var/www/blog/media;? # your Django project's media files - amend as required
? ? ????????}
? ? ????????# 設置靜態(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.注意事項
每次修改了Django項目中的模板/視圖/URL/配置文件湃密,都需要重啟uwsgi服務诅挑。
修改Nginx配置文件,都需要重啟Nginx服務泛源。
啟動:uwsgi --ini uwsgi.ini?
停止:uwsgi --stop uwsgi.pid?
重啟:uwsgi --reload uwsgi.pid?
強制停止:killall -9 uwsgi?
nginx -s reload;? nginx重啟? 但自己常使用 service nginx start/restart/stop
2.文件權限處理
是ubuntu下要先創(chuàng)建關于django web project的靜態(tài)文件目錄和上傳文件目錄拔妥,要保證
修改目錄權限:sudo chmod 777 /var/www/xxxx?
創(chuàng)建static目錄,注意順序是先分配權限达箍,再創(chuàng)建目錄:mkdir static