supervisor+gunicorn部署python web項目


有了Nginx,對於Tomcat沒有必要詳細了解。
有了supervisor,再也沒有必要把一個程序設置成服務、駐留進程,supervisor真是一個相見恨晚的好工具。
在Tomcat中,所有的webapp默認共享8080端口;在Python世界中,每一個web程序都要占用一個端口,要想讓這些web程序共享80端口,就需要使用Nginx進行反向代理,Nginx相當於一個路由器用來轉發請求。Nginx跟Tomcat、Gunicorn之間的關系是相當的松耦合,Nginx根本不負責管理這些服務器,Nginx只是一個請求轉發器,當請求來臨,判斷一下請求的類型、重寫一下請求、將請求轉發向合適的處理者。即便是Tomcat、Gnicorn崩了,Nginx也是不關心。Nginx只知道向某個端口轉發請求。

最簡單的運行python web的方式

最簡單的python web運行方式是使用nohup myCmd & 命令運行,nohup表示no hang up,關閉遠程登錄之后程序不掛起繼續執行,&表示后台執行。
對於django,使用命令python manage.py runserver 0.0.0.0:8000
對於flask,使用命令python mine.py

使用supervisor

supervisor是用Python語言編的進程管理、監控工具,只適用於Linux。
supervisor功能雖然強大,但常用功能也就那么一點點,實在沒有必要對它特別了解。
知道常用配置足矣。

安裝supervisor可以采用pip install的方式,但是可能出錯(supervisor與python版本的問題)。

supervisor不僅是python包,也是一個應用程序,可以通過sudo apt-get install supervisor命令進行安裝,這是最佳實踐。

如果一個python工具不是編程調用,那就使用apt-get進行安裝
這樣安裝還有一個好處,可以自動把supervisor設置成一個服務,從而可以開機自啟動。

下面介紹與supervisor相關的幾個概念:

  • echo_supervisord_conf命令:打印supervisor常用配置,可以重定向命令將配置輸出到文本文件echo_supervisord_conf > haha.conf

  • supervisord:supervisor的后台守護進程,跟mysqld、ftpd等服務一樣,它是一個TCP客戶端,監聽某個固定端口。

  • supervisorctl:command tools,是supervisor控制台,這個控制台可以遠程控制服務器上的supervisord,它們之間的通信方式為XML-RPC

  • supervisorctl常用命令:help查看全部命令
    當修改supervisord.conf之后,需要在supervisorctl中使用reload命令重新加載配置

supervisord命令加載配置的順序:

  • 如果使用-c命令指定配置文件位置,那么就加載那個文件,否則按如下順序查找配置文件
  • $CWD/supervisord.conf
  • $CWD/etc/supervisord.conf
  • /etc/supervisord.conf

配置文件最佳實踐:

將每一個應用創建一個conf文件,放在/etc/supervisor/conf.d目錄下,主配置文件/etc/supervisord.conf中默認包含了conf.d目錄下的配置文件。
像這種一個主配置文件,允許自定義從配置文件的方式很常見,很多軟件都是這樣配置的。

/etc/supervisord.conf主配置文件包含了conf.d/*.conf

[include]
files = /etc/supervisor/conf.d/*.conf

用supervisor管理gunicorn時,需要將gunicorn的deamon參數置為false。

[program:usercenter]
directory = /home/leon/projects/usercenter ; 程序的啟動目錄
command = gunicorn -c gunicorn.py wsgi:app  ; 啟動命令,可以看出與手動在命令行啟動的命令是一樣的
autostart = true     ; 在 supervisord 啟動的時候也自動啟動
startsecs = 5        ; 啟動 5 秒后沒有異常退出,就當作已經正常啟動了
autorestart = true   ; 程序異常退出后自動重啟
startretries = 3     ; 啟動失敗自動重試次數,默認是 3
user = leon          ; 用哪個用戶啟動
redirect_stderr = true  ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile_maxbytes = 20MB  ; stdout 日志文件大小,默認 50MB
stdout_logfile_backups = 20     ; stdout 日志文件備份數
; stdout 日志文件,需要注意當指定目錄不存在時無法正常啟動,所以需要手動創建目錄(supervisord 會自動創建日志文件)
stdout_logfile = /data/logs/usercenter_stdout.log
 
; 可以通過 environment 來添加需要的環境變量,一種常見的用法是修改 PYTHONPATH
; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere

更改完supervisor配置之后,使用sudo service supervisor restart命令重啟supervisor服務。輸入sudo service supervisor命令,按幾下tab可以看到更多可用命令。使用sudo service supervisor force-reload 重新加載配置。

在supervisorctl中可以start、stop、restart+程序名稱來控制這個程序。supervisorctl是一個交互式supervisor管理工具。sudo supervisorctl stop 服務名可以停止程序。sudo supervisorctl reload可以重新加載配置。sudo supervisorctl status可以查看服務運行狀態。

修改主配置文件supervisord.conf中的inet_http_server部分可以通過網頁方式訪問supervisor,監控服務器狀態。

查看日志

在服務器上,查看日志是唯一能夠看到程序運行細節的方式。大部分程序的默認日志都放在/var/log/目錄下(像Nginx、supervisor等工具的日志都在這里)。如果配置完supervisor之后,發現沒有達到想要的效果,有可能是配置不正確,至於哪里不正確,可以去日志/var/log/supervisor里看一下。
我們在/etc/supervisor/conf.d/xxx.conf 中配置了stdout和stderr,去對應路徑下tail -f,然后嘗試sudo service supervisor restart重啟服務,肯定能夠定位錯誤。

更多配置內容請使用echo_supervisord_conf|more命令慢慢查看吧。

使用gunicorn

gunicorn也是只適用於Linux,不適用於windows。
gunicorn也是采用apt-get方式安裝,gunicorn當然也是一個應用,不用管它是用python2開發的還是python3開發的,直接sudo apt-get install肯定好使。

最簡單的方式啟動django應用:
cd到myweb/myweb目錄下(myweb是django項目名稱),直接運行gunicorn -b0.0.0.0:8000 wsgi:application
解釋:

  • -b參數用來綁定監聽端口,默認是綁定到localhost,改成0.0.0.0就變成了監聽全部主機的端口,這樣才能夠外網訪問。
  • wsgi為python文件名,application為文件中的一個變量

將gunicorn后台運行有多種方式:

  • 使用supervisor管理之,這時gunicorn一定不是守護進程
  • 使用nohup gunicorn wsgi:application&不掛起地執行
  • 使用gunicorn的--deamon參數,使之作為deamon來運行
  • 將gunicorn設置成一個服務

一旦使用了supervisor,就再也沒有必要添加更多的服務、守護進程了,用supervisor就足夠了。

將一個程序設置成服務,需要如下步驟:
編輯 sudo nano /etc/init/gunicorn.conf

description "The gunicorn service"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
setuid root
setgid www-data

env PATH= /var/www/venv/bin
chdir /var/www/

exec gunicorn -w 4 -b 127.0.0.1:8080 wsgi:application

如上,設置好用戶、當前路徑、全局變量、要執行的命令。
sudo service gunicorn start就可以將gunicorn作為服務運行了

詳細文檔

supervisor官方文檔
gunicorn官方文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM