一氯檐、使用uwsgi服務(wù)部署項(xiàng)目
1.將項(xiàng)目所需要的模塊生成安裝包文件,并將項(xiàng)目壓縮和安裝包文件都上傳到指定的服務(wù)器目錄下寂玲,在運(yùn)行項(xiàng)目前先執(zhí)行安裝包文件
pip freeze > pip.list(pip.txt)
pip install -r pip.list
2.在項(xiàng)目主目錄下創(chuàng)建static_file文件夾塔插,打開項(xiàng)目配置文件進(jìn)行靜態(tài)文件的配置,編輯blog/settings.py添加配置目的是收集項(xiàng)目中的所有靜態(tài)文件
在settings.py添加配置
STATIC_ROOT=’/home/damu/blog/static_file/’(目錄為實(shí)際項(xiàng)目中的路徑目錄)
執(zhí)行收集靜態(tài)文件命令
python manage.py collectstatic
3.修改數(shù)據(jù)庫配置連接拓哟,確定服務(wù)器數(shù)據(jù)庫正常想许、數(shù)據(jù)庫登錄賬戶和密碼正常
生成數(shù)據(jù)模型
python manage.py makemigrations
同步數(shù)據(jù)庫數(shù)據(jù)
python manage.py migrate
(1)第一次報(bào)錯:ModuleNotFoundError: No module named 'django.core.urlresolvers'
File "/usr/local/project/demo03/myblog/author/views.py", line 2, in <module>
from django.core.urlresolvers import reverse
ModuleNotFoundError: No module named 'django.core.urlresolvers'
檢查得知:django2.0 把原來的 django.core.urlresolvers 包 更改為了 django.urls包,所以我們需要把導(dǎo)入的包都修改一下就可以了彰檬。
修改:
from django.urls import reverse
(2)第二次報(bào)錯:數(shù)據(jù)庫IP連接錯誤
django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 113] No route to host)")
檢查:發(fā)現(xiàn)在django的settings文件中沒有配置連接數(shù)據(jù)庫的ip和端口伸刃,于是在DATABASES添加這兩項(xiàng)內(nèi)容
'HOST':'localhost',
'PORT':'3309'
(3)第三次報(bào)錯:數(shù)據(jù)庫密碼錯誤
django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")
檢查:發(fā)現(xiàn)我在數(shù)據(jù)庫密碼的位置多寫了個空格,將空格刪除后逢倍,數(shù)據(jù)庫連接正常捧颅。
4.啟動Django項(xiàng)目(使用python命令正常啟動項(xiàng)目方式)
這是在linux系統(tǒng)下啟動Django項(xiàng)目的方式
python manage.py runserver 0.0.0.0:80(0.0.0.0是允許任意主機(jī)訪問,端口必須為80较雕,據(jù)我推測碉哑,在沒有配置nginx代理的時(shí)候,只能是80端口對外開發(fā)作為外部訪問端口亮蒋,同時(shí)服務(wù)器默認(rèn)配置就會監(jiān)聽80端口)
在windows系統(tǒng)下啟動方式為
python manage.py runserver 0.0.0.0:8080(這里可以使用任意端口扣典,如果不使用0.0.0.0就是只允許本機(jī)訪問)
5.使用uwsgi代理啟動項(xiàng)目
安裝uwsgi
pip install uwsgi
配置uwsgi.ini文件,在項(xiàng)目的本目錄下新建一個uwsgi.ini文件,用來配置uwsgi文件慎玖,添加配置如下:
# 指定uwsgi配置
[uwsgi]
# 指定部署項(xiàng)目之后的HTTP訪問
http=47.106.218.225:8080(使用uwsgi代理時(shí))
# 指定項(xiàng)目位置
chdir=/usr/local/project/demo03/myblog/
# 指定wsgi文件
wsgi-file=myblog/wsgi.py
# 指定啟動進(jìn)程數(shù)量processes/workers
processes=4
# 指定啟動線程數(shù)量
threads=2
# 指定啟動主進(jìn)程管理
master=true
# 指定存放進(jìn)程編號的id文件
pidfile=uwsgi.pid
# 指定進(jìn)程停止時(shí)清楚垃圾數(shù)據(jù)
vacuum=true
# 指定啟用日志記錄(這里已經(jīng)指定了輸出的日志存放位置)
daemonize=uwsgi.log
# 指定靜態(tài)文件映射
static-map=/static=static_file(使用uwsgi代理時(shí))
uwsgi啟動項(xiàng)目
uwsgi --ini uwsgi.ini 啟動項(xiàng)目
uwsgi --stop uwsgi.pid 停止項(xiàng)目
uwsgi --reload uwsgi.pid 重啟項(xiàng)目
這里使用uwsgi啟動項(xiàng)目的方式我還沒有完成整明白贮尖,還有待研究
二、使用uwsgi+nginx部署項(xiàng)目
使用uwsgi+nginx部署項(xiàng)目從上傳項(xiàng)目到服務(wù)器趁怔、收集靜態(tài)文件湿硝、連接數(shù)據(jù)庫配置都是和uwsgi啟動項(xiàng)目是相同的薪前,但后面的配置uwsgi.ini文件和nginx.conf文件略微有些不同
1.配置uwsgi.ini文件(還是之前uwsgi代理的那個uwsgi.ini文件)
# 指定uwsgi配置
[uwsgi]
# 指定部署項(xiàng)目之后的HTTP訪問
socket = 127.0.0.1:8080(使用uwsgi+nginx代理,和nginx.conf端口一致)
#http=47.106.218.225:8080(使用uwsgi代理時(shí))
# 指定項(xiàng)目位置
chdir=/usr/local/project/demo03/myblog/
# 指定wsgi文件
wsgi-file=myblog/wsgi.py
# 指定啟動進(jìn)程數(shù)量processes/workers
processes=4
# 指定啟動線程數(shù)量
threads=2
# 指定啟動主進(jìn)程管理
master=true
# 指定存放進(jìn)程編號的id文件
pidfile=uwsgi.pid
# 指定進(jìn)程停止時(shí)清楚垃圾數(shù)據(jù)
vacuum=true
# 指定啟用日志記錄(這里已經(jīng)指定了輸出的日志存放位置)
daemonize=uwsgi.log
# 指定靜態(tài)文件映射
#static-map=/static=static_file(使用uwsgi代理時(shí))
2.安裝nginx
pip install nginx -y
nginx的其他操作命令
nginx [options]
-v 查看nginx版本
-V 查看nginx版本及配置信息
-t 測試服務(wù)器是否可以正常運(yùn)行
-T 測試配置選項(xiàng)運(yùn)行服務(wù)器
-c 指定配置文件啟動服務(wù)器
-s 發(fā)送一個選項(xiàng)信號執(zhí)行操作
nginx 啟動服務(wù)器
nginx –s stop 停止服務(wù)器关斜;不論是否有數(shù)據(jù)未完成示括,直接退出
nginx –s quit 停止服務(wù)器;如果數(shù)據(jù)處理未完成痢畜,等待完成退出
nginx –s reload 重新加載
nginx –s reopen 重啟
3.配置nginx.conf文件(/etc/nginx/nginx.conf)
http {
..
server { # 配置一個虛擬服務(wù)器
listen 80; # 服務(wù)監(jiān)聽端口
server_name 192.168.1.100;# 配置監(jiān)聽服務(wù)(個人服務(wù)器IP)
location / { # 配置請求反向代理
include uwsgi_params; # 指定代理數(shù)據(jù)類型
uwsgi_pass 127.0.0.1:8080; # 指定代理IP和端口
}
location /static { # 配置靜態(tài)文件服務(wù)器
alias /home/damu/blog/static_file;(項(xiàng)目靜態(tài)文件絕對路徑)
}
}
..
}
注:這里我使用了8080端口才管用垛膝,其他的端口都不行,我想會不會是因?yàn)镈jango的默認(rèn)端口是8080丁稀,所以只能用這個8080端口吼拥?
4.配置文件之后,重新加載nginx配置信息
nginx -s reload
注意:在執(zhí)行此命令之前先保證nginx服務(wù)是否已經(jīng)啟動二驰,之前我在執(zhí)行重新加載nginx配置信息的時(shí)候提示沒有找到id扔罪,我很是懵逼啊,然后去網(wǎng)上查找了半天桶雀,
才發(fā)現(xiàn)原來是我的nginx服務(wù)根本沒有啟動矿酵,所以才導(dǎo)致的,簡直是把我氣得快吐血了...
5.使用uwsgi+nginx啟動服務(wù)
uwsgi --ini uwsgi.ini
tailf uwsgi.log # 查看日志
ps -ef|grep uwsgi # 查看uwsgi進(jìn)程
6.輸入服務(wù)器IP矗积,訪問成功全肮,OK!
三棘捣、在網(wǎng)上看到的配置數(shù)據(jù)庫報(bào)錯辜腺,不知道能不能用上:
四、windows環(huán)境下配置Django項(xiàng)目報(bào)錯總結(jié)
1.報(bào)錯信息為:類型錯誤乍恐,類型'Author'的對象不是JSON可序列化的
解決過程:這個問題我首先從視圖處理函數(shù)的返回值開始查起來评疗,首先是確定視圖函數(shù)的返回值是否正常;然后我在網(wǎng)頁視圖中查看視圖form表單提交的數(shù)據(jù)類型是否正確茵烈;檢查這些是有些小問題的百匆,但是并不是主要的問題。然后我又去百度上查看到底是哪出了問題呜投,結(jié)果真的被我找到了加匈。
相關(guān)問題網(wǎng)址:https://www.cnblogs.com/ljwbook/p/4957841.html
問題:我在寫作者模塊時(shí)用到了session,需要序列化一個對象實(shí)例仑荐,直接使用request.session['login_user'] = author這樣的方式會報(bào)無法序列化的錯誤雕拼。
解決:從Django1.6開始session里面的數(shù)據(jù)都是用json來序列的,json的session只能接受簡單的數(shù)據(jù)結(jié)構(gòu)粘招,如str啥寇,list,dict。一種方法是先把cart的數(shù)據(jù)放在一個dict里面再存到session或者可以換一個SessionSerializer示姿。另外一種方法是還提供一個pickle來序列甜橱,可以存放任何一個數(shù)據(jù)機(jī)構(gòu)。
在settings.py中加入
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
問題解決栈戳!