基於centos7+nginx+uwsgi+python3+django2.0部署Django項目

0、序言

本文講解如何基於centos7+nginx+uwsgi+python3+django2.0把windows上的本地項目部署到雲服務器上。

本文服務器上的django項目和虛擬環境的路徑將創建在 /home路徑下,項目名爲"BlogProject",虛擬環境名爲"py3.6env"。html

對於Django部署而言,nginx和uWSGI是不錯的選擇,但它們並不是惟一的選擇,也不是「官方」選擇。對於它們兩個,都有不錯的替代品,所以鼓勵你去詳細研究一下。python

nginx (發音爲 engine-x) 是一個免費開源而且高性能的HTTP服務器和反向代理,仍是一個IMAP/POP3代理服務器。mysql

web服務器軟件:能夠向瀏覽器等web客戶端提供文件 (HTML, 圖像, CSS等等)。經常使用的軟件有Apache,Nginx,IIS(在windows系統使用)。nginx

1、概念

一個web服務器面對的是外部世界。它能直接從文件系統提供文件 (HTML, 圖像, CSS等等)。然而,它沒法「直接」與Django應用通訊;它須要藉助一些工具的幫助,這些東西會運行運用,接收來自web客戶端(例如瀏覽器)的請求,而後返回響應。git

一個Web服務器網關接口(Web Server Gateway Interface) - WSGI - 就是幹這活的。 WSGI 是一種Python標準。它是一個Web服務器(如nginx,uWSGI等服務器)與web應用(如用Flask,Django框架寫的程序)通訊的一種規範。web

uWSGI是一種WSGI實現。本文咱們將設置uWSGI,讓它建立一個socket,而且經過WSGI協議提供響應到web服務器。sql

2、安裝環境

OS:centos7.6數據庫

python版本:python3.6.5django

django版本:Django2.0windows

uwsgi版本:使用本文發佈時最新的2.0.18

nginx版本:使用本文發佈時官網最新的1.15.11

3、安裝Python3.6

1.不要刪除自帶的python2.7,不然會出問題,由於centos許多軟件須要依賴系統自帶python

2.安裝依賴工具 (安裝這些模塊都是爲了成功編譯安裝python3,防止出現各類異常)

yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel mysql-devel gcc gcc-devel python-devel

3.下載

wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz

4.解壓

 tar -zxvf Python-3.6.5.tgz

5.移動至規範的放軟件的目錄下 

mv Python-3.6.5 /usr/local

6.安裝

cd /usr/local/Python-3.6.5/    
 ./configure
make
make install

./configure命令沒有指定安裝路徑,則默認安裝在/usr/local/bin。

安裝完成以後,網上不少教程都說要創建軟連接 添加變量 才能在終端中直接使用python3,可是我這裏不用創建軟連接,可直接在終端中直接使用python3.

pip3也不用創建軟連接,可直接在終端中直接使用pip3

 

7.驗證版本號

python3 -V

4、虛擬環境

 1.安裝虛擬環境virtualenv,建議你們都安裝一個virtualenv,方便不一樣版本項目管理。

系統已經幫咱們安裝好virtualenv,可不用安裝直接使用

2.建立虛擬環境virtualenv

 在/home路徑下,建立虛擬環境,這裏的路徑你們能夠本身選擇,我習慣建在/home路徑下。也能夠在根目錄下創建兩個文件夾env和BlogProject(項目路徑 ),主要用於存放env和網站文件的

virtualenv py3.6env

3.進入虛擬環境

source /home/py3.6env/bin/activate 

紅色方框出現(py3.6env),說明是成功進入虛擬環境。

5、安裝uwsgi

 1.系統上安裝uwsgi

pip3 install uwsgi

2.虛擬環境上安裝uwsgi

進入虛擬環境,執行安裝命令

pip3 install uwsgi

注意:uwsgi要安裝兩次,先在系統裏安裝一次,而後進入對應的虛擬環境安裝一次。

安裝完成後查詢uwsgi安裝狀況,如圖所示,則安裝成功。

 

一樣這裏也不用創建軟連接,能夠直接在終端使用uwsgi。

3.驗證

在/home/路徑下創建test.py,輸入如下內容:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello Django"]

 

執行命令

uwsgi --http :8001 --wsgi-file test.py

瀏覽器訪問,網頁能顯示 Hello Django 那麼就沒問題。((記得關閉系統防火牆或者在服務器安全組開放8001端口))

6、本地項目搬遷到服務器

1.備份本地數據庫。

使用sqlite數據庫的話,直接打包數據庫文件(db.sqlite3)上傳到服務器便可。

使用Mysql數據庫,要先在本地Mysql裏備份導出數據,而後在服務器上安裝Mysql數據庫軟件。

mysqldump -u 用戶名 - p 數據庫名 > data.sql  #備份導出數據

ps:服務器上安裝Mysql數據庫軟件,請參考:CentOS7 安裝並配置MySQL8.0

2.在本地項目目錄下用下面的命令把當前的環境依賴包導出到requirements.txt文件。

pip3 freeze > requirements.txt

3.把項目源碼(包括數據庫文件,環境依賴包文件)壓縮打包,上傳到服務器對應的目錄裏(這裏在git bash裏使用scp命令上傳數據到服務器),解壓。

scp BlogProject.zip root@「服務器IP地址」:/home/BlogProject.zip   #傳輸到home路徑下

4.進入剛纔步驟三建立的虛擬環境,而後進入項目路徑安裝requirements.txt裏的依賴包。

pip3 install -r requirements.txt

 

5.導入數據庫到服務器。(若是用的是Mysql的話)

默認使用的是SQLite數據庫,就不用作此操做。數據庫原來是SQLite的,想換成Mysql,請查看文章:Django中把SQLite數據庫轉換爲Mysql數據庫的配置方法

若是是Mysql數據庫的,則在命令行裏輸入:

#把上傳到服務器的data.sql,在服務器裏用下面命令導入
mysql -u 用戶名 -p 你的密碼
use 數據庫名;  #這裏的數據庫名要項目中的settings.py文件的數據庫名一致
source /home/data.sql    #導入數據庫文件

6.運行一下項目,若是能正常啓動,在瀏覽器裏訪問服務器地址(域名),就能查看到項目,則進行下一步,不能正常運行往上檢查

python3 manage.py runserver 0.0.0.0:80 

ps:若是在雲服務器上沒有爲80端口設定安全組,則不能在瀏覽器訪問。

7、Django正常運行以後咱們就開始配置一下uwsgi。

咱們網站項目路徑是 /home/BlogProject,在/home路徑下新建文件夾BlogProject_uwsgi,專門存在uwsgi配置文件,日誌文件,進程文件,另外也能夠直接在項目根目錄下建立BlogProject_uwsgi.ini文件,這裏我選擇新建文件夾。

在/home/BlogProject_uwsgi路徑下新建BlogProject_uwsgi.ini文件

#BlogProject_uwsgi.ini

[uwsgi]
# 經過uwsgi訪問django須要配置成http
# 經過nginx請求uwsgi來訪問django 須要配置成socket


# web項目根目錄
chdir = /home/BlogProject
#虛擬環境的目錄
home = /home/py3.6env
# module指定項目自帶的的wsgi配置文件位置
module = BlogProject.wsgi

# 容許存在主進程
master = true
# 開啓進程數量
processes = 4
#每一個進程的最大請求時間
harakiri = 60
#每一個進程的最大請求數
max-requests = 5000

# 8001是內部端口,是django的端口號
socket = 127.0.0.1:8001
#用戶id
uid = 1000
#組id
gid = 2000

#存放進程文件的目錄
pidfile = /home/BlogProject_uwsgi/master.pid
#存放日誌文件的目錄
daemonize = /home/BlogProject_uwsgi/BlogProject.log
# 服務器退出時自動清理環境
vacuum = true

 

BlogProject_uwsgi.ini裏面參數的設定可參考官方文檔https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/uwsgi/

8、安裝nginx和配置nginx.conf文件

進入home目錄,執行下面命令

cd /home/
wget http://nginx.org/download/nginx-1.13.7.tar.gz

下載完成後,執行解壓命令:

tar -zxvf nginx-1.15.11.tar.gz

移動至規範的放軟件的目錄下

mv nginx-1.15.11 /usr/local

安裝,進入解壓後的nginx-1.15.11文件夾,依次執行如下命令:

cd /usr/local/nginx-1.15.11/
./configure
make
make install

nginx通常默認安裝好的路徑爲/usr/local/nginx
在/usr/local/nginx/conf/中先備份一下nginx.conf文件,以防意外。

cp nginx.conf nginx.conf.bak

而後打開nginx.conf,把原來的內容刪除,直接加入如下內容:

events{
        worker_connections  1024;
}
http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile      on;
        server {
            listen 80;   #80是對外的端口號
            server_name  47.112.128.209:80; #nginx代理uwsgi對外的ip,改成本身的域名,沒域名修改成服務器ip地址
            charset utf-8;
            
            location /static/ {
                alias /home/BlogProject/static/; #靜態資源路徑
            }
            
            location /media/  {
                alias /home/BlogProject/media/;  # #媒體資源路徑
            }
            
            location / {
               include uwsgi_params;
               uwsgi_pass 127.0.0.1:8001;  #端口要和uwsgi裏配置的同樣

            }
            
        }
}
  • 80是對外的端口號
  • server_name:nginx代理uwsgi對外的ip
  • 127.0.0.1:8001即當nginx收到80端口的請求時,直接將請求轉發給 127.0.0.1:8001

要留意備註的地方,要和UWSGI配置文件BlogProject_uwsgi.ini,還有項目路徑對應上。 
進入/usr/local/nginx/sbin/目錄
執行./nginx -t命令先檢查配置文件是否有錯:

若是出現上圖紅色方框的內容,則表明沒有錯,就執行如下命令,啓動nginx:

./nginx

或者執行:

/usr/local/nginx/sbin/nginx  #啓動nginx

終端沒有任何提示就證實nginx啓動成功。可使用你的服務器地址查看,成功以後就會看到一個nginx歡迎頁面。

留意:必定要注意Uwsgi和Nginx配置文件裏的項目路徑和靜態資源路徑,填寫正確了才能成功訪問。否則會出現502錯誤。還有就是,修改Django文件和其它配置文件以後,必定要重啓Uwsgi和Nginx,否則不生效。

以後,在settings.py裏設置:(若是以前在本地項目設置過,可不用再設置)

a、關閉DEBUG模式。

DEBUG = False  

b、ALLOWED_HOSTS設置爲* 表示任何IP均可以訪問網站。

ALLOWED_HOSTS = ['*']

9、訪問項目的頁面

1.啓動uwsgi

uwsgi --ini /home/BlogProject_uwsgi/BlogProject_uwsgi.ini

執行完命令,以下圖所示

查看uwsgi是否啓動

ps -aux | grep uwsgi

以下圖所示,表示uwsgi啓動成功。

以上步驟都沒有出錯的話。
進入/usr/local/nginx/sbin/目錄
執行:

./nginx -s reload

或者執行:

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

重啓nginx 。

執行命令,查詢nginx是否啓動

ps -aux | grep nginx

以下圖所示,表示nginx啓動成功。

而後在瀏覽器裏訪問你的項目地址!  (記得關閉系統防火牆或者在服務器安全組開放80端口)

訪問以前創建的文件夾BlogProject_uwsgi,能夠看到自動生成了日誌文件(BlogProject.log)和進程文件(master.pid)。

咱們能夠利用進程文件(master.pid)進行uwsgi的重啓,中止。

uwsgi --stop /home/BlogProject_uwsgi/master.pid  #關閉uwsgi進程

uwsgi --reload /home/BlogProject_uwsgi/master.pid  #從新加載uwsgi進程

 除了利用進程文件(master.pid)進行uwsgi的開啓,重啓,中止,uwsgi還有如下方法進行操做。

 Uwsgi和Nginx重啓方法:

ps -aux | grep uwsgi   ##查看Uwsgi進程,是否啓動
killall -9 uwsgi   #用kill方法把uwsgi進程殺死,而後啓動uwsgi
uwsgi --ini /home/BlogProject_uwsgi/BlogProject_uwsgi.ini  #啓動uwsgi 

ps -aux | grep nginx   ##查看nginx進程,是否啓動
killall -9 nginx      #用kill方法把nginx進程殺死
/usr/local/nginx/sbin/nginx  #啓動ngnix
/usr/local/nginx/sbin/nginx -s reload   #Nginx平滑重啓方法

關於線上部署admin後臺樣式沒有生效的問題:

方法一:

一、在settings.py尾部:

STATIC_ROOT  = os.path.join(BASE_DIR, 'BlogProject_collected')#指定樣式收集目錄

#或者

STATIC_ROOT = '/home/BlogProject/BlogProject_collected'  #指定樣式收集目錄 

 

二、收集CSS樣式,在終端輸入:

python manage.py collectstatic

運行這個命令以後,就會自動把後臺CSS樣式收集到/BlogProject_collected/目錄下,如圖所示。刷新頁面就能恢復樣式!

方法二:

在Python安裝目錄下(若是使用虛擬環境,則在虛擬環境目錄下)找到\Lib\site-packages\django\contrib\admin\templates目錄,把裏面的admin目錄複製到指定目錄便可。

注意:以上兩種方法在收集或複製前必定先在settings裏配置並指定STATIC_ROOT路徑,STATIC_ROOT路徑能夠本身定。指定的時候必定要在settings.py和nginx裏指定新的路徑。否則沒法生效。

 

關於圖片上傳不到服務器,500錯誤 :

緣由:上傳文件的目錄及其子目錄沒有寫的權限。

解決方法:運行如下代碼,給media目錄及其子目錄設定rwx權限。

chmod  -R  777  media  #-R表示遞歸設置權限

關於日誌文件的讀寫權限問題:

運行如下代碼, 給BlogProject_debug.log設定rw權限。

chmod 666  BlogProject_debug.log

相關文章
相關標籤/搜索