uwsgi 啓動或停止
啓動:
uwsgi --ini uwsgi.ini
uwsgi.pid 是ini配置文件中配置的
停止:
uwsgi --stop uwsgi.pid
例子
uwsgi --stop ./script/uwsgi.pid
查看日誌
tail -50f ./script/uwsgi.log
uwsgi unable to load configuration from stop
首先判斷進入虛擬環境
檢查uwsgi的指令是否正確
uwsgi signal_pidfile()/kill(): No such process [core/uwsgi.c line 1695]
uwsgi signal_pidfile()/kill(): No such process [core/uwsgi.c line 1693]
通過 ps -ef |grep uwsgi 檢查uwsgi檢查進程
將之前的ini全部kill,既然重啓不管用就全關掉
kill全部uwsgi ini進程 killall -s INT uwsgi
查看uwsgi有關的進程 ps -ef |grep uwsgi
啓動uwsgi: uwsgi --ini uwsgi.ini
- 查看uwsgi進程
這裏是20843 - 找到 uwsgi.pid 文件打開發現不是20843
- 更改 uwsgi.pid 文件中的那個id(數)爲20843
- 重新執行下重啓服務的命令
Invalid HTTP_HOST header: '202.200.111.111'. You may need to add '202.200.111.111' to ALLOWED_HOSTS.
setting.py文件
將ALLOWED_HOSTS = []改爲ALLOWED_HOSTS = ['*']
https -- > http
80端口需要root用戶才能佔用。
pip install uwsgi
pip install uwsgitop
pip安裝uwsgi後,Linux命令行敲擊uwsgi --help後,提示uwsgi命令找不到?
答:進入python安裝環境的bin,然後使用ln -s進行軟鏈接到/usr/bin/下;
web目錄規範化(項目中只用預留一個uwsgi文件夾和ini文件,之後配置中要用)
root@root:$ ls -l
├── .項目目錄其他文件
├── hello.py
├── hello.pyc
├── uwsgi
│ ├── uwsgi.log # 日誌文件,通過該文件查看uwsgi的日誌
│ ├── uwsgi.pid # pid文件,通過該文件可以控制uwsgi的重啓和停止
│ ├── uwsgi.sock # socket文件,配置nginx時候使用
│ └── uwsgi.status # status文件,可以查看uwsgi的運行狀態
└── uwsgi.ini
uwsgi.ini文件,配置參數詳解
master = true
#啓動主進程,來管理其他進程,其它的uwsgi進程都是這個master進程的子進程,如果kill這個master進程,相當於重啓所有的uwsgi進程。
chdir = /web/www/mysite
#在app加載前切換到當前目錄, 指定運行目錄
module = mysite.wsgi
# 加載一個WSGI模塊,這裏加載mysite/wsgi.py這個模塊
py-autoreload=1
#監控python模塊mtime來觸發重載 (只在開發時使用)
lazy-apps=true
#在每個worker而不是master中加載應用
socket = /test/myapp.sock
#指定socket文件,也可以指定爲127.0.0.1:9000,這樣就會監聽到網絡套接字
processes = 2 #啓動2個工作進程,生成指定數目的worker/進程
buffer-size = 32768
#設置用於uwsgi包解析的內部緩存區大小爲64k。默認是4k。
daemonize = /var/log/myapp_uwsgi.log
# 使進程在後臺運行,並將日誌打到指定的日誌文件或者udp服務器
log-maxsize = 5000000 #設置最大日誌文件大小
disable-logging = true #禁用請求日誌記錄
vacuum = true #當服務器退出的時候自動刪除unix socket文件和pid文件。
listen = 120 #設置socket的監聽隊列大小(默認:100)
pidfile = /var/run/uwsgi.pid #指定pid文件
enable-threads = true
#允許用內嵌的語言啓動線程。這將允許你在app程序中產生一個子線程
reload-mercy = 8
#設置在平滑的重啓(直到接收到的請求處理完才重啓)一個工作子進程中,等待這個工作結束的最長秒數。這個配置會使在平滑地重啓工作子進程中,如果工作進程結束時間超過了8秒就會被強行結束(忽略之前已經接收到的請求而直接結束)
max-requests = 5000
#爲每個工作進程設置請求數的上限。當一個工作進程處理的請求數達到這個值,那麼該工作進程就會被回收重用(重啓)。你可以使用這個選項來默默地對抗內存泄漏
limit-as = 256
#通過使用POSIX/UNIX的setrlimit()函數來限制每個uWSGI進程的虛擬內存使用數。這個配置會限制uWSGI的進程佔用虛擬內存不超過256M。如果虛擬內存已經達到256M,並繼續申請虛擬內存則會使程序報內存錯誤,本次的http請求將返回500錯誤。
harakiri = 60
#一個請求花費的時間超過了這個harakiri超時時間,那麼這個請求都會被丟棄,並且當前處理這個請求的工作進程會被回收再利用(即重啓)
常用命令
uwsgi --ini uwsgi.ini # 啓動
uwsgi --reload uwsgi.pid # 重啓
uwsgi --stop uwsgi.pid # 關閉
關於uwsgi部署flask報unable to find "application" callable in file這個錯誤的可能性原因,如下:
unable to find "application" callable in file ./__init__.py
unable to load app 0 (mountpoint='') (callable not found or import error)
*** no app loaded. going in full dynamic mode ***
你的啓動文件缺少flask框架的實例,必須暴露變量。
app = Flask(__name__)
uwsgi的配置錯誤
chdir = /user
wsgi-file = (應該爲chdir的相對目錄,而不是配置文件的相對目錄)
報錯unable to load configuration from /opt/bhcrjy/uwsgi的原因:
*** Operational MODE: preforking ***
[init_app]redisPool is 32376
[init_app]redisPool is 32376
* Serving Flask app "uwsgi_file___bhcrjyApp_runserver" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
// 錯誤在這裏,啓動後立馬停止
unable to load configuration from /opt/bhcrjy/uwsgi
VACUUM: pidfile removed.
原因是因爲,你的啓動文件中app.run(),應該移除或者單獨一個文件中,因爲WSGI會自動調用Flask的callable方法去啓動。
REF
https://www.jianshu.com/p/31f95af5ce51
https://blog.csdn.net/weixin_45707980/article/details/121288213