生產級部署 Python 指令碼,崩潰可自啟!

承香墨影發表於2018-10-09

今天介紹一個生產級的流程管理工具 PM2,通常我們說到 PM2 的時候,都是在說如何部署 Node.js 程式,但是實際上 PM2 很強大,不僅僅可以用來管理 Node.js,它還可以用來管理 Python、PHP、Ruby、perl 等等。

這裡就以 Python 舉例子,來看看 PM2 如何部署管理 Python 指令碼。

PM2-Python

PM2 是一個生產級流程管理器,可以輕鬆管理後臺程式,在 Python 的世界中,PM2 是可以和 Supervisord 相媲美的,並且 PM2 還有一些非常棒的功能。

使用 PM2,讓崩潰重啟、觀察、檢查日誌甚至部署應用程式,都變的簡單,並且 PM2 非常重視在命令列介面的操作體驗,因此 PM2 非常易於使用和掌握。

PM2 發展到今天,已經 5 年了,在 Github 上有超過 6500w 次下載,已經成為在生產伺服器中執行 Node.js 的首選方式之一。但是它也支援 Python。

安裝 PM2

PM2 依賴於 Node.js,所以需要提前安裝 Node,這一步非常簡單:

curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
sudo apt-get install -y nodejs
複製程式碼

其他平臺如何安裝 Node.js,可自行查詢教程。

有了 Node 的環境後,就可以通過 npm 來安裝 PM2 了。

$ sudo npm install pm2 -g
複製程式碼

要初始化 PM2 ,可以使用 pm2 ls 命令,此時就可以看到一個很友好的介面。

現在,已經成功安裝好 PM2 了,讓我們啟動一個 Python 應用吧。

啟動 Python

使用 PM2 啟動應用非常的簡單,它講根據指令碼擴充套件自動匹配直譯器,用以執行指定的應用程式。

我們先建立一個簡單的 Python 應用程式,例如:hello.py。

#!/usr/bin/python
import time

while 1:
    print("Start: %s" % time.ctime())
    time.sleep(1)
複製程式碼

我們有了一個簡單的 Python 指令碼,接下來我們就用 PM2 去啟動它。

$ pm2 start hello.py
複製程式碼

然後在 Terminal 裡就可以看到該程式了。

到這一步,這個 Python 程式就將永遠的執行下去,這意味著如果該程式退出或者丟擲異常,它將被自動重啟。

此處的 mode 為 fork,也就是關閉當前的 Terminal 視窗,它依然可以檢查到此應用的狀態。

想要檢視 PM2 執行管理的應用程式,可以使用 pm2 ls 命令進行檢視。

檢查日誌

通過 PM2 執行的程式,如果想要檢視 Log,可以輸入 pm2 logs 命令。

如果想要指定檢視某個程式的 Log,可以使用 pm2 logs <app_name> 進行指定。

另外 PM2 還提供了自動化的日誌輪換功能,但是需要安裝 pm2-logrotate

$ pm2 install pm2-logrotate
複製程式碼

pm2-logrotate 將提供每天日誌輪換更新的功能,並保持總的日誌控制元件大小為 10M。

檢視某程式的資訊

想要檢視當前使用 PM2 啟動的程式的詳細資訊,可以使用 pm describe <app_name> 命令進行檢視。

在輸出中,可以看到日誌檔案的路徑,已經直譯器等資訊。

管理 PM2 的程式狀態

介紹完啟動和檢視日誌,再看幾個簡單的管理命令。

1. 停止某個程式

$ pm2 stop hello
複製程式碼

2. 重啟某個程式

$ pm2 restart hello
複製程式碼

3. 從程式列表中停止和刪除某個程式

$ pm2 delete hello
複製程式碼

更多的命令,可以直接檢視官方文件。

伺服器重啟時,依然保持執行

使用 PM2 啟動 Python 程式之後,PM2 只能保證啟動的這個 Python 程式發生意外崩潰的時候,對他進行重啟。如果你希望在重啟伺服器的時候,依然保持應用程式線上,則需要設定 init 指令碼,用以告訴系統啟動 PM2 以及你的應用程式。

想讓 PM2 跟隨系統啟動,只需要執行此命令。

$ pm2 startup
複製程式碼

startup 可以生成一個設定環境變數的命令。

æªå¾ - ä" -  2018-09-19-13-05-39
æªå¾ - ä" - 2018-09-19-13-05-39

複製/貼上此命令的最後一行,執行後將在系統重啟時,自動啟動 PM2。

現在已經可以重啟 PM2 了,還需要告訴 PM2 那些程式狀態需要在重啟時保持不變,只需要輸入命令:

$ pm2 save
複製程式碼

這將建立一個轉存檔案,記錄當前由 PM2 管理的程式狀態,PM2 將在重啟時,按照之前的狀態恢復他們。

監聽 CPU/記憶體資訊

要監聽 CPU/記憶體並檢查有關程式的一些資訊,需要使用 pm2 monit 命令。

這將開啟一個 termcaps 介面,允許試試瞭解正在執行的應用程式。

你還可以使用 pm2 show <app_name> 獲取有關應用程式的所有可能資訊。

使用 Ecosystem 檔案

如果有多個程式需要啟動,或者在啟動的時候需要傳遞不同的引數、選項等,可以使用 eocsystem 檔案對應用程式進行配置。

Eocsystem 需要通過 ecosystem.config.js 檔案進行配置,此檔案可以通過 pm2 init 命令生成。生成好後,我們可以在其中配置一些配置資訊。

module.exports = {
  apps : [{
    name'echo-python',
    cmd'hello.py',
    args'arg1 arg2',
    autorestartfalse,
    watchtrue,
    pid'/path/to/pid/file.pid',
    instances4,
    max_memory_restart'1G',
    env: {
      ENV'development'
    },
    env_production : {
      ENV'production'
    }
  }, {
    name'echo-python-3',
    cmd'hello.py',
    interpreter'python3'
  }]
};
複製程式碼

在這個例子中,我們宣告瞭兩個應用程式,通過 interpreter 配置程式啟動的直譯器,一個使用 Python2 (預設)執行,另一個使用 Python3 執行。

啟動它,依然使用 pm2 start 命令。

$ pm2 start ecosystem.config.js
複製程式碼

想要單獨重啟 “production” (env_production):

$ pm2 restart ecosystem.config.js --env production
複製程式碼

Ecosystem.config.js 檔案中,很多配置都是可以通過命令來指定,例如,可以通過 --interpreter 來指定解析程式。

通常我們會同時安裝 Python2.x 和 Python3.x 的環境,而 PM2 在預設情況下,是通過指令碼檔案字尾來判斷的,如果沒有字尾就需要強制指定 --interpreter

{
  ".sh""bash",
  ".py""python",
  ".rb""ruby",
  ".coffee" : "coffee",
  ".php""php",
  ".pl" : "perl",
  ".js" : "node"
}
複製程式碼

這些配置資訊也標記了 PM2 支援的指令碼程式。

那麼如果需要使用 Python3.x 來執行某個指令碼,就需要 --interpreter 了。

$ pm2 start hello.py --interpreter=python3
複製程式碼

小結

PM2 的簡單使用,就先介紹到這裡。雖然這裡使用 Python 來舉例,但是本文所有相關命令,是可以適用其他 PM2 支援的指令碼程式。

PM2 還有很多強大的功能,比如說利用 SSH 輕鬆部署到伺服器、負載均衡等等都是一些不錯的功能,有興趣可以查閱文件。PM2 文件很健全,大部分問題都可以在文件中找到答案。

有任何問題,歡迎在留言區討論,有用就分享吧,謝謝!

參考:

https://blog.pm2.io/managing-python-application-with-pm2

https://pm2.io/doc/en/runtime/quick-start/

公眾號後臺回覆成長『成長』,將會得到我準備的學習資料,也能回覆『加群』,一起學習進步;你還能回覆『提問』,向我發起提問。

推薦閱讀:

圖解 Chrome,架構篇 | 利用預處理指令碼,管理小程式程式碼| 分詞,科普及解決方案| 圖解:HTTP 範圍請求 | 小程式學習資料 |HTTP 內容編碼 | 輔助模式實戰 | 輔助模式玩出花樣 | 小程式 Flex 佈局

相關文章