1. 程式人生 > >是時候讓大家看看你用django寫出來的部落格了(內含部署教程視訊)

是時候讓大家看看你用django寫出來的部落格了(內含部署教程視訊)

![](https://img2018.cnblogs.com/blog/759200/201908/759200-20190828185611060-1211614569.jpg)

作者:HelloGitHub-追夢人物

> 文中涉及的示例程式碼,已同步更新到 [HelloGitHub-Team 倉庫](https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial) 部落格的基礎功能已經開發的差不多了,雖然還有很多地方可以完善,但我們還是希望早點把部落格部署到伺服器上,讓他人可以通過外網訪問。至於有待完善的地方,可以等部署完後一點點地迭代和改進。現在就讓我們來把部落格部署到伺服器上吧! **↓↓↓ 視訊在這裡 ↓↓↓** > 作者親自錄製的真機環境演示部署全過程,再不成功你打我! > > B 站演示(阿里雲 CentOS 7 系統)觀看地址:https://www.bilibili.com/video/av68020610/ **注意**:本文的每一個步驟都在真實環境下驗證無誤。除非你知道自己在做什麼,否則建議每一步均嚴格按照教程的指導來,這樣能保證你順利完成部署。 ## 部署前準備 我們將使用比較流行的 Nginx + Gunicorn 的方式將 django 開發的部落格部署到自己的伺服器,讓別人能夠通過域名訪問你的部落格。至於 Nginx、Gunicorn 是什麼暫時放到一邊,讀完本教程後你就會知道它們的作用和使用方法了。 為了部署我們的部落格,需要滿足以下兩個條件: 1. 最好有一臺可以通過外網訪問的伺服器(如果沒有的話可以在自己的電腦上建一臺虛擬機器,通過虛擬 ip 訪問)。 2. 最好有一個域名(如果沒有的話,則只能使用 ip 訪問,且不能開啟 HTTPS)。 ## 配置伺服器 本教程使用的本地環境為 Windows 10,伺服器環境為 CentOS 7(64 位)。如果你的環境和我的有所差異(比如 Ubuntu)導致一些命令無法執行,將這些命令轉換為你所在環境的命令執行即可,重點在於理解每一步的作用,這樣無論在何種環境你都能成功地完成部署,而不是機械地複製貼上命令。 ### 遠端登入到伺服器 伺服器通常位於雲端,需要使用遠端登入工具登入後才能對伺服器進行操作。我使用的是 Xshell,Windows 下百度 Xshell 下載安裝即可,軟體對學校和個人使用者是免費的。 如何遠端登入到伺服器這裡就不贅述了,相信你參考網上的一些教程肯定能夠順利登入。假如你和我一樣使用 Xshell 的話,這裡有一篇很詳細的教程可以參考:[教你怎麼使用 xshell 遠端連線 linux 伺服器](http://jingyan.baidu.com/article/ab69b270b0ca3d2ca7189fdc.html)。 ### 建立一個超級使用者 順利連線到遠端伺服器了,如果是一臺全新伺服器的話,通常我們是以 root 使用者登入的。在 root 下部署程式碼不夠安全,最好是建一個新使用者(如果你已經以非 root 使用者登入的話可以跳過這一步)。下面的一些列命令將建立一個擁有超級許可權的新使用者(把 yangxg 替換成你自己想要的使用者名稱,我這裡取我的名字拼音 yangxg): ```bash # 在 root 使用者下執行這條命令建立一個新使用者,yangxg 是使用者名稱 # 因為我叫楊學光,所以我取的使用者名稱是 yangxg # 選擇一個你喜歡的使用者名稱,不一定非得和我的相同 root@server:~# adduser yangxg # 為新使用者設定密碼 # 注意在輸密碼的時候不會有字元顯示,不要以為鍵盤壞了,正常輸入即可 root@server:~# passwd yangxg # 把新建立的使用者加入超級許可權組 root@server:~# usermod -aG wheel yangxg # 切換到建立的新使用者 root@server:~# su - yangxg # 切換成功,@符號前面已經是新使用者名稱而不是 root 了 yangxg@server:$ ``` 新使用者建立並切換成功了。如果是新伺服器的話,最好先更新一下系統,避免因為版本太舊而給後面安裝軟體帶來麻煩。執行下面的兩條命令: ```bash 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 的官方下載地址](https://sqlite.org/download.html),檢視最新發布的版本,截止到本教程完成時,其最新版本為 3.29.0,找到該版本的原始碼壓縮包,複製其下載連結,然後通過 wget 命令下載到伺服器(我一般習慣將原始碼放在 ~/src 目錄下。) ```bash # 建立 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。 首先安裝可能的依賴: ```bash yangxg@server:$ sudo yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel ``` 然後下載 Python 3.6.4 的原始碼並解壓: ```bash 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 ``` 最後編譯安裝: ```bash 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 了: ```bash 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。為了完成這些任務,需要在專案的配置檔案裡做一些必要的配置: ```python blogproject/settings.py # 其他配置... STATIC_URL = '/static/' # 加入下面的配置 STATIC_ROOT = os.path.join(BASE_DIR, 'static') ``` `STATIC_ROOT` 即指定靜態檔案的收集路徑,這裡指定為 BASE_DIR(專案根目錄,在 settings.py 檔案起始處定義)下的 static 資料夾。 現在的關鍵是把程式碼傳到伺服器上來了,這裡我們使用 git。首先安裝 git: ```bash yangxg@server:$ sudo yum install -y git ``` 將程式碼上傳到 GitHub 等程式碼託管平臺,這樣我們就可以方便地把程式碼拉取到伺服器了。Git 和 GitHub 的使用相信你已經很熟悉了,這裡就不贅述過程。如果不知道如何使用地話可以自行百度相關教程。**注意資料庫檔案不要上傳!** 我通常喜歡把應用程式碼放在 ~/apps/ 目錄下,先來設定一下伺服器的檔案結構,用於存放應用程式碼等相關檔案: ```bash # 在使用者目錄下建立 apps 目錄並進入 yangxg@server:$ mkdir -p ~/apps yangxg@server:$ cd ~/apps # 拉取部落格程式碼 yangxg@server:$ git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git ``` 然後進入到專案根目錄,安裝專案依賴: ```bash 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 會自動幫我們建立虛擬環境,然後將專案依賴安裝到虛擬環境下。 然後建立一下資料庫: ```bash yangxg@server:$ pipenv run python manage.py migrate ``` 啟動開發伺服器: ```bash 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: ```bash yangxg@server:$ pipenv install gunicorn ``` 由於我們在服務端修改安裝了 gunicorn,程式碼中 Pipfile 檔案和 Pipfile.lock 檔案會被更新,因此別忘了把改動同步到本地,具體做法可以自行學習,以下是一個參考: ```bash # 服務端提交程式碼 yangxg@server:$ git add Pipfile Pipfile.lock yangxg@server:$ git commit -m "add gunicorn dependency" yangxg@server:$ git push # 本地拉取程式碼 git pull ``` 回到線上伺服器,在專案根目錄,執行下面的命令啟動服務: ```bash 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: ```bash yangxg@server:$ sudo yum install epel-release -y yangxg@server:$ sudo yum install nginx -y ``` 執行下面的命令啟動 Nginx 服務: ```bash yangxg@server:$ sudo systemctl start nginx ``` 在瀏覽器輸入 ip(不輸入埠則預設為 80 埠,Nginx 預設在 80 埠監聽請求),看到 Nginx 的歡迎介面說明 Nginx 啟動成功了。 ## 配置 Nginx Nginx 的配置位於 /etc/nginx/nginx.conf 檔案中,你可以開啟這個檔案看看裡面的內容,下面是一些關鍵性的配置: ```nginx 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,記得改成你自己伺服器中執行的使用者和組,修改完後記得儲存檔案內容): ```nginx 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。寫入下面的配置內容: ```nginx 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 使得配置生效: ```bash yangxg@server:$ sudo systemctl restart nginx ``` ## 關閉 DEBUG 模式,收集靜態檔案 開發環境下,django 為了除錯方便,會將 settings.py 檔案中的 DEBUG 選項配置為 True,這樣如果程式執行出錯,除錯資訊將一覽無餘,這在開發時很方便,但部署到線上就會帶來巨大安全隱患,所以我們把 DEBUG 選項設定為 False,關閉除錯模式,在本地將 settings.py 中的 DEBUG 為: ```python DEBUG=False ``` **線上伺服器更新最新的程式碼**,然後執行命令收集靜態檔案到之前配置的 STATIC_ROOT 目錄下: ```bash yangxg@server:$ pipenv run python manage.py collectstatic ``` 然後使用 Gunicorn 啟動服務。 ```bash 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,不過這並不影響使用。 ```bash yangxg@server:$ pip install supervisor ``` 為了方便,我一般會設定如下的目錄結構(位於 ~/etc 目錄下)來管理 Supervisor 有關的檔案: ``` ~/etc ├── supervisor │   ├── conf.d │   └── var │   ├── log └── supervisord.conf ``` 其中 supervisord.conf 是 Supervior 的配置檔案,它會包含 conf.d 下的配置。var 目錄下用於存放一些經常變動的檔案,例如 socket 檔案,pid 檔案,log 下則存放日誌檔案。 首先來建立上述的目錄結構: ```bash yangxg@server:$ mkdir -p ~/etc/supervisor/conf.d yangxg@server:$ mkdir -p ~/etc/supervisor/var/log ``` 然後進入 ~/etc 目錄下生成 Supervisor 的配置檔案: ```bash 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 ```bash yangxg@server:$ supervisord -c ~/etc/supervisord.conf ``` -c 指定 Supervisr 啟動時的配置檔案。 進入 supervisorctl 程序管理控制檯: ```bash yangxg@server:$ supervisorctl -c ~/etc/supervisord.conf ``` 執行 update 命令更新配置檔案並啟動應用。 瀏覽器輸入域名,可以看到服務已經正常啟動了。 ## 使用 CDN 加快 Bootstrap 和 jQuery 的載入速度 我們的專案使用了 Bootstrap 和 jQuery,這兩個檔案我們是從本地載入的。如果伺服器效能比較差的話,載入需要耗費很長的時間,網站開啟的速度就變得無法忍受。我們使用 CDN 來加快載入速度。具體來說,替換 base.html 的幾個靜態檔案的載入標籤: ```html base.html -
- - + + + ``` 本地修改程式碼後,將程式碼同步到線上伺服器,執行下面的命令重啟 hellodjango-blog-tutorial 應用程序: ```bash yangxg@server:$ supervisorctl -c ~/etc/supervisord.conf restart hellodjango-blog-tutorial ``` 這樣網站訪問的速度將大大提升! ## 總結 部署步驟很多且繁雜,因為每個環境都不一樣,因此部署是最容易出錯的步驟,一定要搞清楚每一步的作用,這樣在遇到問題時,才能針對性地去解決,如果只知道一味地複製貼上命令,而不知道自己在幹嘛,那麼一旦出錯將束手無策。 ## 部署過程自動化 在整個部署過程中我們運行了十幾條命令,手動輸入了 N 個字元。如果每次更新程式碼都要遠端連線到伺服器執行這些命令的話將變得非常麻煩。接下來的教程我們將介紹使用 Fabric 自動化整個部署過程。寫好部署指令碼後,只需要執行一條命令,就可以非常方便地自動完成整個部署。 --- **『講解開源專案系列』**——讓對開源專案感興趣的人不再畏懼、讓開源專案的發起者不再孤單。跟著我們的文章,你會發現程式設計的樂趣、使用和發現參與開源專案如此簡單。歡迎留言聯絡我們、加入我們,讓更多人愛上開源、貢獻開源~