2017年12月4日教程更新能犯,請移步至最終版本:Django快速部署簡約版 v3.0
不推薦閱讀以下文章!
一、環(huán)境介紹
- 服務器:Ubuntu 16.04 for 阿里云
- 數(shù)據(jù)庫:MySQL 5.7.17
- Python 3.6.0 + Django 1.10.6
二站削、準備工作
1.更新系統(tǒng):
sudo apt-get update
sudo apt-get upgrade
提示:安裝時出現(xiàn)的選擇項按自己實際情況選擇,這里不做過多闡述孵稽,實在看不懂许起,自行谷歌翻譯十偶。
2.安裝SSH(Git默認安裝了):
sudo apt-get install ssh
提示:本人的項目是通過FileZilla Client直接上傳的。
有興趣的可以看看教程:FTP使用教程之Filezilla使用教程
3.命令行查看自己的公網(wǎng)IP地址:
ifconfig
提示:得到網(wǎng)卡信息园细,這里的IP為192.168.0.154扯键,得到IP后,可以使用Filezilla連接服務器上傳文件珊肃。這里先擱置不用管荣刑。
三、安裝MySQL:
1.安裝命令:
sudo apt-get install mysql-server
提示:安裝過程中會提示讓你設置MySQL密碼 伦乔,輸入兩次密碼厉亏,回車即可,然后等待安裝完成
2.查看MySQL版本:
mysql --version
提示:輸出結果為:5.7.17烈和,事實上Mysql 5.7.6或更高版本爱只,數(shù)據(jù)目錄將自動初始化,這一點大部分教程都沒有提及招刹。所以這里我們不用初始化恬试。
3.運行數(shù)據(jù)庫Mysql安全配置向導:
sudo mysql_secure_installation
提示:輸入Mysql密碼
提示:是否設置驗證密碼,輸入 n
提示:是否修改Mysql密碼训柴,輸入 n
提示:是否移除匿名用戶妇拯,輸入y
提示:是否允許遠程登陸幻馁,如果選n的話,只能在本機訪問數(shù)據(jù)庫越锈,根據(jù)情況來仗嗦,本人數(shù)據(jù)庫和項目都在一個服務器上,為了安全考慮甘凭,這里我設置關閉稀拐,輸入n
提示:是否移除test數(shù)據(jù)庫丹弱,輸入y
提示:是否重新加載權限表,輸入y
注意:如果出現(xiàn)這種錯誤:
[error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)']
它表明你的Mysql服務砰逻,并沒有開啟鸣驱!輸入下列命令開啟即可:
sudo service mysql start
sudo表明以管理員權限執(zhí)行泛鸟,教程:如何啟動/停止/重啟MySQL
4.配置Mysql默認字符集
提示:此時當前目錄為根目錄,進入 /etc/mysql/踊东,打開 my.cnf北滥。
不太熟悉vi命令的同學看這里:linux下vi命令大全
cd /etc/mysql/
vi my.cnf
按一下 i 代表輸入操作刚操,填入以下代碼:
[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
default-character-set=utf8
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
character-set-server=utf8
[mysql]
no-auto-rehash
default-character-set=utf8
提示:編輯完成后按一下鍵盤 ESC 輸入:wq,代表保存退出再芋,然后重啟mysql服務使其生效:
sudo service mysql restart
5.創(chuàng)建網(wǎng)站的數(shù)據(jù)庫:
提示:進入mysql shell:
mysql -uroot -p
提示:輸入Mysql密碼菊霜,登陸即可,如圖所示登錄無問題:
提示:接下來創(chuàng)建數(shù)據(jù)庫并指定編碼方式為UTF-8(其中dataname 為數(shù)據(jù)庫名稱济赎,保證與Django連接數(shù)據(jù)庫名稱一致鉴逞,否則連接會出錯):
CREATE DATABASE `dataname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
提示:數(shù)據(jù)庫操作基本命令:
SHOW DATABASES; #顯示所有數(shù)據(jù)庫
USE <NAME>; #進入某數(shù)據(jù)庫
SHOW TABLES; #顯示所有數(shù)據(jù)表
SELECT * FROM <NAME>; #查詢表內容
多余的不說了,忘記的看看:mysql基本操作命令匯總
退出命令:quit 退回根目錄 :cd
四司训、安裝配置Python環(huán)境:
提示:一般默認自帶python2.7+3.5构捡,我們使用的環(huán)境是python3.6.
1.安裝python-dev包:
sudo apt-get install python-dev
2.安裝或升級pip :
安裝:
sudo apt-get install python-pip
升級:
sudo pip install --upgrade pip
3.更換pip源
提示:因為國內使用默認的pip源速度很慢,所以需要更換壳猜,在用戶根目錄下新建 .pip 目錄勾徽,在該目錄下新建pip.conf文件。
sudo mkdir ~/.pip
sudo vi ~/.pip/pip.conf
填入:
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
2.安裝Python 3.6
安裝之前统扳,我們需要給默認的Python2.7安裝pymysql+Django庫喘帚,因為后面會出錯就是因為未安裝這兩個庫!
pip install pymysql==0.7.10
pip install django==1.10.6
注意 :提醒在 /etc/ 目錄下下載安裝咒钟,因為解壓到哪里就安裝到哪里4涤伞!朱嘴!
安裝教程:如何在Ubuntu和LinuxMint上安裝Python 3.6.0
提示:如果下載速度太慢溉知,就看上面的 FileZilla 教程,自己下載好壓縮包上傳上去腕够,再解壓安裝级乍。
比如我這種速度,直接CTRL+Z退出
3.安裝虛擬環(huán)境玫荣,我們在這里淘汰virtualenv。
提示:因Python3+自帶虛擬環(huán)境大诸,更簡單好用捅厂,所以沒必要再裝一個。
在home目錄下創(chuàng)建名稱為vcmt的虛擬環(huán)境资柔。
python3.6 -m venv /home/vcmt
激活虛擬環(huán)境:
source /home/vcmt/bin/activate
退出命令:
deactivate
進入成功:
五焙贷、安裝Django等所有在原開發(fā)環(huán)境中依賴的庫:
--配置兩臺機器上相同的擴展庫環(huán)境:
--第一步,在已配置好的機器上使用
pip freeze > requirements.txt
--生成擴展庫信息列表贿堰;
--第二步辙芍,把生成的requirements.txt文件復制到目標機器上的python安裝目錄中scripts子目錄(沒有該目錄也不要緊,就放在root目錄下);
--第三步故硅,在目標機器上執(zhí)行pip install -r requirements.txt庶灿,讀取文件requirements.txt中的擴展庫信息并在本機進行安裝。
這里我們利用 FileZilla Client把文件上傳上去吃衅,并且把Django項目丟上去往踢。
我的目錄一般/home/
教程:阿里云服務器ECS連接 Linux 實例
注意:上傳項目文件后把 /項目名/app名/migrations/ 下的類似00.. 的記錄文件刪除,有幾個刪除幾個徘层,但是不要刪除別的文件峻呕。
這是在本地進行數(shù)據(jù)同步時產(chǎn)生的記錄文件,由于我們并不是轉移的數(shù)據(jù)庫趣效,所以要刪除舊的記錄山上,后面會再同步!
干貨來了S⒅АE搴丁!###
關于Django項目靜態(tài)文件的說明:
部署前的設置(網(wǎng)站換成你自己的干花,或者是公網(wǎng)IP):
一般在開發(fā)環(huán)境中: 即settings.py中的DEBUG = True 時 妄帘, Django 會自動幫助我們處理靜態(tài)文件,所以不用操心靜態(tài)文件404的問題池凄,但是在部署時抡驼,出于安全考慮,我們必須關閉DEBUG肿仑!保證自己網(wǎng)站的信息不泄露致盟。只是當DEBUG關閉后,Djang就不會幫我們處理靜態(tài)文件了尤慰,所以會出現(xiàn)樣式丟失馏锡,靜態(tài)文件404問題。
1.MEDIA_ROOT:媒體文件伟端,所有上傳的文件杯道。示例:圖像,文件
2.STATIC_ROOT 在開發(fā)過程中無用责蝠,只需要部署党巾。
在開發(fā)中,STATIC_ROOT什么都不做霜医。你甚至不需要設置它齿拂。Django在每個應用程序目錄(myProject/appName/static)中查找靜態(tài)文件,并自動提供肴敛。
當你的項目部署時署海,事情有所不同。很可能你將使用Django提供動態(tài)內容,Nginx將提供靜態(tài)文件叹侄。為什么巩搏?因為Nginx的效率非常高昨登,并且會減少Django的工作量趾代。
這時候STATIC_ROOT才有用,因為Nginx不知道你的django項目丰辣,不知道在哪里找到靜態(tài)文件撒强。
所以你設置STATIC_ROOT = '/some/folder/', 并告訴Nginx尋找靜態(tài)文件/some/folder/。然后運行manage.py collectstatic笙什,Django將會從所有應用程序復制靜態(tài)文件/some/folder/飘哨。
3.STATICFILES_DIRS : 靜態(tài)文件的額外目錄
STATICFILES_DIRS用于包含要查找的其他目錄。例如琐凭,默認情況下芽隆,Django無法識別/myProject/static/。所以你可以把它設置一下统屈。
基本介紹到此胚吁,如果還有問題,可以聯(lián)系我愁憔,我不介意為你解答疑惑腕扶。
注意:這里可以看到我的靜態(tài)文件是放在 APP(blog)下的,*.html引用方式:
{% load staticfiles %} #引用靜態(tài)文件目錄 放在HTML頭部
{% static 'css/bootstrap.min.css' % } #引用靜態(tài)文件
后面會同步靜態(tài)文件吨掌!所以不用擔心admin樣式問題半抱。
Django項目配置
安裝好Django等必須庫后,進入Django項目下膜宋,同步并創(chuàng)建數(shù)據(jù)庫窿侈,執(zhí)行:
python manage.py makemigrations
python manage.py migrate
注意:如果出錯了,首先檢查models.py 里面是不是有什么錯誤秋茫,包括在第一行設置UTF-8編碼方式棉磨,因為我發(fā)現(xiàn)它有時也會出現(xiàn)這種問題!再檢查settings.py 關于連接部分的設置對不對学辱,最后檢查是不是3306端口沒打開乘瓤!一般都是這幾個問題。
建立后臺超級用戶:
python manage.py createsuperuser
啟動自帶的服務器策泣,測試是否可以正常運行Q每(此時settings.py 中的DEBUG = False)輸入:
python manage.py runserver 0.0.0.0:8000
至于樣式為什么沒應用统抬,是因為Django已經(jīng)不管靜態(tài)文件了,我們要讓nginx處理 靜態(tài)文件!往后看聪建!
啟動時錯誤總結钙畔!
如果出現(xiàn)響應時間過長或者拒絕訪問,瀏覽器按F12挥下,查看network揍魂,按一下F5刷新一次,出現(xiàn) ...ERRO NET... 什么的棚瘟,就是端口未開啟现斋,用手機在ECS里配置安全組,增加一個8000配置即可偎蘸!
電腦上的:
點擊公網(wǎng)入方向 添加安全組規(guī)則迷雪,參照它自己生成的那樣配置即可限书。
接下來同步靜態(tài)文件:
先退出django啟動的服務,CTRL + C 強制退出振乏!
python manage.py collectstatic
此時項目下的settings.py 中的STATIC_ROOT 后面的文件夾應該是'static' .
下面是手動部署方法蔗包,如需要一鍵部署腳步請移步:
Django + uwsgi + nginx 一鍵部署腳本
六、uWSGI的安裝
1.安裝:
sudo pip install uwsgi
啟動測試:
uwsgi --http :8000 --chdir /home/nocmt/ -w nocmt.wsgi
啟動測試慧邮,應該可以正常訪問了调限。
2.uWSGI的配置
首先建立一個配置目錄及文件:
sudo mkdir -p /etc/uwsgi/sites
cd /etc/uwsgi/sites
在里面建立以自己項目名命名的配置文件:
sudo vi nocmt.ini
填入以下內容:你只需要改project和Base,一個項目名稱误澳,一個項目路徑耻矮。
[uwsgi]
project = nocmt
base = /home
chdir = %(base)/%(project)
module = %(project).wsgi:application
home = %(base)/vcmt
master = true
processes = 5
socket = %(base)/%(project)/%(project).sock
chmod-socket = 666
vacuum = true
現(xiàn)在建立一個自啟腳本:
sudo vi /etc/init/uwsgi.conf
內容如下 setuid的值改為你的項目名:
description "uWSGI application server in Emperor mode"
start on runlevel [2345]
stop on runlevel [!2345]
setuid nocmt
setgid www-data
exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
最后一個問題,www-data 用戶組沒有創(chuàng)建忆谓。
七裆装、反向代理:Nginx的安裝和配置
1.安裝
sudo apt-get install nginx
2.創(chuàng)建配置文件
sudo vi /etc/nginx/sites-available/nocmt
提示:填寫內容如下(server_name為被解析域名,如果暫時沒有域名那就填公網(wǎng)IP倡缠,Django項目settings.py中的哨免,靜態(tài)文件夾地址一定要填對,否則樣式會出錯j悸佟):
提示:簡潔版:
server {
listen 80;
server_name nocmt.com;
location /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/nocmt;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/home/nocmt/nocmt.sock;
}
}
提示: 開啟日志版琢唾,這要確保你的網(wǎng)站項目有favico網(wǎng)站圖標,也可自行刪改盾饮。
server{
listen 80;
server_name
nocmt.com;
access_log /home/nocmt/nginx.access.log;
error_log /home/nocmt/nginx.error.log;
location /static/ {
root /home/nocmt;
}
location /favico.ico {
root /home/nocmt/static/img/favico.ico;
}
location / {
include uwsgi_params;
uwsgi_pass unix: / home / nocmt / nocmt.sock;
}
}
多域名問題看這里:Nginx 解決多域名問題
然后鏈接文件:
sudo ln -s /etc/nginx/sites-available/nocmt /etc/nginx/sites-enabled/
檢查是否有錯誤:
sudo service nginx configtest
出現(xiàn)錯誤采桃,那就是配置文件寫錯了懒熙,自己檢查一下,沒有就直接啟動普办!
sudo service nginx restart
最后輸入工扎,啟動uwsgi :
uwsgi /etc/uwsgi/sites/nocmt.ini -d /home/nocmt/nocmt.log
訪問你的網(wǎng)站,試試看衔蹲!如果有問題歡迎簡信我肢娘!
參考文章:
3.在 Ubuntu 16.04 LTS 上安裝 Python 3.6.0
4.Linux下MySQL 5.5/5.6的修改字符集編碼為UTF8
5.STATICFILES_DIR,STATIC_ROOT和MEDIA_ROOT之間的差異
6.Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服務器
7.五步教你實現(xiàn)使用Nginx+uWSGI+Django方法部署Django程序(上)
8.五步教你實現(xiàn)使用Nginx+uWSGI+Django方法部署Django程序(下)
9.Django + uwsgi + nginx + bootstrap 創(chuàng)建自己的博客 -- 13.部署
10.CentOS+Apache+mod_wsgi+Python+Django - 昨踪危、夜星辰 - 博客園
......