CentOS-7 部署Django----部署Django步驟
CentOS-7 部署Django----部署Django步驟
前言:
網上找了好些資料進行學習怎麽樣部署Django,折騰了幾天,頭昏腦脹,始終沒有成功;
偶然在Youtube上看到了2016年10月29日發布的一個視頻,順著該作者的步驟做下來,就成功的部署了,在此非常感謝!
視頻鏈接:https://www.youtube.com/watch?v=DzXCHAuHf0I;
因為記錄是順著視頻作者的操作順序,中間會有報錯問題和解決,並且每一步操作都寫了,所以有點啰嗦;
一、環境:
默認目前CentOS-7服務器已經安裝好了Python3,項目所需的數據庫及其他,沒有安裝的可以看前面已發布的安裝方法;
二、創建虛擬環境:
管理Django項目,可以創建一個虛擬環境,與其他代碼分隔開來;
將虛擬環境創建在 /opt 目錄下:
# cd /opt
# mkdir python3-virtual-env
# cd python3-virtual-env
# python3.6 -m venv shop # 創建Python3.6的虛擬環境,並將虛擬環境目錄命名為shop;
# source shop/bin/activate # 進入虛擬環境;
# pip install uwsgi # 在虛擬環境下安裝uwsgi;
# pip install -r requirements.txt # 批量安裝項目依賴的庫,txt文件可使用 pip install > requirements.txt 得到,再上傳到服務器使用;
# deactivate # 退出虛擬環境命令;
三、安裝Nginx:
此時,退出虛擬環境,開始安裝Nginx,視頻中使用的源為yum的repolist,我看了下,截至2018-07-23,其中的Nginx版本為1.12版本;
我按照前面發布的安裝方法,安裝了Nginx-1.14,也是截至2018-07-23的穩定版的最高版號;
四、設置Nginx:
# cd /etc/nginx
# vim nginx.conf # 這一步是進去註釋掉其中的server參數內容,但在1.14版本中不存在,而1.12版本中有;
# cd /conf.d
# vim virtual.conf # 創建新文件,並且寫入以下內容
1 server {
2 listen 80;
3 server_name 152.95.22.30; # 你的服務器IP地址,或者域名,示例中我胡寫的
4 error_log /srv/site/shopping_mail/logs/error.log; # django項目的error日誌路徑
5 access_log /srv/site/shopping_mail/logs/access.log; # django項目的access日誌路徑
6 charset utf-8;
7
8 location /static/ {
9 alias /srv/site/shopping_mail/static/; # django項目的靜態資源路徑
10 }
11
12 location /media/ {
13 alias /srv/site/shopping_mail/media/; # django項目的media路徑
14 }
15
16 location / {
17 uwsgi_pass unix:/opt/uwsgi/sock/shopping_mail.sock; # django 項目經過的??路徑。。。這裏有點沒搞懂
18 include uwsgi_params;
19 }
20 }
五、上傳Django項目代碼:
根據上面配置的nginx中的參數,將django項目代碼放置在 /etc/site 目錄下
# cd /etc
# mkdir site
# cd site
# cd shopping_mail # 此時已經使用WinSCP上傳了項目,進入項目根目錄
# mkdir logs # 下面四步,按照配置的nginx參數來做的,創建logs
# cd logs
# vim error.log
# vim access.log
# cd /etc/site # 在site目錄下,進行授權
# chown nginx:nginx -R shopping_mail/
# systemctl start nginx # 開啟nginx服務,瀏覽器訪問服務器IP,得到502頁面
# systemctl stop nginx # 關閉nginx服務
六、配置uwsgi相關:
1、切換到 /etc 目錄下,創建uwsgi目錄,在uwsgi目錄下,創建emperor.ini文件:
# cd /etc
# mkdir uwsgi
# cd uwsgi
# vim emperor.ini
寫入:
1 [uwsgi]
2 emperor = /etc/uwsgi/vassals
3 uid = uwsgi
4 pid = uwsgi
5 logto = /etc/uwsgi/log #設置uwsgi的日誌文件
2、根據上面配置的參數,在uwsgi目錄下,創建vassals目錄;
在vassals目錄下,創建shopping_mail.ini文件;
# mkdir vassals
# cd vassals
# vim shopping_mail.ini
寫入:
1 http = :8000
2 socket = /opt/uwsgi/sock/shopping_mail.sock
3 chdir = /srv/site/shopping_mail # 指明項目地址
4 pythonpath = /srv/site/shopping_mail/shopping_mail # 指明項目
5 home = /opt/python3-virtual-env/shop # 指明項目的虛擬環境地址
6 module = shopping_mail.wsgi # 指明uwsgi使用項目的wsgi文件
7 uid = uwsgi
8 chmod-socket = 664
9 chown-socket = uwsgi
3、進入 /etc/systemd/system 目錄下,創建uwsgi.server文件:
# cd /etc/systemd/system
# vim uwsgi.server
寫入:
1 [Unit]
2 Descroption=uWSGI Emperor
3 After=syslog.target
4
5 [Service]
6 ExecStart=/opt/python3-virtual-env/shop/bin/uwsgi --ini /etc/uwsgi/emperor.ini # 開啟服務執行的命令
7 ExecStop = kill -INT ‘cat /run/uwsgi.pid‘
8 ExecReload = kill -TERM ‘cat /run/uwsgi.pid‘
9 Restart = always
10 Type = notify
11 NotifyAccess = main
12 PIDFile = /run/uwsgi.pid
13
14 [Install]
15 WantedBy=multi-user.target
保存後,啟動uwsgi服務:
# systemctl start uwsgi
但是失敗了,查看uwsgi的日誌,
# vim /etc/uwsgi/log
解決方法:
# useradd -s /bin/false -r uwsgi
然後根據之前配置的nginx的最後一個location參數,在/opt目錄下創建sock目錄,並且做授權
# mkdir sock
# chown uwsgi:uwsgi sock/
在開啟uwsgi服務,開啟成功
註:此處雖然開啟成功,但是其實這一步是錯誤的,按照nginx的最後一個location參數;
應該在/opt下創建uwsgi目錄,uwsgi目錄下再創建sock目錄,並授權;
4、此時,瀏覽器刷新,還是失敗的502頁面
進入項目下的logs目錄,查看error.log
# vim error.log
此處就是上面紅色標註說的,創建錯誤了
解決方法:
# cd /opt
# rm -rf sock/
# mkdir uwsgi
# cd uwsgi
# mkdir sock
# cd opt
# chown uwsgi:uwsgi -R uwsgi/
重啟uwsgi和nginx服務,發現網頁刷新還是502頁面
5、因為報錯,所以進入虛擬環境,直接使用uwsgi命令進行開啟uwsgi服務:
# source /opt/python3-virtual-env/shop/bin/activate
# cd /opt/python3-virtual-env/shop/bin
# uwsgi --ini /etc/uwsgi/vassals/shipping_mail.ini
出現錯誤:
地址被占了,這是因為uwsgi服務已經在運行了,再操作uwsgi命令開啟服務,就被占了,要先關掉
使用 # ps -Ac | grep uwsgi 可以看到uwsgi服務占用的端口:
關閉uwsgi服務:
# systemctl stop uwsgi
# uwsgi --ini /etc/uwsgi/vassals/shipping_mail.ini
uwsgi開啟正常,刷新瀏覽器,但是還是502頁面
繼續查看error.log日誌
切換到 /opt/uwsgi/sock 目錄下,查看詳細信息:
# cd /opt/uwsgi/sock
# ls -l
可以看到shopping_mail.sock文件的所屬組是root,此地應該是nginx的!
先修改sock的文件屬性:
# chown -R uwsgi:nginx sock/
# cd sock
# chown uwsgi:nginx shopping_mail.sock
# systemctl restart uwsgi
刷新瀏覽器,會看到你的Django首頁了。此時部署成功!
但是經過實際操作,會出現一個麻煩:
在每次重啟服務器,或者重啟uwsgi服務後,shopping_mail.sock文件的所屬組就變成了root了。需要重新修改,略麻煩。等有解決方法更新
CentOS-7 部署Django----部署Django步驟