python每日一記: 學(xué)習(xí)使用supervisor
?
介紹
Supervisor 是基于 Python 的進(jìn)程管理工具昌抠,只能運(yùn)行在 Unix-Like 的系統(tǒng)上患朱,也就是無法運(yùn)行在 Windows 上。Supervisor 官方版目前只能運(yùn)行在 Python 2.4 以上版本炊苫,
但是還無法運(yùn)行在 Python 3 上裁厅,不過已經(jīng)有一個 Python 3 的移植版 supervisor-py3k冰沙。
?
Supervisor 有兩個主要的組成部分:
supervisord
,運(yùn)行 Supervisor 時會啟動一個進(jìn)程 supervisord执虹,它負(fù)責(zé)啟動所管理的進(jìn)程拓挥,并將所管理的進(jìn)程作為自己的子進(jìn)程來啟動,而且可以在所管理的進(jìn)程出現(xiàn)崩潰時自動重啟袋励。supervisorctl
侥啤,是命令行管理工具,可以用來執(zhí)行 stop茬故、start盖灸、restart 等命令,來對這些子進(jìn)程進(jìn)行管理磺芭。
?
?
安裝supervisor
pip安裝
-
pip為python-pip2.7
sudo pip install supervisor
-
apt安裝
apt-get install supervisor
創(chuàng)建配置文件
?
-
執(zhí)行命令:
echo_supervisord_conf > /etc/supervisord.conf
如果遇到 報(bào)錯 permission denied: /etc/supervisord.conf
sudo su - root -c "echo_supervisord_conf > /etc/supervisord.conf"
配置文件說明
想要了解怎么配置需要管理的進(jìn)程赁炎,只要打開 supervisord.conf 就可以了,里面有很詳細(xì)的注釋信息钾腺。
- 打開配置文件
vim /etc/supervisord.conf
默認(rèn)的配置文件是下面這樣的徙垫,但是這里有個坑需要注意,supervisord.pid 以及 supervisor.sock
是放在 /tmp 目錄下放棒,但是 /tmp 目錄是存放臨時文件松邪,里面的文件是會被 Linux 系統(tǒng)刪除的,一旦這些文件丟失哨查,
就無法再通過 supervisorctl 來執(zhí)行 restart 和 stop 命令了逗抑,會提醒unix:///tmp/supervisor.sock 不存在的錯誤
。
[unix_http_server]
;file=/tmp/supervisor.sock ; (the path to the socket file)
;修改為 /var/run 目錄寒亥,避免被系統(tǒng)刪除
file=/var/run/supervisor.sock ; (the path to the socket file)
...
-
web管理
?supervsior服務(wù)是有web管理界面的邮府,可以對服務(wù)可視化,看到服務(wù)的狀態(tài)溉奕,同時可以控制服務(wù)褂傀,
不過默認(rèn)是關(guān)閉的,因?yàn)槿绻麑⑺蟹?wù)暴露給壞人加勤,這肯定是運(yùn)維的噩夢仙辟。
所以你還是選擇開web節(jié)目,記做贰叠国!記住戴尸!記姿诤浮! 防火墻,改端口项棠,加認(rèn)證悲雳。
[inet_http_server] ; inet (TCP) server disabled by default
;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for ;all iface)
;username=user ; (default is no username (open server))
;password=123 ; (default is no password (open server))
...
同理:
在[supervisord]中,是配置supervisor的日志香追,盡量將/tmp合瓢,改為/var/log下
[supervisord]
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
;修改為 /var/log 目錄,避免被系統(tǒng)刪除
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
;修改為 /var/run 目錄透典,避免被系統(tǒng)刪除
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
...
;設(shè)置啟動supervisord的用戶歪玲,一般情況下不要輕易用root用戶來啟動,除非你真的確定要這么做
;user=chrism ; (default is current user, required if root)
...
默認(rèn)情況下掷匠,進(jìn)程的日志文件達(dá)到50MB時,將進(jìn)行分割岖圈,最多保留10個文件讹语,當(dāng)然這些配置也可以對每個進(jìn)程單獨(dú)配置。
- 這部分需要跟[unix_http_server]蜂科、[inet_http_server]內(nèi)容匹配哦顽决,內(nèi)容大致相同;
[supervisorctl]
; 必須和'unix_http_server'里面的設(shè)定匹配
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
;修改為 /var/run 目錄导匣,避免被系統(tǒng)刪除
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris ; should be same as http_username if set
;password=123 ; should be same as http_password if set
權(quán)限問題
設(shè)置好配置文件后才菠,應(yīng)先創(chuàng)建上述配置文件中新增的文件夾。如果指定了啟動用戶 user贡定,
這里以 star為例赋访,那么應(yīng)注意相關(guān)文件的權(quán)限問題,包括日志文件缓待,否則會出現(xiàn)沒有權(quán)限的錯誤蚓耽。
例如設(shè)置了啟動用戶 star,然后啟動 supervisord 出現(xiàn)錯誤
Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)
就是由于上面的配置文件中 /var/run 文件夾旋炒,沒有授予啟動 supervisord 的用戶 oxygen 的寫權(quán)限步悠。
/var/run 文件夾實(shí)際上是鏈接到 /run,因此我們修改 /run 的權(quán)限瘫镇。
sudo chmod 777 /run
sudo chmod 777 /var/log
這樣有點(diǎn)簡單粗暴鼎兽,也可以考慮把上述配置文件中 .sock,.pid 等文件修改到其他文件夾中铣除,
并確保有相應(yīng)的權(quán)限即可谚咬。一般情況下,我們可以用 root 用戶啟動 supervisord 進(jìn)程尚粘,然后在其所管理的進(jìn)程中序宦,
再具體指定需要以那個用戶啟動這些進(jìn)程。
如nginx 啟動的屬主為 nginx. nginx
使用 include
在配置文件的最后,有一個 [include] 的配置項(xiàng)互捌,跟 Nginx 一樣潘明,可以 include 某個文件夾下的所有配置文件,這樣我們就可以為每個進(jìn)程或相關(guān)的幾個進(jìn)程的配置單獨(dú)寫成一個文件秕噪。
12 [include]files = /etc/supervisord.d/*.ini