阿里雲部署Django專案(nginx+uWSGI)-2018.11

Mars_DD發表於2018-11-22

前言:部署的前提是你的專案已經在本地完成可以執行了,我的本地環境是ubuntu16.04+python3.5+Django2.1.2+Mysql,在python虛擬環境(virtualenv)下建的專案。阿里雲部署用的是nginx+uWSGI。

一、雲伺服器購買和配置

去阿里雲官網購買一臺雲伺服器ECS(Elastic Compute Service),可以直接支付寶掃碼登入。個人用的話入門級就可以了,我買的是1核2G的,原價還是挺貴的。個人練手的話1核1G應該也是夠用了,看實際需求。

 購買的時候會讓你選作業系統,因為我本地用的就是Ubuntu,所以選的ubuntu16.04  64位。除了作業系統選擇,還有幾個要設定的地方,等下說。先說下這個雲伺服器ECS(Elastic Compute Service)是個什麼東西,簡單的就可以把它理解為一臺電腦,我們租的一臺電腦,可以一直執行。我們可以通過遠端連線對它進行操作,只能通過終端命令操作,不能用滑鼠。

購買成功後進入控制檯→雲伺服器(ECS)→例項,就能看到你買的伺服器。上面的公網IP就是這臺伺服器所在的IP地址,部署成功後瀏覽器通過這個地址訪問你部署的專案。這裡還有兩個密碼要設定,一個是遠端連線的密碼,第一次點選上圖的遠端連線會出現一個6位數字密碼,只出現一次,所以要記住這個密碼,後面也可以修改。第二個是ubuntu登入的賬戶密碼,帳戶名預設為root,密碼需要設定。點選上圖的管理,點選更多-重置密碼 設定ubuntu登入密碼。

 除此之外還有一個要設定的就是安全組,設定允許訪問的埠。點選安全組--配置規則 進入如下介面,最下面三條是系統的預設設定。

 點選新增安全組規則進行埠新增,只需要填埠範圍和授權物件,比如80埠,埠範圍寫80/80,授權物件寫0.0.0.0/0,表示所有IP地址都能訪問。常用的幾個埠號,SSH(22),HTTP(80),HTTPS(443)。

 到此,雲伺服器的基本設定完成了。點選 例項頁面的遠端連線,輸入6位密碼,就可以遠端登入。然後會讓你輸入Ubuntu的賬戶名和密碼。輸入成功後就可以遠端登入ubuntu的終端,可以像在本地一樣通過各種命令操作。

 二、專案資料上傳和環境搭建

1、把我們本地Django專案工程檔案拷貝到阿里雲上

這裡要用到一個工具:Xftp,可以用來在本地和遠端Linux之間拷貝檔案。

進入官網,https://www.netsarang.com/products/xfp_overview.html 。點選Free License,填寫下姓名、郵箱就可以免費下載安裝。

 安裝成功後,開啟,點選左上角新建,主機 輸入你阿里雲的公網IP,確定。然後點選對話,輸入ubuntu的賬戶名,密碼,就可以實現本地和阿里雲的連線。

 左邊就是你的PC桌面,右邊是阿里雲ubuntu的root目錄。可以直接按住把檔案從左邊拖到右邊的資料夾中。因為本地是在虛擬機器中執行的ubuntu,專案檔案叫做myweb,先把檔案從ubuntu中拷貝到桌面,再從桌面拖到阿里雲ubuntu的home資料夾下。這裡還有一點設定是如何顯示ubuntu中的隱藏檔案,在工具欄--選項--顯示隱藏檔案。

 2、虛擬環境(virtualenv)的安裝

本地專案是建在python虛擬環境下的,所以在阿里雲上也要先建下虛擬環境。安裝如下步驟如下:

1、安裝virtualenv

sudo pip install virtualenv
sudo pip install virtualenvwrapper #安裝虛擬環境管理工具

2、在home下建立虛擬環境安裝目錄

mkdir .virtualenvs

3、為virtualenv配置環境變數,開啟.bashrc檔案,在末尾加上兩行程式碼,在阿里雲的ubuntu上,你想編輯檔案只能用vi/vim開啟,對於沒用過vi的話還是需要點時間學習的。或者你可以在本地pc編輯好,再用Xftp工具上傳覆蓋原來的檔案。

用vim開啟.bashrc ,一般就在home資料夾下

sudo vim ~/.bashrc

 在末尾新增兩行程式碼

export WORKON_HOME=$HOME/.virtualenvs  # 所有虛擬環境儲存的目錄
source /usr/local/bin/virtualenvwrapper.sh

使配置檔案生效

source ~/.bashrc

 4、建立虛擬環境,預設命令建立的是python2的虛擬環境,指定建立python3.5的虛擬環境可以使用以下命令

mkvirtualenv -p /usr/bin/python3.5  XX  #XX是虛擬環境的名字,建立python3.5的虛擬環境

其他命令:
workon xx    #進入虛擬環境XX
deactivate   #退出虛擬環境

 3、在虛擬環境中安裝相應的工具包

我們在本地寫django專案肯定是安裝了一堆相應的包,需要把他們移植到阿里雲上。首先在本地ubuntu進入虛擬環境,在專案根目錄下,執行以下命令收集安裝的包,就是生成一個包的清單檔案plist.txt。

pip freeze > plist.txt

 然後用xftp把這個plist.txt檔案上傳到阿里雲專案的根目錄home/myweb,然後進入虛擬環境test(test是我新建的虛擬環境的名字)。

workon test    #進入虛擬環境test

cd到plist.txt所在目錄
pip install -r plist.txt  #安裝txt檔案上的包

4、Mysql資料庫的安裝和資料的遷移 

安裝Mysql:輸入以下命令,安裝過程會設定密碼,設定成和原來本地一樣的,就不用在setting中修改了。

​sudo apt-get update
sudo apt-get install mysql-server 
sudo apt-get install mysql-client

建立資料庫:先登入資料庫, 然後建立資料庫v1,資料庫名字也建立成和原來本地一樣的,我的叫v1。

create database v1;

 資料的遷移:把本地資料庫中的資料複製到阿里雲上的資料庫中。先在本地生成備份檔案,v1是要備份的資料庫,v1.sql是生成的備份檔案。然後用Xftp把v1.sql檔案上傳到阿里雲。

mysqldump -u root -p v1 >v1.sql 

 資料還原:阿里雲終端 cd到v1.sql所在目錄,輸入以下命令

mysql -u root -p v1<v1.sql

 mysql配置:找到mysqld.cnf檔案註釋掉bind-address這一行

/etc/mysql/mysql.conf.d/mysqld.cnf   #配置檔案路徑

#bind-address		= 127.0.0.1   #註釋掉這一行

5、修改django的setting檔案:

DEBUG = False
ALLOW_HOSTS=['XXXXXX'] #改成阿里雲的公網IP

至此,我們已經完成了專案檔案遷移、環境建立、資料庫遷移 。可以在阿里雲的終端中執行Django專案,先進入虛擬環境,然後cd到專案目錄下,python manage.py runserver 看能不能啟動專案,如果可以說明專案本身已經沒有問題了。如果不能說明專案本身還有問題。有些包安裝好後需要設定配置檔案,看是不是沒設定。到目前為止的操作其實基本都和本地是一樣,下面我們要安裝兩個額外的東西,nginx和uWSGI。

三、nginx、uWSGI的安裝

在安裝前先了解下這幾個是什麼東西:WSGI、uWSGI、nginx。

WSGI:PythonWeb伺服器閘道器介面(Python Web Server Gateway Interface),這是一種協議規範,用於規範web server(比如uWSGI)和web application(Flask、Django等)之間的通訊方式。這種協議其實是將我們和更加底層的HTTP、TCP等協議分隔開來,使我們在開發的時候可以不用自己去實現這些協議的處理,只關注於更高層次的邏輯處理,實現物件導向的程式設計。

uWSGI:uWSGI是一個Web伺服器,它實現了WSGI協議、uwsgi、http等協議。它本身可以作為一個伺服器單獨使用,但是也可以和nginx組合使用。一般Django部署都是用的nginx+uWSGI,可以理解為這種組合效能更優。

nginx:這是一個高效能的web伺服器/反向代理,類似Apache。什麼叫反向代理,客戶端通過一個代理去訪問伺服器,這樣的代理叫正向代理;同樣的伺服器前加一個代理和客戶端通訊,這樣的代理叫反向代理。nginx就是用來放在uWSGI前做反向代理。

 我們在本地開發的時候沒有安裝過以上伺服器,但是也可以python manage.py  runserver執行專案,那是因為Django等框架自帶了WSGI伺服器,效能不強,可以用於除錯。

nginx安裝:

直接在終端安裝,不用裝在虛擬環境中,輸入以下命令:

sudo apt-get update
sudo apt-get install nginx

安裝成功後,用瀏覽器訪問你的阿里雲IP地址,可以看到以下提示 :

nginx常用命令:

service nginx start   #啟動
service nginx stop    #停止
service nginx reload  #重啟

nginx配置:開啟配置檔案default,路徑/etc/nginx/sites-available/default,設定以下內容。一個是server_name後面換成你的阿里雲公網IP,有的文章說不換也行。關鍵是下面2個location,第一個location是設定的和uWSGI的關聯。第二個location /static是設定的靜態檔案的路徑。如果你的專案還有media資料夾,那還要加一個location /media,把路徑設定上。注意:location 和alias後面有空格。

server_name 47.106.84.245;
        
        location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        # try_files $uri $uri/ =404;
        include  uwsgi_params;
                uwsgi_pass  127.0.0.1:8000;  
    }
        location /static {
               alias /home/myweb/static;
}

 更新(2018.11.26):

上面nginx配置靜態檔案有一個問題,就是上面的目錄/home/myweb/static只是我們自己的靜態檔案的目錄,你登入admin後發現admin頁面的樣式都丟失了。因為django自帶的admin的靜態檔案路徑沒有匯入。所以就需要新建一個資料夾,我的是/home/myweb/nginx/static,然後執行命令把整個專案的所有靜態檔案都收集到這個目錄下,再修改下上面的配置。

第一步:新建資料夾 /home/myweb/nginx/static

第二步:修改setting.py檔案,增加STATIC_ROOT

STATIC_ROOT='/home/myweb/nginx/static/'    #新增收集靜態檔案的目錄
STATIC_URL = '/static/'
STATICFILES_DIRS=(
os.path.join(BASE_DIR,'static'),   
)

第三步:執行以下程式碼收集靜態檔案

python manage.py collectstatic

 第四步:修改nginx的配置

 location /static {
               alias /home/myweb/nginx/static;
}

uWSGI安裝:

這個是安裝在虛擬環境中,先workon test進入虛擬環境,安裝uWSGI前需要先安裝依賴,輸入以下命令完成安裝

apt-get install build-essential python
apt-get install python-dev
pip install uwsgi

配置uWSGI:在django專案的根目錄下,新建兩個檔案,uwsgi.ini和run.log 。第一個是uWSGI的配置檔案,第二個是日誌記錄檔案。設定uwsgi.ini檔案如下:

[uwsgi]
chdir = /home/myweb                
module = myweb.wsgi:application 
socket = 127.0.0.1:8000            
master = true         
daemonize = /home/myweb/run.log
disable-logging = true
wsgi-file = /home/myweb/myweb/wsgi.py
pidfile=/home/myweb/uwsgi.pid

chdir是django專案所在目錄,socket後面的地址是和上面nginx配置檔案中的地址uwsgi_pass  127.0.0.1:8000對應的,規定nginx和uWSGI之間的通訊埠。daemonize就是日誌檔案的路徑。disable-logging = true 表示不記錄正常資訊,只記錄錯誤資訊。wsgi-file是你django專案根目錄下專案同名目錄中有一個wsgi.py檔案的路徑。pidfile是uwsgi.pid檔案的路徑,這個檔案是uWSGI執行後自動生成的,裡面記錄了uWSGI的程式號,可以用來重啟uWSGI。但是我的uwsgi.pid檔案記錄的程式號老是不對,用不了。

uWSGI基本命令:

啟動:uwsgi --ini uwsgi.ini
停止:uwsgi --stop uwsgi.pid
重啟:uwsgi --reload uwsgi.pid

全部配置好後,重啟nginx和uWSGI,因該就可以用瀏覽器訪問你的專案了。

以下是我部署的django專案,前端基本是用的現成的,一些js和後端是自己寫的。 

 http://47.106.84.245/

水平有限如有問題,望指正。

參考文章:

https://blog.csdn.net/qq_41590417/article/details/80509098

 

 

 

 

相關文章