親測!!通過pycharm將Django項目部署到雲服務器 uwsgi+nginx+mysql


前言: 前段時間為了幫大學生將項目部署起來,我又實踐了一遍,踩了各種坑,最后成功實現,文檔寫的很詳細,
讀者可以進行一步操作,這次我使用的pycharm解釋器上傳到雲端,真的是超級方便,還可以修改代碼后上傳到服務器,然后到服務器重啟下nginx就行。
這里使用到技術 nginx+uwsgi+mysql 本篇沒有使用mysql主從和docker。 大家可以訪問 ip 47.103.98.8

1 遠程登錄阿里雲服務器(終端)

1 這里我用的是macOS,可能命令會有所不同,不同系統的同學百度怎么遠程登錄。

image-20200802111032538

2 在上一層目錄中 創建 /data 文件,存放我們的項目目錄,在實際工作中我們的項目也是放在data目錄下

  • 在當前的目錄返回上一層目錄 cd .. 查看當前目錄 ls 創建文件夾 mkdir data 進入某一個文件夾 cd

    image-20200802111957145

2 使用pycharm 將項目上傳到 遠程服務器 /data 目錄中

注意只有Pycharm專業版才具有部署的功能,社區版(無需破解)是沒有此功能

image-20200729173829772

添加配置,起個名字

image-20200729173929231

image-20200802113304423

image-20200802113916087

以上都配置好了,然后我們將我們本地的項目上傳到遠程服務器中

image-20200802114629410

成功上傳

image-20200802115048136

遠程登錄服務器下

image-20200802115248040

image-20200802115423220

3 遠程服務器安裝所需項目的環境

1 安裝python3.6

一般的linux系統都會默認安裝python2.7,而現在python3已經大行其道,我們的項目也是使用python3的,所以我們來給雲主機安裝python3.6。

進入到終端服務器中,我們先檢查一下雲主機目前的python版本,使用命令:python --version,查看:

image-20200802120144911

提醒千萬不要將python2刪除,因為有些系統功能依賴python2,所以我們只要添加python3.6就可以

安裝步驟

1 apt-get install software-properties-common

1.1 sudo add-apt-repository ppa:jonathonf/python-3.6

image-20200802122356237

2 更新系統軟件包並安裝python3.6.4

1、sudo apt-get update
2、sudo apt-get install python3.6

3 驗證是python3.6 安裝成功

python3.6 -V

image-20200802125434757

安裝成功后需要更改默認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# 

image-20200802125938837

2 安裝mysql

前言:后面我們的項目是用的mysql,所有此時我們需要在服務器中安裝mysql,然后到我們的項目中的數據導入進去,才能讓項目完整運行。 這里我們的數據庫密碼是 python

sudo apt-get install mysql-server

image-20200802131418847

等待提示設置密碼,此密碼是以后登錄數據庫的密碼 python

image-20200802131509888

重復上一步設置的密碼 python

image-20200802131546053

安裝成功

image-20200802131657959

2 安裝數據庫客戶端

sudo apt-get install mysql-client

image-20200802131746565

3 sudo apt-get install libmysqlclient-dev

image-20200802131836599

以上就安裝上了mysql 數據庫,讓我們進入測試數據庫是否成功

mysql -u root -p

提示輸入之前第一條命令設置的密碼,出現如下界面則安裝成功

image-20200802132051189

查看數據庫 show databases; 退出數據庫 exit()/quit

image-20200802132153662

3 安裝Nginx

什么是nginx?

1 nginx 是一個高性能HTTP服務器和反向代理服務器,最終的目的是實現網站的負載均衡;

2 nginx 作為web服務器,對處理索引文件和靜態文件效率非常高,例如我們項目中的靜態文件(HTML、CSS、JS)就交給nginx進行處理。

3 強大的反向代理和負載均衡功能,平衡集群中各個服務器的負載壓力。

1 安裝nginx

sudo apt-get install nginx

image-20200802133308448

2 運行(啟動)nginx

nginx

image-20200802133406085

3 服務器查看運行狀態 或瀏覽器打開

curl 47.103.98.8:80

image-20200802133649793

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

image-20200802134338927

image-20200802134541937

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,才能讓項目跑起,所以我們需要在阿里雲服務器下先開放 對應的端口(安全組端口)才能成功讓項目跑起。

image-20200802173319862

image-20200802174511699

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操作,請查找命令保存退出)

image-20200802193234949

3 連接數據庫進入數據庫

mysql -u root -p python

image-20200802194047999

數據庫里執行操作

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'python' WITH GRANT OPTION; --> root 用戶名 ‘%’ 表示任何ip都可以訪問 BY ‘密碼’

flush privileges;

exit 退出

---------> 下面這句不是在數據庫里執行

service mysql restart 重啟mysql服務器

image-20200802194247005

image-20200802194352930

4 本地navicat 連接遠程數據庫,並上傳sql到遠程數據庫

image-20200802194925803

image-20200802195331133

5 添加一個數據表到遠程數據庫中

image-20200802195446241

遠程數據庫查看是否成功

image-20200802195609270

6 將項目所需的數據庫添加到遠程數據中

image-20200802202547455

image-20200802202625510

看看遠程服務器是否有此數據庫

image-20200802203458992

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

image-20200802175048366

image-20200802203539275

7 單獨啟動uwsgi 運行項目(不加nginx情況下)

# 啟動項目 uwsgi --ini uwsgi.ini
# uwsgi --stop/reload xxx.pid  停止/重啟uwsgi
# ps -ef|grep uwsgi 查看確認是否uwsgi啟動

image-20200802203746992

啟動

image-20200802203835413

image-20200802203928980

看到這里,是能夠成功顯示了,但是沒有達到我們的預期呀,你看,js、css都沒有顯示出來呀,別擔心,這個時候我們可以添加nginx 來進行處理靜態文件了,這樣你就知道nginx的強大了吧(其實也可以不加,只需在uwsgi.ini,處理靜態文件就行)

image-20200802210119735

8 uwsgi 還有一步,因為我們現在是單獨運行uwsgi,后面我們需要加nginx,所有把http停掉,stock開啟(在uwsgi.ini文件中) 然后在上傳服務器

image-20200802211715126

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 表示成功開啟

瀏覽器顯示的是:

屏幕快照 2019-12-19 下午6.28.52

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配置文件部分截圖內容:屏幕快照 2019-12-20 下午2.59.28

注意重要的一點,這里部分截圖的最后有兩行文件

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/*; 下添加如下信息,路徑你需要自己改成自己項目存放的路徑。

步驟:

Xnip2020-07-31_17-12-01

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;
         }
}

image-20200802211349876

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 后期我們改動代碼

栗子:

Xnip2020-07-31_18-09-50

Xnip2020-07-31_18-11-05

然后我們在服務器中,需要重啟nginx 。

Xnip2020-07-31_18-14-08

如果網站中還沒有看到我們改動代碼后的效果的話

進入項目目錄 cd /data/mytest

Xnip2020-07-31_18-21-48

重啟uwsgi之后,

uwsgi -- reload uwsgi.pid

Xnip2020-07-31_18-22-26

再次重啟下nginx 。

nginx -s

最近訪問網站就可以看到改動的效果了。

6、額外篇 -- 從服務器下載項目到本地

以上的操作,我是將django項目 上傳到了到服務器中,然后你的話就不需要再次上傳到服務器,避免沖突,你要做的就是,從服務器中下載項目到我們的本地中,然后后期你要改代碼的話那就直接上傳就行(看四、后期維護)

步驟一:pycharm 創建一個項目,用於存放我們從服務器下載下來的文件

Xnip2020-07-31_19-43-34

第二、pycharm連接服務器

起個名字

image-20200729173929231

配置信息

image-20200729174439593

image-20200729174717052

將項目下載到我們的本地

Xnip2020-07-31_19-53-47

下載成功

Xnip2020-07-31_19-57-14

7 uWsgi和Nginx服務器之間如何配合工作

首先瀏覽器會發起一個http請求發送到nginx服務器,nginx根據接收到請求的包,進行url分析,判斷訪問的一個資源類型,如果判斷的是一個靜態類型,nginx會直接讀取靜態資源返回給瀏覽器進行展示,如果判斷請求的是一個動態資源類型的話,就會轉交給uwsgi服務器,uwsgi服務器會根據自身的wsgi和uwsgi協議,找到對應的django框架,Django框架下進行邏輯處理之后,再轉交給uwsgi服務器,uwsgi服務器在轉交給nginx服務器,最后nginx服務器將返回值給瀏覽器渲染展示給用戶


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM