有了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作為服務運行了
