最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue+django項目部署全過程

 更新時間:2026年02月05日 08:51:35   作者:Wanncye  
文章介紹了如何部署一個多服務器架構的項目,包括前端Vue和后端Django的部署,以及如何使用Nginx進行反向代理和負載均衡,數(shù)據(jù)庫的主從復制和集群配置,以及靜態(tài)文件和反向代理的配置

部署相關概念

項目服務器架構

我們希望別人能夠訪問到我們的項目,包括界面,以及處理客服端發(fā)過來請求的API,這就需要我們把項目放到公網(wǎng)上面。

一般的服務器架構如上圖:

  • 把vue客戶端放到一個服務器中,供用戶來訪問靜態(tài)頁面。
  • 把django服務器端放到另外一個服務器,為用戶提供服務。但是會存在一個問題:開發(fā)的時候環(huán)境一般都是單線程的,而且django大概只支持4-5萬的同時訪問量(并發(fā)量),那么,如果只有一臺django服務器,當有好多人來請求服務器的時候,服務器就崩潰了。解決放案就是把服務端分放在多個服務器中,分擔高并發(fā)壓力。把服務端分放在多個服務器上,又會產(chǎn)生一個問題:客服端發(fā)送的請求怎么知道它自己該訪問哪一個服務器呢?這就需要在客戶端搭建一個Nginx服務器來做請求轉發(fā),把這個問題交由Nginx來思考,后面會細講Nginx。
  • 把數(shù)據(jù)庫單獨存放在一個服務器上。根據(jù)實際的生產(chǎn)情況,我們得出結論:大部分項目中的數(shù)據(jù)庫操作,90%為讀操作,10%為寫操作,且寫操作一般是項目內部人員執(zhí)行。因此,我們可以把數(shù)據(jù)庫分成主庫和從庫,配置不同的性能,主庫負責寫,從庫負責讀,提升數(shù)據(jù)庫性能。但是將數(shù)據(jù)庫分庫了,數(shù)據(jù)庫之間怎么保證數(shù)據(jù)同步呢?這個問題需要下去查查。為了保證項目運行的穩(wěn)定性,大公司還會有數(shù)據(jù)庫集群操作,也就是當一組數(shù)據(jù)庫服務器掛了,還有一組備用的服務器能夠頂上來,使得服務沒有中斷期。
  • 還可以有的劃分是:靜態(tài)文件服務器、Redis數(shù)據(jù)庫服務器等~

反向代理

  • 代理:客戶端不能夠直接找到服務器來處理自己的請求,代理就起到幫客戶端查找服務器在哪里的作用。
  • 正向代理:客戶端把請求發(fā)送給代理,代理找到服務器并發(fā)請求轉發(fā)服務器端,服務器把結果返回給客戶端。這個流程就是正向代理,上左圖。由于防火墻的原因,我們并不能直接訪問谷歌,那么我們可以借助VPN來實現(xiàn),這就是一個簡單的正向代理的例子。這里你能夠發(fā)現(xiàn),正向代理“代理”的是客戶端,而且客戶端是知道目標的,而目標是不知道客戶端是通過VPN訪問的。
  • 反向代理:客戶端只向代理詢問服務器在哪里而不把請求頁轉給代理,代理把服務器的位置告訴客戶端后,客戶端自己發(fā)送請求給服務器。(前面是自己的理解)這個過程就是反向代理,上右圖。別人的理解可能會更好一些:當我們在外網(wǎng)訪問百度的時候,其實會進行一個轉發(fā),代理到內網(wǎng)去,這就是所謂的反向代理,即反向代理“代理”的是服務器端,而且這一個過程對于客戶端而言是透明的。

前端部署

如果要讓nginx運行起vue項目,需要將項目打包,生成原生的js代碼。自動化程序會將打包的文件自動生成到項目的dist文件夾中:

npm run build

上面這個命令是用之前安裝的webpack來進行打包的。 

存在一個問題,每一次新的部署,我們都需要重新配置環(huán)境,安裝這個軟件、安裝那個工具,這樣會很繁瑣,項目維護起來也不是很方便,所以我們引入docker。

它能夠在容器中配置環(huán)境,就相當于一個操作系統(tǒng),別人要運行我們的項目時,不需要再安裝項目需求的依賴,只需要把我們的這個容器安裝好,里面就自帶了項目需要的依賴,很是方便。

docker

前面說了docker是拿來干什么用的,這里再說說docker的一些特點吧:

  • “Build, Ship and Run”(搭建、運輸、運行)
  • “Build once,Run anywhere”(一次搭建,到處運行)

還是那句話,別人要運行你的項目的時候,直接安裝你的docker就行了。

docker相關的概念如上圖,我們在下面做一下講解:

  • 鏡像:還沒有運行起來的操作系統(tǒng)文件叫做鏡像。每一個鏡像中都包含了一個微型操作系統(tǒng),但只會安裝一些運行項目相關的依賴。我們可以從同事手中,或者開源社區(qū)獲取到自己想要的鏡像。自己也可以把自己創(chuàng)建的docker分享給別人。
  • 容器:鏡像運行的地方就是容器。這個容器我們不能提供給別人,但是我們可以進入這個容器進行一些相關依賴安裝。就可以想象成一臺電腦,我們能夠在電腦上安裝python 、c++、npm。在我們安裝好相應的依賴之后,需要將當前的容器狀態(tài)保存成鏡像,這樣我們又能夠提供給別人了。

docker安裝(mac)

使用常見命令

# 啟動docker
sudo service docker start

# 停止docker
sudo service docker stop

# 重啟docker
sudo service docker restart

# 列出鏡像
docker image ls

# 拉取鏡像
docker image pull library/hello-world

# 刪除鏡像
docker image rm 鏡像id/鏡像ID


# 創(chuàng)建容器,必須先有鏡像,才能運行創(chuàng)建容器,如果不指定任何參數(shù),容器開機了馬上就回關機
docker run [選項參數(shù)] 鏡像名 [命令]
# 例如:使用ubuntu鏡像,創(chuàng)建一個名為ubuntu1
docker pull ubuntu:18.04
docker run -it --name=ubuntu1 ubuntu:18.04 bash
# 注意:必須啟動的時候,讓容器運行bash解析器,才能在接下來的操作讓容器不會立刻關閉,而且也能夠讓我們可以輸入linux終端命令, 如果我們一般創(chuàng)建一個容器,選項都是: -itd
# docker run的選項
# -t 表示容器啟動后會進入其命令行終端
# -i 表示以“交互模式”運行容器
# --name 表示設置容器的名稱
# -d 創(chuàng)建一個守護式容器在后臺運行(這樣創(chuàng)建容器后不會自動登錄容器,如果只加-i -t 兩個參數(shù),創(chuàng)建后就會自動進去容器)
# 例如,使用ubuntu鏡像,創(chuàng)建一個名為ubuntu2,并且在后臺運行的容器像
docker run -itd --name=ubuntu2 ubuntu<:版本> ubuntu

# 進入容器,要進入容器,必須當前容器是啟動狀態(tài)的
docker container exec -it <容器名稱/容器ID>  <第一個命令>

# 所有正在啟動運行的容器
docker container ls

# 所有容器[不管是否在啟動運行中]
docker container ls --all                

# 停止一個已經(jīng)在運行的容器
docker container stop 容器名或容器id

# 啟動一個已經(jīng)停止的容器
docker container start 容器名或容器id

# kill掉一個已經(jīng)在運行的容器
docker container kill 容器名或容器id

# 刪除容器
docker container rm 容器名或容器id

# 把容器保存成鏡像
docker commit <容器名稱/容器ID>  <新鏡像名>

# 把docker中的鏡像打包成文件,用于分享發(fā)送給他人,或備份
docker save -o <文件名.tar.gz>  <鏡像名>

# 把鏡像文件加載到docker中
docker load -i <文件名.tar>


#官方提供的ubuntu系統(tǒng)鏡像,工具命令很少,如希望內部安裝ping、ifconfig網(wǎng)卡或者vim等工具,可以通過以下命令進行設置[需要聯(lián)網(wǎng),而且耗時]
apt-get update
apt install net-tools        # ifconfig 
apt install iputils-ping     # ping

nginx

Nginx是一款基于異步框架的輕量級/高性能的Web 服務器/反向代理服務器/緩存服務器/電子郵件(IMAP/POP3)代理服務器,并在一個BSD-like協(xié)議下發(fā)行。

由俄羅斯的程序設計師Igor Sysoev(伊戈爾·賽索耶夫)所開發(fā),最初供俄國大型網(wǎng)站Rambler.ru及搜尋引擎Rambler使用。

有如下功能:

  • 反向代理,前面說過了
  • 因為可以反向代理,所以能夠做負載均衡。所謂負載均衡就是在并發(fā)量很高的情況下,nginx可以讓平均每個后端服務器接受的請求量。
  • 熱部署。所謂熱部署,就是配置文件nginx.conf修改后,不需要stop Nginx,不需要中斷請求,就能讓配置文件生效!

下載安裝nginx鏡像

# 在docker中下載nginx鏡像
docker image pull nginx

# 把前面使用npm run dev創(chuàng)建好的dist文件夾按下面的命令運行
# 創(chuàng)建nginx容器,并以80端口對外提供服務
# /usr/share/nginx/html 是nginx在安裝時,系統(tǒng)默認分配的網(wǎng)站項目的根目錄
docker run  -itd -p 80:80 -v /home/luffy/lufei_pc/dist:/usr/share/nginx/html --name=lufei_pc nginx
# 執(zhí)行上面的命令,理論上來說,就可以讓前端項目在公網(wǎng)的IP地址訪問到了。

其中docker run的參數(shù)值得說一說:

docker run 選項:

  • -v 目錄映射,把服務器中的真實目錄,映射到 容器內部的指定目錄,當容器內部操作指定目錄時,則相當于操作服務器里面的真實目錄
  • -p 端口映射,把服務器中的真實端口,映射到 容器內部的執(zhí)行端口,當用戶訪問/操作真實端口時,則相當于訪問/操作容器里面的端口

上面部署命令之后,我們就可以通過IP來訪問項目了,但是我們項目一般通過域名提供給用戶來進行訪問的。

?

域名解析

通過上面的步驟,我們可以通過訪問IP地址來得到前端頁面,但是如果有多個域名同時都指向這個服務器,則所有的域名都會訪問到同一個項目中,所有我們把不同的域名和不同的項目目錄進行配置綁定。

這里就需要手動配置nginx的配置了:

# 進入nginx容器,修改/etc/nginx/conf.d/default.conf文件
# 要在容器里面編輯文件,可以通過 apt-get update 和 apt install vim 來安裝一個編輯器。
docker container exec -it <容器名稱/容器ID> bash
vim /etc/nginx/conf.d/default.conf
# 修改 server_name 對應的路徑
server{
  listen   80;
  server_name  3w.lxh1.com;
  
  # ...
}

# 按Esc鍵
# 輸入 :wq 保存文件

# 重啟nginx
nginx -s reload

后端部署

根據(jù)我們之前分析的項目部署架構,后端需要需要mysql和redis。所有再此我們需要先把這些外部工具先預裝。

MySQL鏡像

# 如果之前的mysql已經(jīng)鏡像沒有下載,則下載命令如下:
docker image pull mysql:5.7
# -e 設置容器內部的環(huán)境變量,一個容器在創(chuàng)建的時候,可以多個不同的環(huán)境
# 啟動mysql容器,MYSQL_ROOT_PASSWORD 指代的就是mysql的root用戶的登錄密碼
docker run -itd -p3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 如果需要多臺mysql容器安裝在一臺服務器中,那么容器內部的端口可以不用設置,但是真實物理系統(tǒng)的端口必須要修改,保證端口唯一!

# 我們可以在任意一個外部網(wǎng)路中,遠程鏈接到數(shù)據(jù)庫中
# 注意使用命令遠程鏈接mysql,必須使用的地方有mysql
mysql -hIP -P端口 -uroot -p密碼
# mysql -uroot -p123456 -h39.108.60.95

值得注意的是docker container run的選項:

-e 就是設置容器內部的環(huán)境變量, 在docker容器的使用過程中, 有部分容器需要配置環(huán)境的,這些環(huán)境變量都是有下載鏡像時官方指定的。

接著把數(shù)據(jù)庫中的數(shù)據(jù)導入到服務器的docker中:

# 遠程鏈接數(shù)據(jù)庫
mysql -uroot -p123456 -h39.108.60.95`在這里插入代碼片`
# 創(chuàng)建數(shù)據(jù)庫
create database luffy charset=utf8mb4;
exit
# 把本地的數(shù)據(jù)庫導出到桌面
mysqldump -uroot -p123 luffy > ~/Desktop/luffy.sql

# 把桌面下導出的數(shù)據(jù)庫文件導入到docker容器中的mysql數(shù)據(jù)庫
mysql -uroot -p123456 -h39.108.60.95 luffy <  ~/Desktop/luffy.sql

Redis鏡像

# 因此我們需要在docker中下載redis和mysql的容器
docker pull redis

# 創(chuàng)建redis容器并運行redis
docker run -itd -p6379:6379 redis
    
# 可以進入到容器中,進行測試redis是否已經(jīng)成功啟動
docker container exec -it <容器名稱/容器ID> bash

# 容器內部,執(zhí)行 redis-cli

部署前處理

  • 現(xiàn)在的配置,保存在dev.py中,不管數(shù)據(jù)庫密碼或者redis的地址或者配置信息都是屬于開發(fā)階段,項目上線以后,肯定換成公司的。所以一定會修改,我們需要把dev.py的內容移動到prod.py中,并修改對應的配置信息
  • 在本地開發(fā)時,我們使用的框架運行在debug模式下的,但是項目上線時,會關閉debug,所以我們如果關閉了debug模式,則drf框架會不再提供靜態(tài)文件的瀏覽服務,也就是之前xadmin,drf的接口頁面的圖片,樣式或者js文件都不能訪問到了。我們需要收集這些文件到外界,后面通過nginx來對外提供瀏覽服務
  • 原來的drf項目是運行在python內置的提供的web服務器中,wsgiref
  • 在項目上線的時候,我們不能使用這個模塊來提供對外服務!不支持多線程,性能不好,本身在安全性上并不完善,python提供這個模塊僅供學習和開發(fā)測試使用。runserver 不能用于生產(chǎn),改成uwsgi
  • 原來drf項目在本地開發(fā)時,其實要運行這個項目,我們是安裝了很多的以來模塊。將來項目上線了,我們也肯定需要把本地的模塊同步到線上服務器!否則項目跑不起來

從服務端項目中收集靜態(tài)文件

當Django運行在生產(chǎn)環(huán)境中,我們會關閉debug調試,那么項目將不再提供靜態(tài)文件的支持,需要將靜態(tài)文件交給靜態(tài)文件的nginx服務器來提供訪問。

我們先收集所有靜態(tài)文件。項目中的靜態(tài)文件除了我們使用的上傳文件之外,django本身還有自己的靜態(tài)文件,如rest_framework、xadmin、admin、ckeditor等。我們需要收集這些靜態(tài)文件,集中一起放到靜態(tài)文件服務器中。

我們要將收集的靜態(tài)文件放到項目的static目錄中,所以先創(chuàng)建目錄static。

Django提供了收集靜態(tài)文件的方法。先在配置文件中配置收集之后存放的目錄

settings/prod.py和dev.py ,代碼:

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'static')

因為目前在本地我們依然使用了dev.py文件運行項目,所以我們在本地項目收集靜態(tài)文件就需要把配置信息同步到dev.py。

在終端下執(zhí)行收集命令

python manage.py collectstatic

uwsgi服務器執(zhí)行django項目

安裝uwsgi

pip install uwsgi
uwsgi --version

修改配置

在luffyapi下的wsgi.py中修改:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy.settings.prop')

配置uwsgi.ini

在項目根目錄下創(chuàng)建uwsgi.ini,寫入:

[uwsgi]
#使用nginx連接時使用,Django程序所在服務器地址
# socket=0.0.0.0:8000
#直接做web服務器使用,Django程序所在服務器地址
http=0.0.0.0:8000
#項目目錄
chdir=/home/moluo/luffyapi
#項目中wsgi.py文件的目錄,相對于項目目錄
wsgi-file=luffycity/wsgi.py
# 進程數(shù)
processes=4
# 線程數(shù)
threads=2
# uwsgi服務器的角色
master=True
# 存放進程編號的文件
pidfile=uwsgi.pid
# 日志文件,因為uwsgi可以脫離終端在后臺運行,日志看不見。我們以前的runserver是依賴終端的
daemonize=uwsgi.log
# 指定依賴的虛擬環(huán)境
virtualenv=/root/.virtualenvs/luffy

啟動uwsgi服務器

uwsgi --ini uwsgi.ini

容器中配置運行環(huán)境

  1. pip freeze導出項目依賴,用pip install在容器中安裝相關依賴
  2. 安裝好python等環(huán)境之后,使用uwsgi --ini uwsgi.ini來啟動uwsgi,通過使用uwsgi作為http服務器先,后面再使用nginx來代理。

靜態(tài)文件的訪問支持

因為之前在前端項目部署的時候,已經(jīng)有了一個nginx容器,所以我們接下來,就直接讓前端的nginx容器同時提供靜態(tài)文件的訪問支持。

進入前端nginx容器并在nginx的配置文件default.conf里面的server部分中配置提供靜態(tài)文件的訪問!先刪除前端的vue項目的容器,然后再創(chuàng)建一個新的nginx容器,同時在創(chuàng)建的時候,我們進行目錄映射。

前端項目要映射到容器,同時還要把api項目的static靜態(tài)文件目錄也要映射到該容器中。

# 先把現(xiàn)有的前端nginx容器打包成鏡像
docker commit  lufei_pc  front

# 停止并刪除前端nginx服務容器
docker container stop lufei_pc
docker container rm lufei_pc

# 基于上面的front鏡像重新創(chuàng)建一個容器。
# 真實服務器下的客戶端vue項目目錄     /home/luffy/lufei_pc/dist 
# 真實服務器下的服務端drf項目目錄     /home/luffy/luffyapi/static
docker run -itd -p 80:80 -v /home/luffy/lufei_pc/dist:/usr/share/nginx/html -v /home/luffy/luffyapi/static:/usr/share/nginx/static --name=lufei_pc front

創(chuàng)建完容器以后,通過訪問客戶端url地址,沒有問題以后,我們接下里就要在前端容器中編寫nginx的配置文件,寫上提供靜態(tài)文件訪問支持的配置信息.配置文件default.conf,內容如下:

upstream luffy {
    server 120.77.220.233:8000;
    # server 120.77.220.233:8001;
}

server {
    listen  80;
    server_name api.lxh1.com;

    location / {
        include uwsgi_params;
        uwsgi_pass luffy;
    }
    
    location /static {
        root /usr/share/nginx;
    }
    
}


server {
    listen       80;
    server_name  3w.lxh1.com;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

重啟nginx,使用shop.lxh1.com訪問運營后臺,樣式就正常了。

nginx -s reload.重啟nginx,重新訪問。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論

德化县| 炉霍县| 师宗县| 高邑县| 巴林左旗| 寿光市| 深水埗区| 将乐县| 芜湖县| 利川市| 横山县| 句容市| 临海市| 彰化县| 桓仁| 鲜城| 大方县| 兴国县| 山阴县| 达州市| 胶南市| 房山区| 四川省| 阳泉市| 资源县| 临猗县| 松滋市| 景东| 江油市| 五台县| 连平县| 河津市| 佛冈县| 大兴区| 全南县| 大理市| 兴安盟| 武冈市| 江达县| 东乌珠穆沁旗| 玛纳斯县|