2017年12月4日教程更新,請移步至最終版本:Django快速部署簡約版 v3.0
不推薦閱讀以下文章!
一、環境介紹
- 服務器:Ubuntu 16.04 for 阿里云
- 數據庫:MySQL 5.7.17
- Python 3.6.0 + Django 1.10.6
二、準備工作
1.更新系統:
sudo apt-get update
sudo apt-get upgrade
提示:安裝時出現的選擇項按自己實際情況選擇,這里不做過多闡述,實在看不懂,自行谷歌翻譯。
2.安裝SSH(Git默認安裝了):
sudo apt-get install ssh
提示:本人的項目是通過FileZilla Client直接上傳的。
有興趣的可以看看教程:FTP使用教程之Filezilla使用教程
3.命令行查看自己的公網IP地址:
ifconfig
提示:得到網卡信息,這里的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或更高版本,數據目錄將自動初始化,這一點大部分教程都沒有提及。所以這里我們不用初始化。
3.運行數據庫Mysql安全配置向導:
sudo mysql_secure_installation
提示:輸入Mysql密碼
提示:是否設置驗證密碼,輸入 n
提示:是否修改Mysql密碼,輸入 n
提示:是否移除匿名用戶,輸入y
提示:是否允許遠程登陸,如果選n的話,只能在本機訪問數據庫,根據情況來,本人數據庫和項目都在一個服務器上,為了安全考慮,這里我設置關閉,輸入n
提示:是否移除test數據庫,輸入y
提示:是否重新加載權限表,輸入y
注意:如果出現這種錯誤:
[error: 'Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)']
它表明你的Mysql服務,并沒有開啟!輸入下列命令開啟即可:
sudo service mysql start
sudo表明以管理員權限執行,教程:如何啟動/停止/重啟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.創建網站的數據庫:
提示:進入mysql shell:
mysql -uroot -p
提示:輸入Mysql密碼,登陸即可,如圖所示登錄無問題:
提示:接下來創建數據庫并指定編碼方式為UTF-8(其中dataname 為數據庫名稱,保證與Django連接數據庫名稱一致,否則連接會出錯):
CREATE DATABASE `dataname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
提示:數據庫操作基本命令:
SHOW DATABASES; #顯示所有數據庫
USE <NAME>; #進入某數據庫
SHOW TABLES; #顯示所有數據表
SELECT * FROM <NAME>; #查詢表內容
多余的不說了,忘記的看看:mysql基本操作命令匯總
退出命令:quit 退回根目錄 :cd
四、安裝配置Python環境:
提示:一般默認自帶python2.7+3.5,我們使用的環境是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/ 目錄下下載安裝,因為解壓到哪里就安裝到哪里!!!
安裝教程:如何在Ubuntu和LinuxMint上安裝Python 3.6.0
提示:如果下載速度太慢,就看上面的 FileZilla 教程,自己下載好壓縮包上傳上去,再解壓安裝。
比如我這種速度,直接CTRL+Z退出
3.安裝虛擬環境,我們在這里淘汰virtualenv。
提示:因Python3+自帶虛擬環境,更簡單好用,所以沒必要再裝一個。
在home目錄下創建名稱為vcmt的虛擬環境。
python3.6 -m venv /home/vcmt
激活虛擬環境:
source /home/vcmt/bin/activate
退出命令:
deactivate
進入成功:
五、安裝Django等所有在原開發環境中依賴的庫:
--配置兩臺機器上相同的擴展庫環境:
--第一步,在已配置好的機器上使用
pip freeze > requirements.txt
--生成擴展庫信息列表;
--第二步,把生成的requirements.txt文件復制到目標機器上的python安裝目錄中scripts子目錄(沒有該目錄也不要緊,就放在root目錄下);
--第三步,在目標機器上執行pip install -r requirements.txt,讀取文件requirements.txt中的擴展庫信息并在本機進行安裝。
這里我們利用 FileZilla Client把文件上傳上去,并且把Django項目丟上去。
我的目錄一般/home/
教程:阿里云服務器ECS連接 Linux 實例
注意:上傳項目文件后把 /項目名/app名/migrations/ 下的類似00.. 的記錄文件刪除,有幾個刪除幾個,但是不要刪除別的文件。
這是在本地進行數據同步時產生的記錄文件,由于我們并不是轉移的數據庫,所以要刪除舊的記錄,后面會再同步!
干貨來了!!!###
關于Django項目靜態文件的說明:
部署前的設置(網站換成你自己的,或者是公網IP):
一般在開發環境中: 即settings.py中的DEBUG = True 時 , Django 會自動幫助我們處理靜態文件,所以不用操心靜態文件404的問題,但是在部署時,出于安全考慮,我們必須關閉DEBUG!保證自己網站的信息不泄露。只是當DEBUG關閉后,Djang就不會幫我們處理靜態文件了,所以會出現樣式丟失,靜態文件404問題。
1.MEDIA_ROOT:媒體文件,所有上傳的文件。示例:圖像,文件
2.STATIC_ROOT 在開發過程中無用,只需要部署。
在開發中,STATIC_ROOT什么都不做。你甚至不需要設置它。Django在每個應用程序目錄(myProject/appName/static)中查找靜態文件,并自動提供。
當你的項目部署時,事情有所不同。很可能你將使用Django提供動態內容,Nginx將提供靜態文件。為什么?因為Nginx的效率非常高,并且會減少Django的工作量。
這時候STATIC_ROOT才有用,因為Nginx不知道你的django項目,不知道在哪里找到靜態文件。
所以你設置STATIC_ROOT = '/some/folder/', 并告訴Nginx尋找靜態文件/some/folder/。然后運行manage.py collectstatic,Django將會從所有應用程序復制靜態文件/some/folder/。
3.STATICFILES_DIRS : 靜態文件的額外目錄
STATICFILES_DIRS用于包含要查找的其他目錄。例如,默認情況下,Django無法識別/myProject/static/。所以你可以把它設置一下。
基本介紹到此,如果還有問題,可以聯系我,我不介意為你解答疑惑。
注意:這里可以看到我的靜態文件是放在 APP(blog)下的,*.html引用方式:
{% load staticfiles %} #引用靜態文件目錄 放在HTML頭部
{% static 'css/bootstrap.min.css' % } #引用靜態文件
后面會同步靜態文件!所以不用擔心admin樣式問題。
Django項目配置
安裝好Django等必須庫后,進入Django項目下,同步并創建數據庫,執行:
python manage.py makemigrations
python manage.py migrate
注意:如果出錯了,首先檢查models.py 里面是不是有什么錯誤,包括在第一行設置UTF-8編碼方式,因為我發現它有時也會出現這種問題!再檢查settings.py 關于連接部分的設置對不對,最后檢查是不是3306端口沒打開!一般都是這幾個問題。
建立后臺超級用戶:
python manage.py createsuperuser
啟動自帶的服務器,測試是否可以正常運行!(此時settings.py 中的DEBUG = False)輸入:
python manage.py runserver 0.0.0.0:8000
至于樣式為什么沒應用,是因為Django已經不管靜態文件了,我們要讓nginx處理 靜態文件!往后看!
啟動時錯誤總結!
如果出現響應時間過長或者拒絕訪問,瀏覽器按F12,查看network,按一下F5刷新一次,出現 ...ERRO NET... 什么的,就是端口未開啟,用手機在ECS里配置安全組,增加一個8000配置即可!
電腦上的:
點擊公網入方向 添加安全組規則,參照它自己生成的那樣配置即可。
接下來同步靜態文件:
先退出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
現在建立一個自啟腳本:
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 用戶組沒有創建。
七、反向代理:Nginx的安裝和配置
1.安裝
sudo apt-get install nginx
2.創建配置文件
sudo vi /etc/nginx/sites-available/nocmt
提示:填寫內容如下(server_name為被解析域名,如果暫時沒有域名那就填公網IP,Django項目settings.py中的,靜態文件夾地址一定要填對,否則樣式會出錯!):
提示:簡潔版:
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;
}
}
提示: 開啟日志版,這要確保你的網站項目有favico網站圖標,也可自行刪改。
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
出現錯誤,那就是配置文件寫錯了,自己檢查一下,沒有就直接啟動!
sudo service nginx restart
最后輸入,啟動uwsgi :
uwsgi /etc/uwsgi/sites/nocmt.ini -d /home/nocmt/nocmt.log
訪問你的網站,試試看!如果有問題歡迎簡信我!
參考文章:
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.五步教你實現使用Nginx+uWSGI+Django方法部署Django程序(上)
8.五步教你實現使用Nginx+uWSGI+Django方法部署Django程序(下)
9.Django + uwsgi + nginx + bootstrap 創建自己的博客 -- 13.部署
10.CentOS+Apache+mod_wsgi+Python+Django - 昨、夜星辰 - 博客園
......