阿里雲centos7部署Django專案

weixin_33797791發表於2018-11-14

一、使用uwsgi服務部署專案
1.將專案所需要的模組生成安裝包檔案,並將專案壓縮和安裝包檔案都上傳到指定的伺服器目錄下,在執行專案前先執行安裝包檔案
pip freeze > pip.list(pip.txt)
pip install -r pip.list
2.在專案主目錄下建立static_file資料夾,開啟專案配置檔案進行靜態檔案的配置,編輯blog/settings.py新增配置目的是收集專案中的所有靜態檔案

在settings.py新增配置
STATIC_ROOT=’/home/damu/blog/static_file/’(目錄為實際專案中的路徑目錄)
執行收集靜態檔案命令
python manage.py collectstatic

3.修改資料庫配置連線,確定伺服器資料庫正常、資料庫登入賬戶和密碼正常

生成資料模型
python manage.py makemigrations
同步資料庫資料
python manage.py migrate

(1)第一次報錯: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包,所以我們需要把匯入的包都修改一下就可以了。
修改:

from django.urls import reverse

(2)第二次報錯:資料庫IP連線錯誤

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 113] No route to host)")

檢查:發現在django的settings檔案中沒有配置連線資料庫的ip和埠,於是在DATABASES新增這兩項內容

'HOST':'localhost',
'PORT':'3309'

(3)第三次報錯:資料庫密碼錯誤

django.db.utils.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")

檢查:發現我在資料庫密碼的位置多寫了個空格,將空格刪除後,資料庫連線正常。
4.啟動Django專案(使用python命令正常啟動專案方式)
這是在linux系統下啟動Django專案的方式

python manage.py runserver 0.0.0.0:80(0.0.0.0是允許任意主機訪問,埠必須為80,這個是因為啥,還待研究)

在windows系統下啟動方式為

python manage.py runserver 0.0.0.0:8080(這裡可以使用任意埠,如果不使用0.0.0.0就是隻允許本機訪問)

5.使用uwsgi代理啟動專案
安裝uwsgi

pip install uwsgi

配置uwsgi.ini檔案,在專案的本目錄下新建一個uwsgi.ini檔案,用來配置uwsgi檔案,新增配置如下:

# 指定uwsgi配置
[uwsgi]
# 指定部署專案之後的HTTP訪問
http=47.106.218.225:8080(使用uwsgi代理時)
# 指定專案位置
chdir=/usr/local/project/demo03/myblog/
# 指定wsgi檔案
wsgi-file=myblog/wsgi.py
# 指定啟動程式數量processes/workers
processes=4
# 指定啟動執行緒數量
threads=2
# 指定啟動主程式管理
master=true
# 指定存放程式編號的id檔案
pidfile=uwsgi.pid
# 指定程式停止時清楚垃圾資料
vacuum=true
# 指定啟用日誌記錄(這裡已經指定了輸出的日誌存放位置)
daemonize=uwsgi.log
# 指定靜態檔案對映
static-map=/static=static_file(使用uwsgi代理時)

uwsgi啟動專案

uwsgi --ini uwsgi.ini       啟動專案
uwsgi --stop uwsgi.pid      停止專案
uwsgi --reload uwsgi.pid    重啟專案

這裡使用uwsgi啟動專案的方式我還沒有完成整明白,還有待研究

二、使用uwsgi+nginx部署專案
使用uwsgi+nginx部署專案從上傳專案到伺服器、收集靜態檔案、連線資料庫配置都是和uwsgi啟動專案是相同的,但後面的配置uwsgi.ini檔案和nginx.conf檔案略微有些不同
1.配置uwsgi.ini檔案(還是之前uwsgi代理的那個uwsgi.ini檔案)

# 指定uwsgi配置
[uwsgi]
# 指定部署專案之後的HTTP訪問
socket = 127.0.0.1:8080(使用uwsgi+nginx代理,和nginx.conf埠一致)
#http=47.106.218.225:8080(使用uwsgi代理時)
# 指定專案位置
chdir=/usr/local/project/demo03/myblog/
# 指定wsgi檔案
wsgi-file=myblog/wsgi.py
# 指定啟動程式數量processes/workers
processes=4
# 指定啟動執行緒數量
threads=2
# 指定啟動主程式管理
master=true
# 指定存放程式編號的id檔案
pidfile=uwsgi.pid
# 指定程式停止時清楚垃圾資料
vacuum=true
# 指定啟用日誌記錄(這裡已經指定了輸出的日誌存放位置)
daemonize=uwsgi.log
# 指定靜態檔案對映
#static-map=/static=static_file(使用uwsgi代理時)

2.安裝nginx

pip install nginx

nginx的其他操作命令

nginx [options]
-v   檢視nginx版本
-V   檢視nginx版本及配置資訊
-t   測試伺服器是否可以正常執行
-T   測試配置選項執行伺服器
-c   指定配置檔案啟動伺服器
-s   傳送一個選項訊號執行操作
nginx   啟動伺服器
nginx –s stop     停止伺服器;不論是否有資料未完成,直接退出
nginx –s quit     停止伺服器;如果資料處理未完成,等待完成退出
nginx –s reload   重新載入
nginx –s reopen   重啟

3.配置nginx.conf檔案(/etc/nginx/nginx.conf)

http {
..
server {    # 配置一個虛擬伺服器
 listen 80; # 服務監聽埠
    server_name 192.168.1.100;# 配置監聽服務(個人伺服器IP)

    location / {  # 配置請求反向代理
        include uwsgi_params; # 指定代理資料型別
        uwsgi_pass 127.0.0.1:8080; # 指定代理IP和埠
    }
    location /static { # 配置靜態檔案伺服器
        alias /home/damu/blog/static_file;(專案靜態檔案絕對路徑)
    }
}
..
}
注:這裡我使用了8080埠才管用,其他的埠都不行,我想會不會是因為Django的預設埠是8080,所以只能用這個8080埠?

4.配置檔案之後,重新載入nginx配置資訊

nginx -s reload
注意:在執行此命令之前先保證nginx服務是否已經啟動,之前我在執行重新載入nginx配置資訊的時候提示沒有找到id,我很是懵逼啊,然後去網上查詢了半天,
才發現原來是我的nginx服務根本沒有啟動,所以才導致的,簡直是把我氣得快吐血了...

5.使用uwsgi+nginx啟動服務

uwsgi --ini uwsgi.ini
tailf uwsgi.log # 檢視日誌
ps -ef|grep uwsgi # 檢視uwsgi程式

6.輸入伺服器IP,訪問成功,OK!

三、在網上看到的配置資料庫報錯,不知道能不能用上:

11559984-1e3edca4698597ab.png
image.png

四、windows環境下配置Django專案報錯總結
1.報錯資訊為:型別錯誤,型別'Author'的物件不是JSON可序列化的
11559984-a5078b20364e10f1.png
image.png

解決過程:這個問題我首先從檢視處理函式的返回值開始查起來,首先是確定檢視函式的返回值是否正常;然後我在網頁檢視中檢視檢視form表單提交的資料型別是否正確;檢查這些是有些小問題的,但是並不是主要的問題。然後我又去百度上檢視到底是哪出了問題,結果真的被我找到了。
相關問題網址:https://www.cnblogs.com/ljwbook/p/4957841.html
問題:我在寫作者模組時用到了session,需要序列化一個物件例項,直接使用request.session['login_user'] = author這樣的方式會報無法序列化的錯誤。
解決:從Django1.6開始session裡面的資料都是用json來序列的,json的session只能接受簡單的資料結構,如str,list,dict。一種方法是先把cart的資料放在一個dict裡面再存到session或者可以換一個SessionSerializer。另外一種方法是還提供一個pickle來序列,可以存放任何一個資料機構。
在settings.py中加入

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

問題解決!

相關文章