### 導航
- [索引](# "總目錄")
- [下一頁](# "在 Flask 中使用 SQLite 3") |
- [上一頁](# "部署和分發") |
- [Flask 0.10.1 文檔](#) ?
- [Flask 代碼模式](#) ?
# 使用 Fabric 部署
[Fabric](http://fabfile.org/) [http://fabfile.org/] 是一個 Python 下類似于 Makefiles 的工具,但是能夠在遠程服務器上執行命令。如果您有一個良好配置過的 Python 軟件包 ([*大型應用*](#)) 且對“配置”概念的理解良好,那么在外部服務器上部署 Flask 應用將會非常容易。
開始之前,請先檢查如下列表中的事項是否都已經滿足了:
- 在本地已經安裝了 Fabric 1.0 。即這個教程完成時, Fabric 的最新版本。
- 應用程序已經被封裝為包的形式,而且有一個有效的 setup.py 文件(參考 [*部署和分發*](#))。
- 在下文中的例子里,我們使用 mod_wsgi 作為遠程服務器使用的服務端程序。您當然也可以使用您喜歡的服務端程序,但是考慮到 Apache 和 mod_wsgi 的組合非常簡單易用且容易安裝配置,并且在無 root 權限的情況下,存在一個比較簡單的方法來重啟服務器。
### 創建第一個 Fabfile
Fabfile 用于指定 Fabric 執行的命令,它通常被命名為 fabfile.py 并使用 fab命令運行。文件中所有的函數將被當做 fab 的子命令顯示出來,他們可以在一個或多個主機上運行。這些主機要么在 fabfile 當中定義,要么在命令輸入時指定。在本文中我們將他們定義在 fabfile 里。
這是第一個基礎的例子,能夠將現有源代碼上傳到指定服務器并將它們安裝進如一個已經存在的虛擬環境中:
~~~
from fabric.api import *
# 遠程服務器登陸使用的用戶名
env.user = 'appuser'
# 需要進行操作的服務器地址
env.hosts = ['server1.example.com', 'server2.example.com']
def pack():
# 以 tar 歸檔的方式創建一個新的代碼分發
local('python setup.py sdist --formats=gztar', capture=False)
def deploy():
# 之處發布產品的名稱和版本
dist = local('python setup.py --fullname', capture=True).strip()
# 將代碼歸檔上傳到服務器當中的臨時文件夾內
put('dist/%s.tar.gz' % dist, '/tmp/yourapplication.tar.gz')
# 創建一個文件夾,進入這個文件夾,然后將我們的歸檔解壓到那里
run('mkdir /tmp/yourapplication')
with cd('/tmp/yourapplication'):
run('tar xzf /tmp/yourapplication.tar.gz')
# 使用我們虛擬環境下的 Python 解釋器安裝我們的包
run('/var/www/yourapplication/env/bin/python setup.py install')
# 現在我們的代碼已經部署成功了,可以刪除這個文件夾了
run('rm -rf /tmp/yourapplication /tmp/yourapplication.tar.gz')
# 最終生成 .wsgi 文件,以便于 mod_wsgi 重新加載應用程序
run('touch /var/www/yourapplication.wsgi')
~~~
上面的代碼例子注釋很清晰,應該很容易明白,下面是 fabric 常用命令的一個歸納:
- run - 在遠程服務器上執行所有命令
- local - 在本地執行所有命令
- put - 將指定文件上傳到指定服務器
- cd - 改變遠程服務器當上的當前操作目錄,此命令必須與 with 聲明一起使用
### 運行 Fabfile
如何執行 fabfile 呢?您應該使用 fab 命令。若要發布當前版本的代碼到遠程服務器上,您只需執行如下命令:
~~~
$ fab pack deploy
~~~
然而這需要您的服務器已經創建過 /var/www/yourapplication 文件夾而且 /var/www/yourapplication/env 是一個可用的虛擬環境。而且,我們還沒有在服務器上創建配置文件或者 .wsgi 文件。因此,我們怎么樣把一個新的服務器轉換為可以使用基礎設備呢。
這視我們想要配置的服務器數量的不同,實現起來有所差別。如果我們只有一個遠程應用服務器(大部分應用都是都屬于此類),那么 fabfile 里添加一個專門負責此類的命令有些小題大做。但是顯然我們可以這么做。在這里,您可以會運行命令 setup 或者 bootstrap 。然后將服務器的地址詳細地在命令行當中指定:
~~~
$ fab -H newserver.example.com bootstrap
~~~
初始化一個新的服務器,您大概需要執行如下幾個步驟:
1.
在 /var/www 目錄下創建目錄結構:
~~~
$ mkdir /var/www/yourapplication
$ cd /var/www/yourapplication
$ virtualenv --distribute env
~~~
1.
上傳一個新的 application.wsgi 文件以及為應用程序準備的配置文件(例如: application.cfg)等到服務器上
1.
為 yourapplication 創建一個新的 Apache 配置,并激活它。請確保激活了對 .wsgi 改變的監視功能,這樣在我們創建或改變這個文件時Apache 可以自動重新加載應用 (詳細內容請參考 [*mod_wsgi (Apache)*](#))
現在的問題是, application.wsgi 和 application.cfg 文件從何而來。
### WSGI 文件
WSGI 文件應導入這個應用并且設定一個環境變量,這個環境變量指定了應用程序應到哪里尋找配置文件。下面是一個完全完成上述功能的短例:
~~~
import os
os.environ['YOURAPPLICATION_CONFIG'] = '/var/www/yourapplication/application.cfg'
from yourapplication import app
~~~
應用程序本身則應該向下面這樣,通過查詢環境變量來查找配置,以此初始化自己:
~~~
app = Flask(__name__)
app.config.from_object('yourapplication.default_config')
app.config.from_envvar('YOURAPPLICATION_CONFIG')
~~~
這種方法在本文檔的 [*配置處理*](#) 這節中進行了詳細介紹。
### 配置文件
正如上文所屬,應用程序將會通過查找 YOURAPPLICATION_CONFIG 環境變量以找到正確的配置文件。因此我們必須將配置文件放在應用程序可以找到的地方。配置文件有在不同電腦上表現出不同效果的特質,所以您不應該以普通的方式對它進行版本控制。
一個流行的做法是將不同服務器的配置文件保存在不同的版本控制倉庫里,然后在不同的服務器中分別抽取出來。然后建立到從配置應該在的地點(如: /var/www/yourapplication)到這個文件實際位置的符號鏈接。
我們預計只有一個或兩個服務器需要部署,因此我們采用另一種方法,也就是提前手動將配置文件上傳到需要的未知。
### 第一次部署
現在我們可以開始進行第一次部署了。我們已經初始化了服務器以使它擁有正確的虛擬環境和已經激活的 Apache 配置文件。現在我們可以把應用打包然后部署了:
~~~
$ fab pack deploy
~~~
Fabric 現在就會連接到所有服務器,然后運行在 fabfile 文件中所指定的命令。最初他會執行打包工作,為我們創建代碼歸檔,然后他部署和上傳代碼到所有的服務器,并在那里安裝他們。歸功于 setup.py ,所有引用依賴的包和庫都將自動被下載和安裝到我們的虛擬環境中。
### 下一步操作
從現在開始,我們可以做的事情變得如此之多,以至于部署代碼實際上可以看做一種樂趣:
- 創建一個 bootstrap 命令用于初始化新的服務器,它將初始化一個新的虛擬環境安裝以及適當配置 Apache 等。
- 將配置文件放置到一個獨立的版本控制倉庫里,然后將活動的配置符號連接到它應該在的地方。
- 您應該將您的應用程序也放置到一個版本控制倉庫中,然后在服務器中提取最新的版本并安裝,您也可以很容易的回溯到以前的版本。
- 為測試提供函數接口,這樣您就可以將測試代碼部署到服務器上并在服務器端執行測試套件。
使用 Fabric 是相當有趣,鍵入 fabdeploy 并看到您的應用自動部署到一個或多個服務器上,您會有“簡直像是魔術”這樣的感覺。
? 版權所有 2013, Armin Ronacher.
- 歡迎使用 Flask
- 前言
- 給有經驗程序員的前言
- 安裝
- 快速入門
- 教程
- 介紹 Flaskr
- 步驟 0: 創建文件夾
- 步驟 1: 數據庫模式
- 步驟 2: 應用設置代碼
- 步驟 3: 創建數據庫
- 步驟 4: 請求數據庫連接
- 步驟 5: 視圖函數
- 步驟 6: 模板
- 步驟 7: 添加樣式
- 福利: 應用測試
- 模板
- 測試 Flask 應用
- 記錄應用錯誤
- 配置處理
- 信號
- 即插視圖
- 應用上下文
- 請求上下文
- 用藍圖實現模塊化的應用
- Flask 擴展
- 與 Shell 共舞
- Flask 代碼模式
- 大型應用
- 應用程序的工廠函數
- 應用調度
- 使用 URL 處理器
- 部署和分發
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上傳文件
- 緩存
- 視圖裝飾器
- 使用 WTForms 進行表單驗證
- 模板繼承
- 消息閃現
- 用 jQuery 實現 Ajax
- 自定義錯誤頁面
- 延遲加載視圖
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 數據流
- 延遲請求回調
- 添加 HTTP Method Overrides
- 請求內容校驗碼
- 基于 Celery 的后臺任務
- 部署選擇
- mod_wsgi (Apache)
- 獨立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的設計決策
- HTML/XHTML 常見問題
- 安全注意事項
- Flask 中的 Unicode
- Flask 擴展開發
- Pocoo 風格指引
- Python 3 支持
- 升級到最新版本
- Flask Changelog
- 許可證
- 術語表