【Django雜記】uwsgi的配置
阿新 • • 發佈:2022-05-31
- 首先了解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