(歡迎訪問(wèn)我的博客: yicheng's site)(目前采用hugo,django是上個(gè)版本的反感)
Django項(xiàng)目寫好了,最后一步就是部署(deployment)了,部署十分關(guān)鍵消请,只有部署在服務(wù)器上,別人才能從互聯(lián)網(wǎng)上通過(guò)ip地址或域名直接訪問(wèn)到你的網(wǎng)頁(yè)类腮。
第一步是購(gòu)買vps(Virtual Private Server 虛擬服務(wù)器)臊泰,這個(gè)很簡(jiǎn)單而且網(wǎng)上教程一大把,這里就不詳述蚜枢,我在vultr購(gòu)買的海外服務(wù)器缸逃,這樣不用浪費(fèi)時(shí)間去備案了,vultr的一大特色就是按時(shí)長(zhǎng)收費(fèi)厂抽,如果你的vps出了什么問(wèn)題需频,可以隨時(shí)關(guān)停,并且它還支持微信支付寶筷凤,價(jià)格也很便宜昭殉。(vultr官網(wǎng):https://vultr.com)
Django的本地預(yù)覽十分方便,一行python manage.py runserver
就能搞定藐守,但部署上線可沒(méi)有這么簡(jiǎn)單挪丢。因?yàn)榫W(wǎng)上關(guān)于Django部署的教程都很雜亂,當(dāng)時(shí)部署的時(shí)候就踩了很多很多坑卢厂,為了給之后一個(gè)參考乾蓬,我又重新部署了一次,來(lái)記錄詳細(xì)的過(guò)程慎恒。
相關(guān)軟件版本:
Django 2.1.3
Python 3.6.6
nginx 1.14.0
uwsgi 2.0.17.1
服務(wù)器:
Ubuntu-server 18.04
準(zhǔn)備工作
首先打開ssh軟件任内,Xshell、Putty什么的都行融柬,通過(guò)vultr上vps詳情頁(yè)上給的ip和root密碼連接到這臺(tái)vps死嗦。
剛拿到的船新Linux,第一步先給它來(lái)個(gè)更新:
sudo apt-get update
sudo apt-get upgrade
建議使用非root用戶粒氧,部署時(shí)最好使用python虛擬環(huán)境越走,具體操作不是本文的重點(diǎn),便不贅述了
系統(tǒng)自帶Python3.6、vim和git廊敌,所以不用裝
安裝python3-pip铜跑、python3-setuptools、gcc骡澈、python3-dev锅纺、wheel:
(缺一不可,不然之后用pip安裝uwsgi會(huì)有各種各樣的報(bào)錯(cuò))
sudo apt-get install python3-pip python-setuptools python3-dev wheel
放置Django項(xiàng)目
直接在服務(wù)器端用vim什么的寫Django當(dāng)然可壤吲埂(雖然會(huì)很酸爽)囤锉,但更多的時(shí)候我們是在本地寫好了Django項(xiàng)目,要把它挪到服務(wù)器上护锤。
在傳輸之前官地,要做一些工作:
先更改一下setting.py
里的ALLOWED_HOSTS
,把服務(wù)器的ip加進(jìn)去烙懦,有域名的話順便把域名也加進(jìn)去驱入,要不然之后會(huì)無(wú)法加載Django項(xiàng)目
在本地的Python虛擬環(huán)境上使用pip freeze > requirements.txt
,生成一個(gè)txt文件,里面是需要的Python庫(kù)以及其版本氯析,之后一并傳給服務(wù)器
傳輸文件到服務(wù)器的方法非常之多:可以使用Xshell自帶的文件傳輸亏较,也可以使用linux命令scp或安裝更直觀的lrzsz,或者使用本地的FileZilla掩缓、Winscp等軟件雪情,當(dāng)然萬(wàn)能的git也很不錯(cuò)。
不過(guò)考慮到之后這個(gè)web項(xiàng)目之后也要修改你辣,用上面的方法感覺都不是特別方便巡通,介紹一個(gè)非常好用的方法,那就是使用Pycharm自帶的deployment功能舍哄,可以實(shí)現(xiàn)實(shí)時(shí)上傳以及下載文件宴凉,很是方便。
在Tools
->Deployment
->Configuration
中配置好與自己服務(wù)器的連接蠢熄,IP地址跪解、用戶名炉旷、密碼以及對(duì)應(yīng)項(xiàng)目路徑
在Settings
->Project Interpreter
里把項(xiàng)目解釋器更改為服務(wù)器里的Python签孔,mappings里填寫兩邊項(xiàng)目的目錄,再加一條manage.py
的映射
apply之后Pycharm右下角會(huì)出現(xiàn)上傳進(jìn)度條窘行,會(huì)有點(diǎn)慢饥追,喝杯茶等一段時(shí)間即可
傳輸完畢后會(huì)發(fā)現(xiàn)本地的項(xiàng)目已經(jīng)全部上傳到服務(wù)器了
但這個(gè)畢竟不是這篇文章的重點(diǎn),不重點(diǎn)介紹罐盔,遇到了什么問(wèn)題可以留言或者私信我但绕。
最后別忘了把requirements.txt
上傳到服務(wù)器,用pycharm的話只要直接把文件拖進(jìn)本地項(xiàng)目目錄,Pycharm就會(huì)自動(dòng)幫我們上傳到服務(wù)器捏顺。
在服務(wù)器上使用pip install -r requirements.txt
來(lái)安裝必要的Python packages
安裝與配置uwsgi
使用pip3安裝uwsgi(注意是pip安裝六孵,不是apt-get,否則之后會(huì)各種報(bào)錯(cuò))
pip3 install uwsgi
下面來(lái)試一下uwsgi是否好使:
找個(gè)位置新建一個(gè)py文件幅骄,就叫uwsgi_test.py
好了劫窒,然后用vim打開
touch uwsgi_test.py
vim uwsgi_test.py
寫入以下內(nèi)容:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello Uwsgi"]
wq保存退出(vim的基本操作不贅述,網(wǎng)上教程一大把)
然后輸入以下命令啟動(dòng)uwsgi拆座,把這個(gè)部署到某個(gè)端口主巍,以9090端口為例
uwsgi --http :9090 --wsgi-file uwsgi_test.py
這時(shí)會(huì)出現(xiàn)spawned uWSGI worker 1 (and the only) (pid: 11812, cores: 1)
找個(gè)瀏覽器,訪問(wèn)http://<你的服務(wù)器ip>:9090/
挪凑,不出意外的話你會(huì)看到Hello Uwsgi的字樣孕索,說(shuō)明uwsgi能正常運(yùn)行。
在項(xiàng)目目錄下新建uwsgi.ini
文件并編輯加入以下內(nèi)容:
[uwsgi]
# 直接訪問(wèn)uwsgi的端口號(hào)躏碳,繞過(guò)nginx
http = :8010
# 轉(zhuǎn)發(fā)給nginx的端口號(hào)
socket = 127.0.0.1:8001
# 是否使用主線程
master = true
# 項(xiàng)目的絕對(duì)路徑
chdir = /var/www/<PROJECT_NAME>/
# Django項(xiàng)目wsgi.py文件的相對(duì)路徑
wsgi-file = <PROJECT_NAME>/wsgi.py
# 進(jìn)程數(shù)
processes = 4
# 每個(gè)進(jìn)程的線程數(shù)
threads = 2
# 監(jiān)聽端口
stats = 127.0.0.1:9191
# 每次退出時(shí)是否清理環(huán)境配置
vacuum = true
# 目錄中一旦有文件被改動(dòng)就自動(dòng)重啟
touch-reload = /var/www/my_site
# 存放日志
daemonize = /var/www/my_site/uWSGI.log
加入uwsgi.ini的目的是使讓uwsgi對(duì)接Django項(xiàng)目的啟動(dòng)變得更簡(jiǎn)便搞旭,否則就得在終端敲很長(zhǎng)的代碼
有了uwsgi.ini
我們只需要輸入uwsgi --ini uwsgi.ini
就可以運(yùn)行,瀏覽器輸入ip地址加:8010端口(先繞過(guò)nginx因?yàn)檫€沒(méi)配置呢)唐断,發(fā)現(xiàn)可以顯示我們的項(xiàng)目了选脊,這時(shí)css等靜態(tài)文件可能沒(méi)獲取到,別急
安裝和配置nginx
先sudo apt-get install nginx
安裝nginx脸甘,安裝后nginx會(huì)自動(dòng)啟動(dòng)恳啥,默認(rèn)端口為80端口,瀏覽器輸入ip地址加:80丹诀,可以看到"Welcome to nginx"的歡迎界面
把/etc/nginx/目錄下的uwsgi_params
復(fù)制到項(xiàng)目目錄下钝的,也可以直接項(xiàng)目目錄下新建uwsgi_params
文件,寫入以下內(nèi)容:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
前往/etc/nginx/目錄铆遭,查看nginx.conf
(nginx基礎(chǔ)配置)硝桩,發(fā)現(xiàn)里面有這么兩行,意思就是包含conf.d文件夾中所有以conf后綴的配置和site-enabled文件夾中的內(nèi)容
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
我們不更改nginx.conf基礎(chǔ)配置枚荣,只需要修改conf.d
目錄下的conf文件即可碗脊,進(jìn)入conf.d
文件夾,修改default.conf
文件橄妆,沒(méi)有的話就新建一個(gè)
然后寫入以下內(nèi)容:(務(wù)必根據(jù)自己的情況做相應(yīng)更改)
upstream django {
server 127.0.0.1:8001;
}
server {
# 監(jiān)聽端口衙伶,可改
listen 80;
# 修改為你的ip或者域名
server_name 1.2.3.4;
# 編碼方式
charset utf-8;
# 日志記錄,可選
access_log /var/www/<PROJECT_NAME>/nginx_access.log;
error_log /var/www/<PROJECT_NAME>/nginx_error.log;
# 靜態(tài)文件所在目錄(自行修改)
location /static {
alias /var/www/my_site/blog/static;
}
# 媒體文件所在目錄(自行修改)
#location /media {
# alias /home/www/djangotest/Hello/media; # 媒體文件所在文件夾
#}
location / {
include /var/www/<PROJECT_NAME>/uwsgi_params;
uwsgi_pass django;
}
}
運(yùn)行service nginx restart
如果報(bào)錯(cuò)nginx.service failed because the control process exited with error code
害碾,那么運(yùn)行一下nginx -t -c /etc/nginx/nginx.conf
矢劲,可以很容易的找到問(wèn)題在哪。
瀏覽器輸入ip地址慌随,發(fā)現(xiàn)看到的還是"Welcome to nginx"芬沉,這個(gè)是因?yàn)樵?code>nginx.conf中還include了一個(gè)sites-enabled/*
躺同,它覆蓋了我們?cè)?code>default.conf中的配置,可以干脆直接去nginx.conf
里把include /etc/nginx/sites-enabled/*;
這一行刪掉丸逸,或者調(diào)換兩行位置蹋艺。
這時(shí)再訪問(wèn)我們的ip,就能看到自己在本地搭建的Django項(xiàng)目了黄刚,因?yàn)樵谂渲胣ginx的時(shí)候?qū)懭肓藄tatic的路徑车海,所以css什么的都加載進(jìn)來(lái)了。
至此nginx配置完畢
后續(xù)工作
服務(wù)器上的Django還沒(méi)有執(zhí)行數(shù)據(jù)庫(kù)遷移與管理員創(chuàng)建隘击,所以記得執(zhí)行
python manage.py makemigrations
python manage.py migrate
以及
python manage.py createsuperuser
每次有更新時(shí)都要重載uwsgi與nginx才能生效侍芝,為了方便uwsgi的重載,在項(xiàng)目目錄下新建一個(gè)uwsgi
文件夾埋同,然后在里面新建兩個(gè)文件:uwsgi.pid
(用于重載停止等操作)和uwsgi.status
(用于查看狀態(tài))
修改uwsgi.ini
州叠,把原先的stats那行刪掉,下面加上這兩行:
stats=%(chdir)/uwsgi/uwsgi.status
pidfile=%(chdir)/uwsgi/uwsgi.pid
這樣如果項(xiàng)目有更新凶赁,就可以使用這兩個(gè)命令來(lái)分別重載uwsgi和nginx了
uwsgi --reload uwsgi/uwsgi.pid
systemctl reload nginx.service
至此我們的Django項(xiàng)目就部署完成了