親測!!通過pycharm將Django專案部署到雲伺服器 uwsgi+nginx+mysql
前言: 前段時間為了幫大學生將專案部署起來,我又實踐了一遍,踩了各種坑,最後成功實現,文件寫的很詳細,
讀者可以進行一步操作,這次我使用的pycharm直譯器上傳到雲端,真的是超級方便,還可以修改程式碼後上傳到伺服器,然後到伺服器重啟下nginx就行。
這裡使用到技術 nginx+uwsgi+mysql 本篇沒有使用mysql主從和docker。 大家可以訪問 ip 47.103.98.8
1 遠端登入阿里雲伺服器(終端)
1 這裡我用的是macOS,可能命令會有所不同,不同系統的同學百度怎麼遠端登入。
2 在上一層目錄中 建立 /data 檔案,存放我們的專案目錄,在實際工作中我們的專案也是放在data目錄下
-
在當前的目錄返回上一層目錄
cd ..
檢視當前目錄ls
建立資料夾mkdir data
進入某一個資料夾cd
2 使用pycharm 將專案上傳到 遠端伺服器 /data 目錄中
注意只有Pycharm專業版才具有部署的功能,社群版(無需破解)是沒有此功能
新增配置,起個名字
以上都配置好了,然後我們將我們本地的專案上傳到遠端伺服器中
成功上傳
遠端登入伺服器下
3 遠端伺服器安裝所需專案的環境
1 安裝python3.6
一般的linux系統都會預設安裝python2.7,而現在python3已經大行其道,我們的專案也是使用python3的,所以我們來給雲主機安裝python3.6。
進入到終端伺服器中,我們先檢查一下雲主機目前的python版本,使用命令:python --version
,檢視:
提醒千萬不要將python2刪除,因為有些系統功能依賴python2,所以我們只要新增python3.6就可以
安裝步驟
1 apt-get install software-properties-common
1.1 sudo add-apt-repository ppa:jonathonf/python-3.6
2 更新系統軟體包並安裝python3.6.4
1、sudo apt-get update
2、sudo apt-get install python3.6
3 驗證是python3.6 安裝成功
python3.6 -V
安裝成功後需要更改預設python版本,現在輸入python還是顯示2.7版本,我們要改為預設3.6版本
root@Linux:~# which python
/usr/bin/python
root@Linux:~# which python3.6
/usr/bin/python3.6
root@Linux:~# cd /usr/bin/
root@Linux:/usr/bin# sudo rm python
root@Linux:/usr/bin# sudo ln -s /usr/bin/python3.6 /usr/bin/python
root@Linux:/usr/bin# PATH=/usr/bin/:$PATH
root@Linux:/usr/bin# python
Python 3.6.11 (default, Jun 29 2020, 05:15:03)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
root@Linux:/usr/bin#
2 安裝mysql
前言:後面我們的專案是用的mysql,所有此時我們需要在伺服器中安裝mysql,然後到我們的專案中的資料匯入進去,才能讓專案完整執行。 這裡我們的資料庫密碼是 python
sudo apt-get install mysql-server
等待提示設定密碼,此密碼是以後登入資料庫的密碼 python
重複上一步設定的密碼 python
安裝成功
2 安裝資料庫客戶端
sudo apt-get install mysql-client
3 sudo apt-get install libmysqlclient-dev
以上就安裝上了mysql 資料庫,讓我們進入測試資料庫是否成功
mysql -u root -p
提示輸入之前第一條命令設定的密碼,出現如下介面則安裝成功
檢視資料庫 show databases;
退出資料庫 exit()/quit
3 安裝Nginx
什麼是nginx?
1 nginx 是一個高效能HTTP伺服器和反向代理伺服器,最終的目的是實現網站的負載均衡;
2 nginx 作為web伺服器,對處理索引檔案和靜態檔案效率非常高,例如我們專案中的靜態檔案(HTML、CSS、JS)就交給nginx進行處理。
3 強大的反向代理和負載均衡功能,平衡叢集中各個伺服器的負載壓力。
1 安裝nginx
sudo apt-get install nginx
2 執行(啟動)nginx
nginx
3 伺服器檢視執行狀態 或瀏覽器開啟
curl 47.103.98.8:80
3 停止/重啟 nginx
nginx -s stop/reload
4 安裝uwsgi
概念:uWSGI 是一個 Web 伺服器,它實現了 WSGI 協議、uwsgi、http 等協議。Nginx 中 HttpUwsgiModule 的作用是與 uWSGI 伺服器進行交換。 簡單來說:uwsgi 是處理 web應用中的動態資源型別(資料庫的資源),uwsgi 會根據自己的uwsgi和WSGI協議 到對應的Django框架,Django框架下應用進行邏輯處理,然後將返回值進行傳送到uwsgi伺服器,然後uwsgi伺服器傳送給nginx伺服器,最後nginx伺服器將返回值給瀏覽器進行渲染展示給使用者。
安裝:
sudo apt-get install uwsgi
新增一個檔案test_uwsgi.py 到 manage.py 同級目錄下 測試uwsgi是否安裝成功:
# 測試py檔案
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
2 執行uwsgi測試 (在專案中下與manage同級):
uwsgi --http :8001 --wsgi-file test_uwsgi.py
# 顯示 [uWSGI] getting INI configuration from uwsgi.ini 表示執行uwsgi成功
測試uwsgi執行狀態是否正常 或 瀏覽器檢視 :
注意:這裡可能不會有response 響應,因為我們還要去阿里雲開啟安全組埠
curl 127.0.0.1:8001 # curl 是一種命令列工具,作用是發出網路請求,然後獲取資料,顯示在"標準輸出"(stdout)上面
檢視確認uwsgi程序是否啟動成功:
ps -ef|grep uwsgi
注意: 端口占用使用:
lsof -i :8001
kill佔用埠
sudo kill -9 pid # pid 埠號
4 Django專案啟動
前言:在專案啟動之前呢,我們最終要執行起來伺服器中的myslq、uwsgi,nginx,才能讓專案跑起,所以我們需要在阿里雲伺服器下先開放 對應的埠(安全組埠)才能成功讓專案跑起。
1 下載專案庫
-
安裝Django2.2
pip install Django==2.2
2 專案settings.py 配置
DEBUG = False # 改為False
# 填寫自己的域名或ip 或者直接*
ALLOWED_HOSTS = ["47.103.98.8"]
# 或者下面操作,接收全部 ------ 推薦這種
ALLOWED_HOSTS = ["*"]
# 資料庫更改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 資料庫引擎
'HOST': '47.103.98.8', # 資料庫主機
'PORT': 3306, # 資料庫埠---> 這裡要求阿里開放埠
'USER': 'root', # 資料庫使用者名稱
'PASSWORD': 'python', # 資料庫使用者密碼
'NAME': 'punch_system' # 資料庫名字
}
}
3 遠端配置mysql
上面已經開放了安全組3306埠,此時我們就需要將我們本地的資料庫匯入到雲伺服器中
1 編輯mysqld.cnf配置檔案
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
2.註釋掉bind-address = 127.0.0.1 然後儲存退出(vim操作,請查詢命令儲存退出)
3 連線資料庫進入資料庫
mysql -u root -p python
資料庫裡執行操作
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'python' WITH GRANT OPTION;
--> root 使用者名稱 ‘%’ 表示任何ip都可以訪問 BY ‘密碼’
flush privileges;
exit
退出
---------> 下面這句不是在資料庫裡執行
service mysql restart
重啟mysql伺服器
4 本地navicat 連線遠端資料庫,並上傳sql到遠端資料庫
5 新增一個數據表到遠端資料庫中
遠端資料庫檢視是否成功
6 將專案所需的資料庫新增到遠端資料中
看看遠端伺服器是否有此資料庫
4 遠端配置 uwsgi
在manage同級目錄 中建立一個uwsgi.ini 檔案,用來在雲伺服器執行 的uwsgi.ini
uswgi.ini檔案如下
[uwsgi]
;使用nginx連線時使用,Django程式所在伺服器地址
;選擇內網IP和埠
;http = :8001 # -- 這裡是 單獨uwsgi 執行開啟的
socket = 0.0.0.0:8001 # ----這裡是與nginx伺服器相通進行寫的
; 專案所在根目錄,與manage.py同級, 查詢自己存放的路徑, pwd (-----要修改為自己的路徑-----)
chdir = /data/mytest
; 環境所在目錄(-----要修改為自己的路徑-----) 使用which 'python3'
home = /usr/
PYTHONHOME = /usr/bin/
; 主應用中的wsgi檔案(-----要修改為自己的路徑-----)
wsgi-file = mysite/wsgi.py
; 啟動一個master程序,來管理其餘的子程序
master = True
# 程序
processes = 4
# 執行緒
threads = 2
; 儲存主程序的pid,用來控制uwsgi服務
pidfile = uwsgi.pid
; 設定後臺執行,儲存日誌
daemonize = uwsgi.log
--enable-threads
7 單獨啟動uwsgi 執行專案(不加nginx情況下)
# 啟動專案 uwsgi --ini uwsgi.ini
# uwsgi --stop/reload xxx.pid 停止/重啟uwsgi
# ps -ef|grep uwsgi 檢視確認是否uwsgi啟動
啟動
看到這裡,是能夠成功顯示了,但是沒有達到我們的預期呀,你看,js、css都沒有顯示出來呀,別擔心,這個時候我們可以新增nginx 來進行處理靜態檔案了,這樣你就知道nginx的強大了吧(其實也可以不加,只需在uwsgi.ini,處理靜態檔案就行)
8 uwsgi 還有一步,因為我們現在是單獨執行uwsgi,後面我們需要加nginx,所有把http停掉,stock開啟(在uwsgi.ini檔案中) 然後在上傳伺服器
5 新增nginx配置(實現負載均衡)
概念:nginx是一個HTTP伺服器和反向代理伺服器。是實現網站的負載均衡,減輕伺服器壓力, nginx處理靜態檔案(html、css、js)索引效率非常高。通常nginx是結合uwsgi一起使用的。
sudo apt-get update # 更新
sudo apt-get nginx
2 啟動nginx 預設開啟的是80埠
# 啟動
nginx
# 停止
nginx -s stop
# 重啟
nginx -s reload
可以檢視下nginx執行的程序
ps -ef|grep uwsgi
ps -ef # 檢視的是伺服器中所有執行的程序
kill 程序
sudo kill -9 pid # pid 埠號
可以通過瀏覽器訪問下 或者 使用 curl -I 112.124.18.209:80
顯示 200 OK 表示成功開啟
瀏覽器顯示的是:
3 查詢nginx路徑
nginx -t # 騰訊雲的同學要加sudo
# 第一個檔案路徑是等會我們要去新增配置的檔案
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful
修改nginx.conf 檔案 /etc/nginx/nginx.conf
使用sudo vim
nginx.conf配置檔案部分截圖內容:
注意重要的一點,這裡部分截圖的最後有兩行檔案
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
先說下原因: 因為nginx中有個預設配置檔案default, 裡面的預設監聽埠是80埠,那麼我們需要在阿里雲配置的埠也是80埠,此時就會出現上我們自身配置的80埠是起衝突的,也就是說最終我們配置好了nginx資訊,訪問的時候還是nginx最初的頁面 welcome to nginx
。 所以我們需要刪除掉nginx預設的配置檔案,讓nginx訪問我們配置的埠資訊。
步驟:
步驟:
cd 進入 /etc/nginx/sites-enabled/
路徑下能夠看到有個default檔案, 通過cat default
能夠看到預設配置資訊, 我們需要做的就是 刪除 或者 對檔案進行移動到上一層, mv deault ../
此時nginx就不會載入預設的配置了,通過curl 122.51.67.247:80
是不會訪問最初的配置了,而是顯示的拒絕連線的了。
現在我們要做的就是載入Nginx 配置資訊,在上面截圖 include /etc/nginx/sites-enabled/*;
下新增如下資訊,路徑你需要自己改成自己專案存放的路徑。
步驟:
2 vim 編輯 vim /etc/nginx/nginx.conf
(不行就加sudo) 進行新增配置
server {
# 監聽埠
listen 80;
# 伺服器域名或者ip地址 -- 沒有就填localhost
server_name localhost;
# 編碼
charset utf-8;
# 靜態檔案
location /static {
alias /data/mytest/static/;
}
# 主目錄
location / {
# 此處為uwsgi執行的ip地址和埠號
uwsgi_pass 47.103.98.8:8001; # 這裡請讀者修改自己的ip地址
include uwsgi_params;
}
}
3 配置好nginx資訊後 通過 nginx -t 檢測配置是否正確
# 測試nginx配置檔案是否正確
sudo nginx -t
# 如列印以下內容,表示配置沒有問題
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# 這時我們需要重新載入下nginx配置
sudo nginx -s reload
4 然後訪問 ip 地址就可以成功執行專案了,哈哈哈哈哈
5 、後期維護
後面我們需要改寫程式碼的時候,肯定要上傳到伺服器。那麼這裡選擇的是 pycahrm 直譯器進行上傳
粟子:
1 結合 2步驟 pycharm 專案上傳到阿里雲伺服器截圖
2 後期我們改動程式碼
栗子:
然後我們在伺服器中,需要重啟nginx 。
如果網站中還沒有看到我們改動程式碼後的效果的話
進入專案目錄 cd /data/mytest
重啟uwsgi之後,
uwsgi -- reload uwsgi.pid
再次重啟下nginx 。
nginx -s
最近訪問網站就可以看到改動的效果了。
6、額外篇 -- 從伺服器下載專案到本地
以上的操作,我是將django專案 上傳到了到伺服器中,然後你的話就不需要再次上傳到伺服器,避免衝突,你要做的就是,從伺服器中下載專案到我們的本地中,然後後期你要改程式碼的話那就直接上傳就行(看四、後期維護)
步驟一:pycharm 建立一個專案,用於存放我們從伺服器下載下來的檔案
第二、pycharm連線伺服器
起個名字
配置資訊
將專案下載到我們的本地
下載成功
7 uWsgi和Nginx伺服器之間如何配合工作
首先瀏覽器會發起一個http請求傳送到nginx伺服器,nginx根據接收到請求的包,進行url分析,判斷訪問的一個資源型別,如果判斷的是一個靜態型別,nginx會直接讀取靜態資源返回給瀏覽器進行展示,如果判斷請求的是一個動態資源型別的話,就會轉交給uwsgi伺服器,uwsgi伺服器會根據自身的wsgi和uwsgi協議,找到對應的django框架,Django框架下進行邏輯處理之後,再轉交給uwsgi伺服器,uwsgi伺服器在轉交給nginx伺服器,最後nginx伺服器將返回值給瀏覽器渲染展示給使用者