是時候讓你們看看你用django寫出來的博客了(內含部署教程視頻)

做者:HelloGitHub-追夢人物css

文中涉及的示例代碼,已同步更新到 HelloGitHub-Team 倉庫html

博客的基礎功能已經開發的差很少了,雖然還有不少地方能夠完善,但咱們仍是但願早點把博客部署到服務器上,讓他人能夠經過外網訪問。至於有待完善的地方,能夠等部署完後一點點地迭代和改進。如今就讓咱們來把博客部署到服務器上吧!python

↓↓↓ 視頻在這裏 ↓↓↓jquery

做者親自錄製的真機環境演示部署全過程,再不成功你打我!linux

B 站演示(阿里雲 CentOS 7 系統)觀看地址:www.bilibili.com/video/av680…nginx

注意:本文的每個步驟都在真實環境下驗證無誤。除非你知道本身在作什麼,不然建議每一步均嚴格按照教程的指導來,這樣能保證你順利完成部署。git

部署前準備

咱們將使用比較流行的 Nginx + Gunicorn 的方式將 django 開發的博客部署到本身的服務器,讓別人可以經過域名訪問你的博客。至於 Nginx、Gunicorn 是什麼暫時放到一邊,讀完本教程後你就會知道它們的做用和使用方法了。github

爲了部署咱們的博客,須要知足如下兩個條件:web

  1. 最好有一臺能夠經過外網訪問的服務器(若是沒有的話能夠在本身的電腦上建一臺虛擬機,經過虛擬 ip 訪問)。
  2. 最好有一個域名(若是沒有的話,則只能使用 ip 訪問,且不能開啓 HTTPS)。

配置服務器

本教程使用的本地環境爲 Windows 10,服務器環境爲 CentOS 7(64 位)。若是你的環境和個人有所差別(好比 Ubuntu)致使一些命令沒法執行,將這些命令轉換爲你所在環境的命令執行便可,重點在於理解每一步的做用,這樣不管在何種環境你都能成功地完成部署,而不是機械地複製粘貼命令。sql

遠程登陸到服務器

服務器一般位於雲端,須要使用遠程登陸工具登陸後才能對服務器進行操做。我使用的是 Xshell,Windows 下百度 Xshell 下載安裝便可,軟件對學校和我的用戶是免費的。

如何遠程登陸到服務器這裏就不贅述了,相信你參考網上的一些教程確定可以順利登陸。假如你和我同樣使用 Xshell 的話,這裏有一篇很詳細的教程能夠參考:教你怎麼使用 xshell 遠程鏈接 linux 服務器

建立一個超級用戶

順利鏈接到遠程服務器了,若是是一臺全新服務器的話,一般咱們是以 root 用戶登陸的。在 root 下部署代碼不夠安全,最好是建一個新用戶(若是你已經以非 root 用戶登陸的話能夠跳過這一步)。下面的一些列命令將建立一個擁有超級權限的新用戶(把 yangxg 替換成你本身想要的用戶名,我這裏取個人名字拼音 yangxg):

# 在 root 用戶下運行這條命令建立一個新用戶,yangxg 是用戶名
# 由於我叫楊學光,因此我取的用戶名是 yangxg
# 選擇一個你喜歡的用戶名,不必定非得和個人相同
root@server:~# adduser yangxg

# 爲新用戶設置密碼
# 注意在輸密碼的時候不會有字符顯示,不要覺得鍵盤壞了,正常輸入便可
root@server:~# passwd yangxg

# 把新建立的用戶加入超級權限組
root@server:~# usermod -aG wheel yangxg

# 切換到建立的新用戶
root@server:~# su - yangxg

# 切換成功,@符號前面已是新用戶名而不是 root 了
yangxg@server:$
複製代碼

新用戶建立並切換成功了。若是是新服務器的話,最好先更新一下系統,避免由於版本太舊而給後面安裝軟件帶來麻煩。運行下面的兩條命令:

yangxg@server:$ sudo yum update
yangxg@server:$ sudo yum upgrade
複製代碼

更新 SQLite3

爲了方便,咱們博客使用了 SQLite3 數據庫,django 2.2 要求 SQLite3 數據庫版本在 3.8.3 以上,而 CentOS 7 系統自帶版本低於 django 2.2 所要求的最低版本,因此首先來更新 SQLite3 的版本。

注意

有可能你使用的服務器系統發行版 SQLite3 已經高於 3.8.3,這一步就能夠跳過。如何查看 SQLite3 的版本呢?請執行 sqlite3 --version

首先登錄到 sqlite 的官方下載地址,查看最新發布的版本,截止到本教程完成時,其最新版本爲 3.29.0,找到該版本的源碼壓縮包,複製其下載連接,而後經過 wget 命令下載到服務器(我通常習慣將源碼放在 ~/src 目錄下。)

# 建立 src 目錄並進到這個目錄
yangxg@server:$ mkdir -p ~/src
yangxg@server:$ cd ~/src

# 下載 sqlite3 源碼並解壓安裝
yangxg@server:$ wget https://sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
yangxg@server:$ tar zxvf sqlite-autoconf-3290000.tar.gz
yangxg@server:$ cd sqlite-autoconf-3290000
yangxg@server:$ ./configure
yangxg@server:$ make
yangxg@server:$ sudo make install
複製代碼

小貼士:

若是 wget 命令不存在,使用 sudo yum install -y wget 安裝便可。

至此 SQLite3 更新完畢,接下來安裝 Python3。

安裝 Python3 和 Pipenv

CentOS 7 自帶的 Python 發行版爲 2.7,所以須要安裝 Python3,爲了兼容性,咱們安裝 Python 3.6.4。

首先安裝可能的依賴:

yangxg@server:$ sudo yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
複製代碼

而後下載 Python 3.6.4 的源碼並解壓:

yangxg@server:$ cd ~/src
yangxg@server:$ wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
yangxg@server:$ tar -zxvf Python-3.6.4.tgz
複製代碼

最後編譯安裝:

yangxg@server:$ cd Python-3.6.4
yangxg@server:$ ./configure LD_RUN_PATH=/usr/local/lib LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include"
yangxg@server:$ make LD_RUN_PATH=/usr/local/lib
yangxg@server:$ sudo make install
複製代碼

注意這裏安裝 Python 時,Python 會依賴 SQLite3 的庫,因此在 configure 時經過 LD_RUN_PATH 指定依賴的搜索目錄(由於咱們以前更新了 SQLite3 的版本,指定依賴搜索目錄確保使用新的 SQLite3 依賴庫),另外兩個參數做用相似。

而後輸入 python3.6 -V 和 pip3.6 -V 命令測試安裝結果,輸出版本號說明安裝成功了。

有了 pip,就能夠安裝 Pipenv 了:

yangxg@server:$ sudo pip3.6 install pipenv
複製代碼

小貼士:

若是以上命令報錯,多是由於 pip3.6 安裝在當前用戶的 bin 路徑下(/usr/local/bin/),使用 pip3.6 install pipenv --users 命令也把 Pipenv 安裝到當前用戶的 bin 路徑下就能夠了。

部署代碼

接下來開始準備部署代碼,讓咱們的博客應用在服務上跑起來,這和在本地開發時的過程是如出一轍的。不過爲了將應用部署到服務器上,咱們首先要對項目作一點配置,打開 settings.py,找到 ALLOWED_HOSTS,將其修改成:

blogproject/settings.py

ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '.zmrenwu.com']
複製代碼

指定了 ALLOWED_HOSTS 的值後,django 將只容許經過指定的域名訪問咱們的應用,好比這裏只容許經過 127.0.0.1,localhost 以及 zmrenwu.com 和其任意子域名(域名前加一個點表示容許訪問該域名下的子域名)訪問(即 HTTP 報文頭部中 Host 的值必須是以上指定的域名,一般你在瀏覽器輸入域名訪問網站時,Host 的值就會被設置爲網站的域名),這樣能夠避免 HTTP Host 頭攻擊。

Django 項目中會有一些 CSS、JavaScript 等靜態文件,爲了可以方便地讓 Nginx 處理這些靜態文件的請求,咱們把項目中的所有靜態文件收集到一個統一的目錄下,這個目錄一般位於 django 項目的根目錄,而且命名爲 static。爲了完成這些任務,須要在項目的配置文件裏作一些必要的配置:

blogproject/settings.py

# 其餘配置...

STATIC_URL = '/static/'
# 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
複製代碼

STATIC_ROOT 即指定靜態文件的收集路徑,這裏指定爲 BASE_DIR(項目根目錄,在 settings.py 文件起始處定義)下的 static 文件夾。

如今的關鍵是把代碼傳到服務器上來了,這裏咱們使用 git。首先安裝 git:

yangxg@server:$ sudo  yum install -y git
複製代碼

將代碼上傳到 GitHub 等代碼託管平臺,這樣咱們就能夠方便地把代碼拉取到服務器了。Git 和 GitHub 的使用相信你已經很熟悉了,這裏就不贅述過程。若是不知道如何使用地話能夠自行百度相關教程。注意數據庫文件不要上傳!

我一般喜歡把應用代碼放在 ~/apps/ 目錄下,先來設置一下服務器的文件結構,用於存放應用代碼等相關文件:

# 在用戶目錄下建立 apps 目錄並進入
yangxg@server:$ mkdir -p ~/apps
yangxg@server:$ cd ~/apps

# 拉取博客代碼
yangxg@server:$ git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git
複製代碼

而後進入到項目根目錄,安裝項目依賴:

yangxg@server:$ cd ~/apps/HelloDjango-blog-tutorial

yangxg@server:$ pipenv install --deploy --ignore-pipfile
複製代碼

這裏指定 --deploy 參數,Pipenv 將只會安裝 Pipfile 中 [packages] 下指定的依賴。由於咱們如今是在線上環境進行部署,僅用於開發環境的相關依賴咱們並不須要。

--ignore-pipfile 將會使 Pipenv 從 Pipfile.lock 文件中安裝項目依賴。Pipfile.lock 記錄了項目依賴的精確信息,從這裏讀取依賴信息可以確保依賴信息被無心中修改或者破壞而使得運行環境由於依賴包的緣故出現不可預料的問題。

Pipenv 會自動幫咱們建立虛擬環境,而後將項目依賴安裝到虛擬環境下。

而後建立一下數據庫:

yangxg@server:$ pipenv run python manage.py migrate
複製代碼

啓動開發服務器:

yangxg@server:$ pipenv run python manage.py runserver 0.0.0.0:8000
複製代碼

這裏咱們啓動開發服務器時指定了服務器運行的 ip 和端口,這將容許經過公網 ip 的 8000 端口訪問咱們的博客。

訪問 ip:8000,能夠看到訪問成功(其中 ip 爲你服務器的公網 ip)。

使用 Gunicorn

Django 官方文檔強調使用 runserver 開啓的開發服務器僅用於開發測試,不建議用於生產環境。因此咱們使用流行的 Gunicorn 來啓動能夠用於線上環境的服務器。

首先進入到項目根目錄,安裝 Gunicorn:

yangxg@server:$ pipenv install gunicorn
複製代碼

因爲咱們在服務端修改安裝了 gunicorn,代碼中 Pipfile 文件和 Pipfile.lock 文件會被更新,所以別忘了把改動同步到本地,具體作法能夠自行學習,如下是一個參考:

# 服務端提交代碼
yangxg@server:$ git add Pipfile Pipfile.lock
yangxg@server:$ git commit -m "add gunicorn dependency"
yangxg@server:$ git push

# 本地拉取代碼
git pull
複製代碼

回到線上服務器,在項目根目錄,執行下面的命令啓動服務:

yangxg@server:$ pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 0.0.0.0:8000
複製代碼

來解釋一下各個參數的含義。

`-w 2 表示啓動 2 個 worker 用於處理請求(一個 worker 能夠理解爲一個進程),一般將 worker 數目設置爲 CPU 核心數的 2-4 倍。

-k gthread 指定每一個 worker 處理請求的方式,根據你們的實踐,指定爲 gthread 的異步模式能獲取比較高的性能,所以咱們採用這種模式。

-b 0.0.0.0:8000,將服務綁定到 8000 端口,運行經過公網 ip 和 8000 端口訪問應用。

訪問 ip:8000(ip 爲你服務器的公網 ip),應用成功訪問了,可是咱們看到樣式徹底亂了。別急,這不是 bug!此前咱們使用 django 自帶的開發服務器,它會自動幫咱們處理靜態樣式文件,可是 Gunicorn 並不會幫咱們這麼作。由於處理靜態文件並非 Gunicorn 所擅長的事,應該將它交給更加專業的服務應用來作,好比 Nginx。

啓動 Nginx 服務器

Nginx (engine x) 是一個高性能的 HTTP 和反向代理 web 服務器,它的功能很是多,這裏咱們主要用它來處理靜態文件以及將非靜態文件的請求反向代理給 Gunicorn。

當咱們訪問一個博客文章詳情頁面時,服務器會接收到下面兩種請求:

  • 顯示文章的詳情信息,這些信息一般保存在數據庫裏,所以須要調用數據庫獲取數據。
  • 圖片、css、js 等存在服務器某個文件夾下的靜態文件。

對於前一種請求,博客文章的數據須要藉助 django 從數據庫中獲取,Nginx 處理不了,它就會把這個請求轉發給 運行在 Gunicorn 服務中的 django 應用,讓 django 去處理。而對於後一種靜態文件的請求,只須要去這些靜態文件所在的文件夾獲取,Nginx 就會代爲處理,再也不麻煩 django。

用 django 去獲取靜態文件是很耗時的,但 Nginx 能夠很高效地處理,這就是咱們要使用 Nginx 的緣由。

首先安裝 Nginx:

yangxg@server:$ sudo yum install epel-release -y
yangxg@server:$ sudo yum install nginx -y
複製代碼

運行下面的命令啓動 Nginx 服務:

yangxg@server:$ sudo systemctl start nginx
複製代碼

在瀏覽器輸入 ip(不輸入端口則默認爲 80 端口,Nginx 默認在 80 端口監聽請求),看到 Nginx 的歡迎界面說明 Nginx 啓動成功了。

配置 Nginx

Nginx 的配置位於 /etc/nginx/nginx.conf 文件中,你能夠打開這個文件看看裏面的內容,下面是一些關鍵性的配置:

user nobody nobody;
...
http {
    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }
    }
}
複製代碼

首先是這個 user 配置,用於指定 Nginx 進程運行時的用戶和組(分別爲第一個和第二個參數),爲了防止可能的權限問題,咱們改爲當前系統用戶(個人用戶名是 yangxg,所屬組 yangxg,記得改爲你本身服務器中運行的用戶和組,修改完後記得保存文件內容):

user yangxg yangxg;
複製代碼

而後在 http 配置下有一個 server 模塊,server 模塊用於配置一個虛擬服務,使這個虛擬服務監聽指定的端口和域名。你能夠配置多個 server,這樣就會啓動多個虛擬服務,用於監聽不一樣端口,或者是同一個端口,可是不一樣的域名,這樣你就能夠在同一服務器部署多個 web 應用了。

這個 server 的配置咱們下面會詳細講解,再來看看 server 下的 include,include 會將指定路徑中配置文件包含進來,這樣便於配置的模塊化管理,例如咱們能夠把不一樣 web 應用的配置放到 /etc/nginx/conf.d/ 目錄下,這樣 nginx 會把這個目錄下全部以 .conf 結尾的文件內容包含到 nginx.conf 的配置中來,而無需把全部配置都堆到 nginx.conf 中,使得配置文件十分臃腫。

咱們來配置博客應用,上面說了,爲了模塊化管理,咱們將配置寫到 /etc/nginx/conf.d/ 目錄下。先在服務器的 conf.d 目錄下新建一個配置文件,我把它叫作 HelloDjango-blog-tutorial.conf。寫入下面的配置內容:

server {
    charset utf-8;
    listen 80;
    server_name hellodjango-blog-tutorial-demo.zmrenwu.com;

    location /static {
        alias /home/yangxg/apps/HelloDjango-blog-tutorial/static;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8000;
    }
}
複製代碼

首先咱們配置了一個虛擬服務,編碼方式爲 utf-8,監聽於 80 端口。

服務的域名爲 hellodjango-blog-tutorial-demo.zmrenwu.com,因此來自這個域名的請求都會被這個服務所處理。

全部URL 匹配 /static 的請求均由 Nginx 處理,alias 指明瞭靜態文件的存放目錄,這樣 Nginx 就能夠在這個目錄下找到請求的文件返回給客戶端。

其它請求轉發給運行在本機 8000 端口的應用程序處理,咱們會在這個端口啓動 Gunicorn 用於處理 Nginx 轉發過來的請求。

重啓 nginx 使得配置生效:

yangxg@server:$ sudo systemctl restart nginx
複製代碼

關閉 DEBUG 模式,收集靜態文件

開發環境下,django 爲了調試方便,會將 settings.py 文件中的 DEBUG 選項配置爲 True,這樣若是程序運行出錯,調試信息將盡收眼底,這在開發時很方便,但部署到線上就會帶來巨大安全隱患,因此咱們把 DEBUG 選項設置爲 False,關閉調試模式,在本地將 settings.py 中的 DEBUG 爲:

DEBUG=False
複製代碼

線上服務器更新最新的代碼,而後運行命令收集靜態文件到以前配置的 STATIC_ROOT 目錄下:

yangxg@server:$ pipenv run python manage.py collectstatic
複製代碼

而後使用 Gunicorn 啓動服務。

yangxg@server:$ pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000
複製代碼

如今,訪問配置的域名 hellodjango-blog-tutorial-demo.zmrenwu.com(改爲你本身在 Nginx 中配置的域名),能夠看到博客成功部署!

管理 Gunicorn 進程

如今 Gunicorn 是咱們手工啓動的,一旦咱們退出 shell,服務器就關閉了,博客沒法訪問。就算在後臺啓動 Gunicorn,萬一哪天服務器崩潰重啓了又得從新登陸服務器去啓動,很是麻煩。爲此使用 Supervisor 來管理 Gunicorn 進程,這樣當服務器從新啓動或者 Gunicorn 進程意外崩潰後,Supervisor 會幫咱們自動重啓 Gunicorn。

先按 Ctrl + C 中止剛纔啓動的 Gunicorn 服務進程。

首先安裝 Supervisor 注意這裏使用的是系統自帶的 pip2,由於截至本教程書寫時 Supervisor 還不支持 Python3,不過這並不影響使用。

yangxg@server:$ pip install supervisor
複製代碼

爲了方便,我通常會設置以下的目錄結構(位於 ~/etc 目錄下)來管理 Supervisor 有關的文件:

~/etc

├── supervisor
│   ├── conf.d
│   └── var
│       ├── log
└── supervisord.conf
複製代碼

其中 supervisord.conf 是 Supervior 的配置文件,它會包含 conf.d 下的配置。var 目錄下用於存放一些常常變更的文件,例如 socket 文件,pid 文件,log 下則存放日誌文件。

首先來創建上述的目錄結構:

yangxg@server:$ mkdir -p ~/etc/supervisor/conf.d
yangxg@server:$ mkdir -p ~/etc/supervisor/var/log
複製代碼

而後進入 ~/etc 目錄下生成 Supervisor 的配置文件:

yangxg@server:$ cd ~/etc
yangxg@server:$ echo_supervisord_conf > supervisord.conf
複製代碼

修改 supervisor.conf,讓 Supervisor 進程產生的一些文件生成到上面咱們建立的目錄下,而不是其默認指定的地方。

首先找到 [unix_http_server] 版塊,將 file 設置改成以下的值:

[unix_http_server]
file=/home/yangxg/etc/supervisor/var/supervisor.sock
複製代碼

即讓 socket 文件生成在 ~/etc/supervisor/var/ 目錄下。注意 supervisor 不支持將 ~ 展開爲用戶 home 目錄,因此要用絕對路徑指定。

相似的修改 [supervisord] 板塊下的 logfile 和 pidfile 文件的路徑,還有 user 改成系統用戶,這樣 supervisor 啓動的進程將以系統用戶運行,避免可能的權限問題:

logfile=/home/yangxg/etc/supervisor/var/log/supervisord.log
pidfile=/home/yangxg/etc/supervisor/var/supervisord.pid
user=yangxg
複製代碼

還有 [supervisorctl] 板塊下:

serverurl=unix:///home/yangxg/etc/supervisor/var/supervisor.sock
複製代碼

[include] 版塊,將 /home/yangxg/etc/supervisor/conf.d/ 目錄下全部以 .ini 結尾的文件內容包含到配置中來,這樣便於配置的模塊化管理,和以前 Nginx 配置文件的處理方式是相似的。

files = /home/yangxg/etc/supervisor/conf.d/*.ini
複製代碼

而後咱們到 conf.d 新建咱們博客應用的配置:

[program:hellodjango-blog-tutorial]
command=pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 127.0.0.1:8000
directory=/home/yangxg/apps/HelloDjango-blog-tutorial
autostart=true
autorestart=unexpected
user=yangxg
stdout_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stdout.log
stderr_logfile=/home/yangxg/etc/supervisor/var/log/hellodjango-blog-tutorial-stderr.log
複製代碼

說一下各項配置的含義:

[program:hellodjango-blog-tutorial] 指明運行應用的進程,名爲 hellodjango-blog-tutorial。

  • command 爲進程啓動時執行的命令。

  • directory 指定執行命令時所在的目錄。

  • autostart 隨 Supervisor 啓動自動啓動進程。

  • autorestart 進程意外退出時重啓。

  • user 進程運行的用戶,防止權限問題。

  • stdout_logfile,stderr_logfile 日誌輸出文件。

啓動 Supervisor

yangxg@server:$ supervisord -c ~/etc/supervisord.conf
複製代碼

-c 指定 Supervisr 啓動時的配置文件。

進入 supervisorctl 進程管理控制檯:

yangxg@server:$ supervisorctl -c ~/etc/supervisord.conf
複製代碼

執行 update 命令更新配置文件並啓動應用。

瀏覽器輸入域名,能夠看到服務已經正常啓動了。

使用 CDN 加快 Bootstrap 和 jQuery 的加載速度

咱們的項目使用了 Bootstrap 和 jQuery,這兩個文件咱們是從本地加載的。若是服務器性能比較差的話,加載須要耗費很長的時間,網站打開的速度就變得沒法忍受。咱們使用 CDN 來加快加載速度。具體來講,替換 base.html 的幾個靜態文件的加載標籤:

base.html

- <link rel="stylesheet" href="{% static 'blog/css/bootstrap.min.css' %}">
- <script src="{% static 'blog/js/jquery-2.1.3.min.js' %}"></script>
- <script src="{% static 'blog/js/bootstrap.min.js' %}"></script>
+ <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
+ <script src="https://cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
+ <script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
複製代碼

本地修改代碼後,將代碼同步到線上服務器,執行下面的命令重啓 hellodjango-blog-tutorial 應用進程:

yangxg@server:$ supervisorctl -c ~/etc/supervisord.conf restart hellodjango-blog-tutorial 
複製代碼

這樣網站訪問的速度將大大提高!

總結

部署步驟不少且繁雜,由於每一個環境都不同,所以部署是最容易出錯的步驟,必定要搞清楚每一步的做用,這樣在遇到問題時,才能針對性地去解決,若是隻知道一味地複製粘貼命令,而不知道本身在幹嗎,那麼一旦出錯將一籌莫展。

部署過程自動化

在整個部署過程當中咱們運行了十幾條命令,手動輸入了 N 個字符。若是每次更新代碼都要遠程鏈接到服務器執行這些命令的話將變得很是麻煩。接下來的教程咱們將介紹使用 Fabric 自動化整個部署過程。寫好部署腳本後,只須要執行一條命令,就能夠很是方便地自動完成整個部署。

『講解開源項目系列』——讓對開源項目感興趣的人再也不畏懼、讓開源項目的發起者再也不孤單。跟着咱們的文章,你會發現編程的樂趣、使用和發現參與開源項目如此簡單。歡迎留言聯繫咱們、加入咱們,讓更多人愛上開源、貢獻開源~

相關文章
相關標籤/搜索