一、uwsgi配置
監控uwsgi運行狀態
uwsgitop 127.0.0.1:5000
uwsgitop輸出信息
WID -> worker id
% -> percentage of served requests by the worker
PID -> process id of the worker
REQ -> number of managed requests
RPS -> number of current requests handled per second
EXC -> number of raised exceptions
SIG -> number of managed uwsgi signals (NOT unix signals !!!)
STATUS -> can be idle, busy, pause, cheaped or sig
AVG -> average response time for the worker
RSS -> RSS memory (need --memory-report)
VSZ -> address space (need --memory-report)
TX -> transmitted data
RunT -> running time
uwsgitop 后面的地址為下方的stat
[uwsgi]
# 允許主進程存在
master=true
#
chdir=/root/project
virtualenv=/root/project/venv
# “mount”參數表示將”/”地址路由到”run.py”中,”manage-script-name”參數表示啟用之前在Nginx里配置的”SCRIPT_NAME”參數。再次重啟Nginx和uWSGI,你就可以通過”http://localhost/app”來訪問應用了
mount=/=run.py
# mount和wsgi-file用其中一個就行了,最好用wsgi-file
wsgi-file=run.py
manage-script-name=true
# 監控參數或py文件的修改,當有修改時會觸發重載,生產環境不允許設為1 (只在開發時使用)
py-autoreload=0
# uWSGI試圖在一切可能的情況下(濫)用 fork() 調用的寫時拷貝語義。默認情況下,它會在加載你的應用之后進行fork,以盡可能的共享它們的內存。如果出於某些原因,不期望這個行為,那么使用 lazy-apps 選項。這將會指示uWSGI在每個worker的 fork() 之后加載應用
lazy-apps=true
# 設置在收到請求時,uWSGI加載的模塊中哪個變量將被調用,默認是名字為“app”的變量
callable=app
# 指定uwsgi的客戶端將要連接的socket的路徑(使用UNIX socket的情況)或者地址(使用網絡地址的情況)
socket=127.0.0.1:5003
# 使用HTTP協議綁定到指定UNIX/TCP socket上
# http-socket=127.0.0.1:5003
# 設置socket的監聽隊列大小
listen = 65535
# uwsgi進程數
processes=16
# 記錄uwsgi的master進程的pid
pidfile = /data/project_logs/project_uwsgi.pid
# 設置請求的最大大小 (排除request-body),這一般映射到請求頭的大小。默認情況下,它是4k
buffer-size=32768
# 將日志打到指定的日志文件,如果使用“daemonize =”的話會導致supervisor守護進程失敗,因為設置daemonize在將日志記錄到文件的同時,也會讓uWSGI進程進入后台守護uWSGI,而supervisor本身就已經起到了守護進程的作用
logto = /data/project_logs/uwsgi.log
# 以固定的文件大小(單位KB),切割日志文件
log-maxsize = 1000000
# 當啟動時切分日志
log-truncate = true
# 不記錄請求信息request的日志。只記錄錯誤以及uWSGI內部消息到日志中
disable-logging = true
# 將uWSGI狀態作為一個JSON對象導出到一個socket,使用uwsgi --connect-and-read /data/project_logs/uwsgi_stats.sock可以獲取這個json對象
stats = /data/project_logs/uwsgi_stats.sock
或者
stats=127.0.0.1:5000
# 啟用gevent循環引擎,使用指定數目的異步核心數和優化參數
gevent=1000
# 啟動時自動調用gevent.monkey.patch_all()
gevent-monkey-patch=true
# 允許用內嵌的語言啟動線程。這將允許你在app程序中產生一個子線程
enable-threads = true
# uwsgi的單個進程worker占用物理內存達到1024M,會自動重啟這個worker(防止內存泄露導致worker所占內存越來越多)
reload-on-rss = 1024
# uwsgi的單個worker占用虛擬內存達到2048M,會自動重啟這個worker(防止內存泄露導致worker所占內存越來越多)
reload-on-as = 2048
二、supervisor配置
[program:project]
directory=/root/project
environment=LB_ADX_CONFIG=production
command=/root/project/venv/bin/uwsgi --ini project_uwsgi.ini
stopasgroup=true
stopsignal=QUIT
autostart = true
startsecs = 5
autorestart = true
redirect_stderr = true
配置詳解:
stopasgroup=true
這個東西主要用於,supervisord管理的子進程,這個子進程本身還有子進程。那么我們如果僅僅干掉supervisord的子進程的話,子進程的子進程有可能會變成孤兒進程。所以我們可以設置這個選項,把整個該子進程的整個進程組都干掉。 設置為true的話,一般killasgroup也會被設置為true。需要注意的是,該選項發送的是stop信號。
如果不加這個的話,可能會有老的uwsgi進程的子進程殺不死的情況發生,從而占用端口,導致新的uwsgi進程啟動不起來
stopsignal=QUIT
干掉進程的信號,默認為TERM,比如設置為QUIT,那么如果QUIT來干這個進程那么會被認為是正常維護,退出碼也被認為是expected中的。
之所以要設置environment參數的原因是,我在項目中要讀取LB_ADX_CONFIG這個環境變量,supervisord在linux中啟動默認繼承了linux的環境變量,在這里可以設置supervisord進程特有的其他環境變量。