django之項目部署到服務器(centos7+uwsgi+nginx+python3)

項目源碼請點擊這兒

先說如何將django部署到服務器吧。在之前我還是想說一下,因爲我也是弄了好久,看了很多的博客、資料,但是就是沒有成功。踩了很多坑之後,總結了一些問題的所在。其實服務器環境和別人的也沒什麼差別,主要都是一些細節的東西,但是別人的博客沒有寫出那些坑,那是因爲人家沒遇到,或者說人家覺得那樣的是很基礎的東西,所以就沒說了。

今天我也來談談我部署的整個過程,不一定能讓你真的完整的部署完,就像別人寫他的博客的時候,至少人家用那種方法實現了,而我卻失敗了一樣。所以我不能保證按照我這個一定會成功,因爲可能有些地方我疏忽了,沒有說。但是如果我的博客中有一些東西能對你有些啓發、能幫助到你,那我就知足了。

 

一. 環境準備:
1. python3、pip3、數據庫(我用到的是mysql)

服務器上默認的是python2,但是我要用的是python3,所以就先安裝python3吧。這個可以去看這個教程:centos7安裝python3,pip3,但是要注意一個問題,就是他裏面將python默認指向python3的時候,只提到了要將/usr/yum文件的第一行的python改爲你的python2對應的那個解析器,一般是python2,或者python2.7之類的。這個可以用命令ll /usr/bin/python*查看。
     


但是隻修改了/usr/yum文件是不夠的,還有一個文件,是/usr/libexec/urlgrabber-ext-down,使用vim打開,將首行的python改爲python2.7就行了。
所以最終服務器上是這樣的
    


2. Centos7(阿里雲上買的服務器)


3. Django2


4. Git(git是管理倉庫的一個東西,但是它處理管理倉庫,還可以登錄服務器,強烈推薦使用這個。當然還有putty等的軟件)


5. 可以向服務器傳文件的客戶端,例如xftp,這個軟件只需要連接上服務器之後,就可以拖動文件來在服務器之間互傳文件了,很方便。當然,如果你不想用這個話,有連接服務器的客戶端(比如上面說的git等),然後使用scp命令傳文件也行,但是好像有點慢。

 

二. 將項目代碼上傳至服務器
1. 我想,你在這之前你得保證你得項目用python manage.py runserver是可以成功運行的,如圖:
    
然後上傳文件至一個合適的目錄,注意,不要將項目傳至/root,因爲這個目錄的權限太高。我是將項目傳到/home目錄下,我的我的項目名叫TestManage,所以上傳之後,我的項目就在/home/TestManage下。

 

2. 然後修改settings.py文件。有幾個地方需要修改

(1) DEBUG = False ,相信到現在你應該知道這樣做的原因的了

(2) 數據庫,比如你在本地的數據的密碼和服務器上的數據庫密碼不同,那麼你就要將相應的地方的密碼改成服務器上的。比如這樣,我的這種寫法是因爲我將數據庫的密碼寫入環境變量了,所以這兒可以直接調用。你可以直接寫你的密碼

(3) 靜態文件配置

增加如下代碼,不過可能你在本地的時候,已經添加了STATICFILES_DITS這一項了,在這兒你只需要增加

STATIC_ROOT = os.path.join(BASE_DIR, 'allstatic')  # 這個地方你可以隨便命名,到時候生成的靜態文件目錄名就是你設置的這個

如下

然後退出後執行python manage.py collectstatic,之後就會在當前目錄生成一個新的目錄,目錄下就是你的所有靜態文件(包括css,js,image等,還有一個admin相關的靜態文件)。可能你會想,我的項目命名已經有靜態文件了,爲什麼不直接用那個目錄下的文件,而要執行這些命令將那些靜態文件複製後來呢?

因爲nginx找不到你的這個路徑啊l。所以纔要執行上面的操作,將靜態文件收集到一個目錄,然後在nginx配置中添加一下這個路徑,nginx就可以識別到了。但是爲什麼不能直接將自己的靜態文件的路徑添加到nginx的配置中使用呢?我覺得可能是規範問題。首先,你寫的靜態文件的目錄可能很亂,從收集到的靜態目錄我們也可以看到,路徑分明,css,js,image在不同路徑下,並且還有後臺管理的靜態文件。

 

三. 搭建環境


1. 關於虛擬環境是否需要

  • 首先,你可能看了一些教程說要安裝虛擬環境,但少部分的人說可以不用。其實確實可以不用。
  • 說要用的是爲了規範。例如,現在你的這個項目所需要的庫有djagno2.1.5, python3,假如你現在的這個項目沒有一個指定的虛擬環境,那麼如果以後你又寫了一個項目,要放在這個服務器運行,但是你之後的那個項目所依賴的是django1.7,那麼你怎麼辦,兩個項目的環境衝突了。所以就提出了要用虛擬環境(虛擬環境簡單的理解就是一棟樓裏的每一個房間一樣,你可以在每一個房間安裝不同的版本的django,或者其他的庫。這些房間是可以獨立的運行一個生產環境。而別的房間在幹什麼,不會對你當前的房間裏的事產生影響)。
  • 那麼說不需要的又是什麼意思呢?那就是你保證你以後不會有衝突的項目,或者你只是初學django,想試試如何部署而已,並且該服務器是你個人所用,那麼你就可以不用虛擬環境了。這個看你取捨吧。但是用虛擬環境也不麻煩的。


2. 更新yum,使用

yum update

這很重要。然後就是下載一下一些依賴的包,相信很多教程都說到了,你就按那些安裝好依賴包就是了。


3. 安裝虛擬環境。

先安裝virtualenv,用命令。然後建立軟鏈接  ln -s /usr/local/python3/bin/virtualenv /usr/virtualenv

pip install virtualenv
ln -s /usr/local/python3/bin/virtualenv /usr/virtualenv

 

4. 安裝成功之後,還要安裝兩個包,我們要說的重點,nginx和uwsgi。

  • 安裝nginx有兩種方式,一種是直接使用命令yum install nginx,另一種是下載相應的壓縮包,然後安裝,也就是源碼安裝。我推薦用第二種方式,我也不知道具體的細節,反正我用了第一種之後,沒有成功,並且我看到好多人都說用yum安裝得到的那個包很老了。使用第二種方式安裝請看centos7下安裝nginx
  • 如果按照上面的步驟完成後,啓動nginx,在本地的電腦上輸入服務器的IP,能夠顯示下面的這個界面,那說明nginx安裝沒問題。事實上nginx的安裝也不復雜,主要是uwsgi,和之後的配置問題。

  

  • 安裝uwsgi,注意,這個時候,我還沒有創建虛擬環境,也沒有進入虛擬環境。也就是我這個時候安裝的包是屬於系統範圍的,不是某個虛擬環境下的。使用命令就可以安裝了。
pip install uwsgi

安裝好之後,因爲我們想在任意地方使用,所以你需要將uwsgi建立軟連接。使用命令

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi 

來建立軟連接。建立成功之後,你可以使用命令ll /usr/bin/uwsgi查看是否成功。
  
當然了,第三步安裝的nginx也要建立軟鏈接的,使用命令

ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

來建立軟連接
可以用命令ll /usr/nginx查看。
  

然後就要測試uwsgi
在任意路徑下創建一個test.py文件,寫入一下內容:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"  # 這是python2的寫法
    Return [b“hello world”]  # 這是python3的寫法,返回的是字節

根據你的python版本來選擇要return什麼。

 

  • 然後在test.py所在的目錄下,使用以下命令
uwsgi --http :8001 --wsgi-file test.py

來測試uwsgi。敲完命令回車之後,你可以在本地的瀏覽器上輸入你服務器的IP地址+8001來查看(例如192.168.41.16/8001),如果頁面顯示了hello world那麼就說明成功了。

這兒有幾個細節要注意,也是之前被坑了好久的問題,就是uwsgi測試不成功的原因

  • 首先,這個端口你可以隨便選,但是不要用22,80之類的,這些端口是有特殊作用的。
  • 你選的這個端口你得保證已經加入安全組了。就是假如你是在阿里雲買的服務器,那麼你登錄你的賬號之後,在安全組那兒添加這個端口就可以了。我之前就是沒有添加,然後uwsgi就一直測試不成功。

現在就要建立虛擬環境,並在虛擬環境中配置了。


5. 建立虛擬環境

之前的nginx,uwsgi,virtualenv都可以在任意目錄下使用命令安裝,因爲他們會安裝到默認的目錄下的,我們可以不用管。現在建立虛擬環境就要考慮目錄了。我是在/home下建立的虛擬環境,即分別執行兩條命令

cd /home
cirtualenv env  # env是我命名的虛擬環境。

然後使用如下命令就可以進入虛擬環境了。

source env/bin/activate

成功之後是下面這樣的。
   
你可以看到多了一個(env),這表示你進入了虛擬環境了。之後的所有操作我就不用再提了,都是在虛擬環境下。


6. 安裝uwsgi

可能你會在其他教程裏也看到了這樣的操作,就是我們之前就已經裝過了uwsgi,爲什麼又要再裝一次。這個問題留到最後我會講,你就先記得要都安裝。安裝命令也是一樣的pip install uwsgi。
然後就是安裝你這個項目所需要的那些庫了。比如我用到了django2.1.5, requests, pymysql等,那麼我就要安裝這些庫。注意,django的版本一定要和你項目裏的那個一致。假如你的項目是你的電腦上寫的,那麼你可以在你本地的終端裏查看django的版本。使用pip list命令
 
那麼你在服務器安裝的django也用這個版本。使用命令

pip install django==2.1.5

之後還需要將你的項目所有依賴的庫都安裝好。


7. 一切準備就緒,現在將你的項目上傳到服務器

之前我說過了,我的項目名是TestManage,上傳到/home目錄。所以也就是這樣的/home/TestManage
  
之後最重要的就是配置uwsgi和nginx了。首先你要保證你的nginx啓動之後,可以在本地瀏覽器輸入IP就可以看到那個界面,還有就是你的uwsgi測試那兒沒有問題。然後在項目的根目錄下(其實你可以在其他地方的,因爲到時候我們只要到該uwsgi的配置文件下,使用命令uwsgi —ini+配置文件就可以啓動了),反正就是這個目錄不影響。先創建uwsgi文件,使用如下命令創建並編輯文件內容

vim mysite_uwsgi.ini  # 配置文件有多種寫法,可以是.ini的,也有.xml等等,但是不同的後綴所寫的代碼是不一樣的,我這兒介紹的是.ini這種寫法

文件裏寫入如下內容

# mysite_uwsgi.ini
[uwsgi]  # 固定用法
chdir = /home/data/project/TestMange  # 項目根目錄的路徑
module = TestMange.wsgi  # 項目下同名目錄下的wsgi.py文件。這個文件是創建django項目時就自帶的。寫法就是項目名.wsgi
home = /home/env  # 你要運行該項目的虛擬環境的目錄
master = true
processes = 4  # 進程數
theads = 2  # 線程數
socket = :8001  # 開的端口,待會兒nginx的配置也要用到同樣的端口號,不過這個端口號你可以自行選擇,但是一定要假如了安全組的,否則不能用
chmod-sock = 666  # 文件的權限
vacuum = true
daemonize = mysite_uwsgi.log  # 啓動該項目後,日誌信息不在終端顯示,而是寫入該文件。該文件會自動創建的
logfile-chmod = 666 # 日誌文件的權限權限不能太低,那樣的話就無法寫入了。

其他的參數就不一一說了,你可以看篇文章uwsgi常用參數介紹
配置完之後:wq退出。


然後去配置nginx,按照源碼安裝的話,你就是要進入/usr/local/nginx/conf目錄。然後ls你就可以看到該目錄下有一個叫nginx.conf的文件。裏面有一些默認的東西。現在我們就在該目錄下新建一個文件nginx.conf,在這兒之前,你要先刪除原有的那個文件,但是保守起見,還是將其重命名吧,使用命令:mv nginx.conf nginx.conf.bak(一個小常識,.bak文件一般都是一個副本)。

cd /usr/local/nginx/conf
mv nginx.conf nginx.conf.bak

然後新建一個配置文件

vim nginx.conf

文件中寫入以下內容:

# mysite_nginx.conf
worker_processes 1;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    
    upstream django {
        server 127.0.0.1:8001;  # 該端口號一定要和之前uwsgi的那個文件裏的socket對應的端口一致。
    }
    server {
        listen 80;
        server_name 127.0.0.1:80;  # 這兒如果你有域名的話,就將127.0.0.1:80換成你的域名,沒有的話就用這個。
        charset utf-8;
        
        location /media {
        alias /home/TestMange/media; # media是你項目中的一個目錄,這個目錄是用戶上傳文件保存的路徑,如果你的項目中沒有這個上傳文件的需求,因此也沒有這個目錄,那麼這一項你就可以不用配置。
        }
        
        location /static {
        alias /home/TestMange/allstatic;  #  靜態文件的路徑(注意,這兒的allstatic是執行了python manage.py collectstatic之後,自動產生的一個目錄,該目錄下收集了你項目中所有的靜態文件。其實就是將你的靜態文件複製了一遍過來)
        }
        
        location / {
            uwsgi_pass django;
            include /usr/local/nginx/conf/uwsgi_params; # yum安裝的話,好像這個uwsgi_params文件沒有的,需要去github上下,自行百度吧。不過如果你是用yum安裝的話,你的nginx也不是在這個路徑下。
        }
    }
}


然後:wq退出就可以了。現在,基本上已經配置完了。重新加載nginx。可以使用命令

# 在重新加載前,你可以先使用如下命令檢查你的nginx配置文件有沒有問題
nginx -t
# 如果執行上面的命令沒有顯示什麼錯誤的話,就可以使用下面的命令來重新加載nginx了
nginx -s reload

(使用這個命令的前提是你的nginx已經建立了軟鏈接。沒有的話,你就去/usr/local/nginx/sbin/目錄下,會看到一個nginx文件,使用命令./nginx -s reload也可以重新加載nginx

cd /usr/local/nginx/sbin/
./nginx -s reload

然後回到項目目錄下,也就是你的uwsgi配置文件所在的目錄。如果你的這個配置文件在其他地方,那你就回到那個目錄就可以了。使用命令如下命令啓動uwsgi配置文件,

uwsgi —ini mysite_uwsgi.ini  # 保證mysite_uwsgi.ini在當前目錄,不在的話,請先切換到它所在的目錄。

你就可以在本地電腦輸入IP加你的項目名訪問了。我不知道之前配置的那個8001端口,好像也不需要輸入這個端口啊。例如我的TestManage項目下有一個叫blog的app,那麼我輸入ip/blog,就可以訪問我的項目了。

 

四. 小結

1. 之前留了一個問題,就是爲什麼要安裝兩次uwsgi呢?

我們現在使用uwsgi --ini mysite_uwsgi.ini啓動配置文件,這是在虛擬環境下的。也就是說我們的虛擬環境下安裝了一個uwsgi。那如果下次我們重新登錄服務器之後,要啓動這個配置文件呢?還要重新進入一下虛擬環境,然後再使用這條命令嗎,顯然是很麻煩。所以我們在系統環境中安裝了一個uwsgi,到時候直接使用命令就可以了,不必再進入虛擬環境。

2. 碎碎念。

完成這些所有的配置我們需要做到的東西:

1. django的settings.py的配置
2. nginx只在系統環境中安裝了一次,但是uwsgi安裝了兩次(一次在系統環境,一次在虛擬環境)
3. 兩個配置文件 nginx 和 uwsgi 各一個
4. 收集靜態文件:python manage.py collectstatic # 前提是django的settings.py要設置好。
5. 端口,一定要假如安全組才能用
6. 收集完之後的靜態文件路徑allstatic,和用戶文件上傳路徑media。這兩個路徑的權限問題,如果allstatic路徑的權限不夠,那麼就會造成靜態文件丟失的情況,因爲沒有讀取權限嘛。如果medai路徑的權限不夠,那麼用戶就無法上傳文件。而且我試過,靜態文件路徑設置成666,照樣會有靜態文件丟失的情況,所以我直接將該目錄的權限改爲777了。並且要該路徑下的所有文件的權限都是777,不是隻修改這個目錄的權限。你可以使用命令
chmod -R 777 allstatic  # 這條命令將會使得該路徑下的所有文件的權限都是777

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章