1. 程式人生 > 其它 >【Django雜記】uwsgi的配置

【Django雜記】uwsgi的配置

  • 首先了解wsgi是一個Python  web伺服器,uwsgi實現了wsgi所有的功能,效能文件,效率高的伺服器。
  • uwsgi是一個通用server伺服器,支援Python,ruby等多種語言。uwsgi支援自動伸縮,當空閒超過一定時間,會關閉worker,當請求處理不過來排隊時,會建立新的worker
1、安裝uwsgi
pip install uwsgi
2、配置uwsgi
  • 建立一個wsgi.init的檔案,該檔案的內容如下:
[uwsgi]
# 使用nginx連線時使用
socket=0.0.0.0:8000
# 直接做web伺服器使用
# http=0.0.0.0:8000
# 專案目錄, 與manager.py同級
chdir = /home/計算機名/專案名
# 專案中wsgi.py檔案的目錄,相當於專案目錄
wsgi-file=專案名/wsgi.py

# 主程序,啟動一個master程序,來管理其餘其他的子程序
master=True
# 設定工作程序的數量
processes=4
# 設定每個工作程序的執行緒數
threads=2

# python虛擬環境目錄絕對路徑。如果有的話,home是虛擬環境的根目錄,pythonhome是虛擬環境下的bin目錄(放置了python執行檔案)
# home = /env
# PYTHOMHOME = /env/bin

# pid檔案,用於指令碼啟動,停止
pidfile=uwsgi.pid

# 設定後臺執行儲存日誌。只要配置了daemonize將會讓uwsgi後臺執行,同時將日誌輸出到指定目錄
daemonize=uwsgi.log

# 服務停止時自動移除unix Socket和pid檔案
vacuum = true

# 設定每個工程程序處理請求的上線,達到上限時,將回收(重啟)程序,可以預防記憶體洩露
max-requests=5000

# 靜態檔案對映
static-map = /static=Django下static目錄的絕對路徑

# 指定日誌檔案的許可權
logfile-chome=644

# uWSGI伺服器執行時的使用者ID
uid=xxx
# uWSGI伺服器執行時的使用者組ID
gid=xxx
# 指定工作程序名稱的字首
procname-prefix-spaced=xxx

# uWSGI載入的木塊中哪個變數將被呼叫
callable=xxx

# 監控專案的py檔案的mtime來觸發過載(只在開發時使用),py-autoreload表示多長時間檢測一次,單位秒
py-autoreload=1

# 在每個worker而不是master中載入應用。預設為false,表示先載入應用,再fork出worker,這樣做可以讓worker儘量共用記憶體,只有當寫時才copy,由於先載入再fork,但有些東西是不支援fork的,比如socket連線,所以lazy-apps=false時,不要在載入應用時自動建立資料庫連線等
lazy-apps=true

# 設定用於uwsgi包解析的內部快取區大小為64k。預設為4k
buffer-size=32768

# 設定最大日誌檔案大小
log-maxsize=5000000

# 禁用請求日誌記錄
disable-logging=true

# 設定socket的監聽佇列大小(預設為:100)
listem=120

# 這個引數不會影響app內建立執行緒,隻影響wsgi內部的api,預設值為false。可以認為對使用者無影響,使用預設值即可。參見:https://github.com/unbit/uwsgi/issues/1141
enable-threads=true

# 設定在平滑的重啟(直到接收到的請求處理完才重啟)一個工作子程序中,等待這個工作結束的最長描述。這個配置會使在平滑地重啟工作子程序中,如果工作程序結束時間超過了8秒就會被強行結束(忽略之前已經接收到的請求而直接結束)
reload-mercy=8

# 通過使用POSIX/UNIX的setrlimit()函式來限制每個uWSGI程序的虛擬記憶體使用數。這個配置會限制uWSGI的程序佔用虛擬記憶體不超過256M。如果虛擬記憶體已經達到256M,並繼續申請虛擬記憶體則會使程式報記憶體錯誤,本次的http請求將返回500錯誤。
limit-as = 256

 
# 一個請求花費的時間超過了這個harakiri超時時間,那麼這個請求都會被丟棄,並且當前處理這個請求的工作程序會被回收再利用(即重啟)
harakiri = 60
3、啟動
uwsgi --ini uwsgi.ini
    • 如果想檢視啟動是否成功:
ps aux | grep uwsgi
4、重新啟動
uwsgi --reload uwsgi.pid
5、停止
uwsgi --stop uwsgi.pid
6、示例
[uwsgi]
# 直接作為web伺服器 【注意:這裡的IP是阿里雲的內網IP】
http=172.17.42.6:10000
# http=47.94.132.145:10000

# 專案目錄
chdir=/home/weapp/weappProject

# uwsgi檔案路徑
wsgi-file=weappProject/wsgi.py

home = /home/.virtualenvs/weapp
PYTHONHOME = /home/.virtualenvs/weapp/bin

# 主程序
master=true
processes=4
threads=2

# 請求上線
max-requests=5000

# pid檔案,用於指令碼啟動,停止
pidfile=/home/logs/weapp/uwsgi.pid

# 設定後臺執行儲存日誌
daemonize=/home/logs/weapp/uwsgi.log

# 服務停止時自動停止unix Socket和pid檔案
vacuum=true
示例:
[uwsgi]
chdir=/home/git/www/cloudmonitor # 指定專案目錄
home=/home/git/www/cloudmonitor/.env # 指定python虛擬環境
wsgi-file=manager.py # 指定載入的WSGI檔案
callable=app # 指定uWSGI載入的模組中哪個變數將被呼叫
master=true # 啟動主執行緒
processes=4 # 設定工作程序的數量
threads=2 # 設定每個工作程序的執行緒數
socket=127.0.0.1:8888 # 指定socket地址
vacuum=true # 當伺服器退出時自動刪除unix socket檔案和pid檔案
logfile-chmod=644 # 指定日誌檔案的許可權
daemonize=%(chdir)/cloudmonitor.log # 程序在後臺執行,並將日誌列印到指定檔案
pidfile=%(chdir)/cloudmonitor.pid # 在失去許可權前,將主程序pid寫到指定的檔案
uid=git # uWSGI伺服器執行時的使用者id
gid=git # uWSGI伺服器執行時的使用者組id
procname-prefix-spaced=cloudmonitor # 指定工作程序名稱的字首
  • uWSGI的翻譯:https://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html