之前寫過 debian8 和 debian9 的配置文章,現在升級到了 debian10,那就重新調整一下安裝過程.
debian9+flask+uWSGI+uWSGI Emperor 配置流程
Debian8 + Flask + Nginx + uWSGI + uWSGI Emperor 基本配置文件注意事項
查看系統相關信息
debian版本號
cat /etc/issue
python 及 GCC 版本號
python3
pip 版本號
pip3 -V
安裝 uwsgi
注意,有的同學會提前安裝好項目的 python 虛擬環境,但這裏不是在虛擬環境裏安裝的,是在根目錄環境安裝 uwsgi:
pip install uwsgi
安裝 nginx
我用的是 oneinstack 一鍵腳本。可以百度找一下。
注意:文章所有 xxx.com 地方均需要改為自己的域名或文件夾路徑。
通過自帶功能新增域名映射文件存放路徑:
/data/root/xxxx.com
安裝 Flask
創建虛擬環境
使用python3自帶的venv命令虛進行創建虛擬環境。以下命令中,第二個venv是文件夾名稱:
cd /data/root/xxxx.com
python3 -m venv venv
其它虛擬環境也可以,大家可以自由選擇, 比如 virtualenv。
安裝 Flask
進入虛擬環境:
source venv/bin/activate
通過 pip命令進行安裝flask:
pip3 install flask
新建 uWSGI 配置文件
創建一個新的 uWSGI 配置文件/data/root/xxx.com/xxx.com_uwsgi.ini:
[uwsgi]
#指向網站跟目錄,應用程序的文件夾路徑 application's base folder
base = /data/root/xxx.com
# 按字面意思是python的環境變量路徑,寫的是網站根目錄
# 給PYTHONPATH 增加一個目錄(或者一個egg),你可以最多使用該選項64次。
# 給PYTHONPATH python-path pp 這三個是相同作用
pythonpath = %(base)
# 虛擬目錄,設置PYTHONHOME/virtualenv
home = %(base)/venv
# 指定監聽文件,修改後重新打開日誌
# 如果修改/碰了指定的文件,那麼觸發日誌的重新打開
touch-logreopen = /data/logs/uwsgi/.touchforlogrotate
#使進程在後台運行,並將日誌打到指定的日誌文件或者udp服務器。
#這個指令會讓uWSGI在後台運行並將日誌打到 /data/logs/uwsgi/的對應文件中。
daemonize = /data/logs/uwsgi/%n.log
#日誌文件的路徑 location of log files
; logto = /data/logs/uwsgi/%n.log
#加載指定的python WSGI模塊(模塊路徑必須在PYTHONPATH裏)
module = app
# 設置在收到請求時,uWSGI加載的模塊中哪個變量將被調用,默認是名字為“application”的變量。
callable = app
#socket文件的路徑 socket file's location
socket = %(base)/tmp/%n.sock
#pchmod-socket的權限 ermissions for the socket file
chmod-socket = 666
# 處理器數
processes = 2
# 線程數
1threads = 2
#您需要的是,reload-mercy是用作回退的全局值。
#what you need, reload-mercy is a global value used as a fallback
#--reload-mercy-在重新加載/停止整個uWSGI實例時使用
#--worker-reload-mercy-在重新加載/停止單個工作程序時使用
worker-reload-mercy = 10
# 修改代碼時,自動重啓uwsgi服務,每1秒檢查一次
python-autoreload = 1
# 這個選項會設置harakiri超時時間(可以看wiki首頁的相關內容)。如果一個請求花費的時間超過了這個harakiri超時時間,那麼這個請求都會被丟棄,並且當前處理這個請求的工作進程會被回收再利用(即重啓)。
# 這個設置會使uwsgi丟棄所有需要60秒才能處理完成的請求。
harakiri = 60
按照實際情況修改文件中的路徑。
創建日誌文件夾
創建一個新文件夾存放uWSGI日誌,更改文件夾的所有權(因為我是用 oneinstack 腳本創建的文件夾,默認用户組是www:www,所以相關文件夾擁有者權限也是給了www:www):
mkdir -p /data/logs/uwsgi
chown -R www:www /data/logs/uwsgi
配置網站的nginx配置文件
在原有的域名conf配置文件中添加以下內容:
location / {
try_files $uri @yourapplication;
}
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/data/root/xxx.com/tmp/xxx.com_uwsgi.sock;
}
配置uWSGI Emperor
使用uWSGI Emperor管理多個 uwsgi。uWSGI Emperor是用來管理uwsgi後台運行的。
新建/etc/systemd/system/emperor.uwsgi.service文件,代碼如下:
[Unit]
Description=uWSGI Emperor
After=syslog.target
[Service]
#uwsgi 服務的路徑,以及需要啓動的 ini 文件路徑,根據自己的實際情況進行修改
ExecStart=/usr/local/bin/uwsgi --ini /etc/uwsgi/emperor.ini
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
創建/etc/uwsgi文件夾
mkdir /etc/uwsgi
創建文件/etc/uwsgi/emperor.ini:
touch /etc/uwsgi/emperor.ini
裏面代碼如下:
[uwsgi]
emperor = /etc/uwsgi/vassals
uid = www
gid = www
把網站的uwsgi.ini文件要給個軟鏈,加到/etc/uwsgi/vassals/ 文件夾中:
mkdir /etc/uwsgi/vassals
ln -s /data/root/xxx.com/xxx.com_uwsgi.ini /etc/uwsgi/vassals
在/etc/uwsgi/emperor.ini文件裏,設置了文件所有者是 www:www,我們要給對應的文件夾和文件做所有者權限修改(這一步根據實際情況來判斷是否需要):
chown -R www:www /data/root/xxx.com
chown -R www:www /data/logs/uwsgi/
至此,配置已經完成。
相關命令
啓動服務
systemctl start emperor.uwsgi.service
檢查狀態
systemctl status emperor.uwsgi.service
你會看到提示:
emperor.uwsgi.service - uWSGI Emperor
Loaded: loaded (/etc/systemd/system/emperor.uwsgi.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2022-10-31 23:55:52 CST; 3s ago
Main PID: 27634 (uwsgi)
Status: "The Emperor is governing 0 vassals"
Tasks: 1 (limit: 3549)
Memory: 3.4M
CGroup: /system.slice/emperor.uwsgi.service
└─27634 /usr/local/bin/uwsgi --ini /etc/uwsgi/emperor.ini
Oct 31 23:55:52 giaogiao uwsgi[27634]: *** WARNING: you are running uWSGI without its master process manager ***
Oct 31 23:55:52 giaogiao uwsgi[27634]: your processes number limit is 11830
開機啓動
systemctl enable emperor.uwsgi.service
其它命令
systemctl start emperor.uwsgi.service
systemctl stop emperor.uwsgi.service
systemctl status emperor.uwsgi.service