Django+Ubuntu WEB部署(超詳細版)

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密碼 ,輸入兩次密碼,回車即可,然后等待安裝完成

設置MySQL密碼

2.查看MySQL版本:

mysql --version

提示:輸出結果為:5.7.17,事實上Mysql 5.7.6或更高版本,數據目錄將自動初始化,這一點大部分教程都沒有提及。所以這里我們不用初始化。


查看Mysql版本

3.運行數據庫Mysql安全配置向導:

  sudo mysql_secure_installation

提示:輸入Mysql密碼


輸入root密碼:

提示:是否設置驗證密碼,輸入 n


是否設置驗證密碼,輸入 n

提示:是否修改Mysql密碼,輸入 n


是否修改MySQL密碼,輸入 n

提示:是否移除匿名用戶,輸入y


是否移除匿名用戶,選y

提示:是否允許遠程登陸,如果選n的話,只能在本機訪問數據庫,根據情況來,本人數據庫和項目都在一個服務器上,為了安全考慮,這里我設置關閉,輸入n


設置關閉,輸入 n

提示:是否移除test數據庫,輸入y


是否移除test數據庫,選y

提示:是否重新加載權限表,輸入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退出


比如我這種速度,直接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.. 的記錄文件刪除,有幾個刪除幾個,但是不要刪除別的文件。

Paste_Image.png

這是在本地進行數據同步時產生的記錄文件,由于我們并不是轉移的數據庫,所以要刪除舊的記錄,后面會再同步!

pip list 顯示所有已安裝庫

干貨來了!!!###

關于Django項目靜態文件的說明:

開發環境中靜態文件設置:

部署前的設置(網站換成你自己的,或者是公網IP):

settings.py部署前的設置
settings.py部署前的設置

一般在開發環境中: 即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
靜態文件成功的復制到項目下的自定義靜態文件夾下了,所以沒有出現404錯誤!

至于樣式為什么沒應用,是因為Django已經不管靜態文件了,我們要讓nginx處理 靜態文件!往后看!

啟動時錯誤總結!

這是端口被占用的問題,可以輸入 sudo fuser -k 8000/tcp ,殺死與端口8000相關聯的所有進程即可。

如果出現響應時間過長或者拒絕訪問,瀏覽器按F12,查看network,按一下F5刷新一次,出現 ...ERRO NET... 什么的,就是端口未開啟,用手機在ECS里配置安全組,增加一個8000配置即可!

電腦手機均可配置,自己找找。

電腦上的:

Paste_Image.png
Paste_Image.png

點擊公網入方向 添加安全組規則,參照它自己生成的那樣配置即可。

Paste_Image.png

接下來同步靜態文件:

先退出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
提示ok才是正確的

最后輸入,啟動uwsgi :

uwsgi /etc/uwsgi/sites/nocmt.ini -d /home/nocmt/nocmt.log
完成

訪問你的網站,試試看!如果有問題歡迎簡信我!


參考文章:

1.基于Django框架的網站部署

2.Django+Nginx+uwsgi部署

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 - 昨、夜星辰 - 博客園

......

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容