在生產環境中通常用uwsgi作為Flask的web服務網關,通過nginx反向代理進行負載均衡,通過supervior進行服務進行的管理,這一套搭下來還是有一些坑要踩,本文通過一個簡單的Flask web應用記錄了CentOS7下python3+Flask+uWSGI+Nginx+Supervisor環境搭建的全程序,以及一些注意事項,以免遺忘,
一、Python3環境安裝
CentOS7下Python3環境安裝參考 http://xiejava.ishareread.com/posts/57cef505/
查看python版本
[root@localhost ~]# python -V
Python 3.8.12
二、安裝Flask
1、創建Python虛擬環境
在home目錄下創建flask_web目錄(目錄根據具體實際環境創建,本教程是/home/flask_web)
通過venv創建虛擬環境
[root@localhost flask_web]# python -m venv /home/flask_web
創建成功后可以看到在目錄下自動建了一些檔案夾,包括python命令及依賴庫等,激活以后是個獨立的python虛擬運行環境,
在目錄下運行source bin/activate 激活虛擬環境
[root@localhost flask_web]# source bin/activate
(flask_web) [root@localhost flask_web]#
2、安裝Flask
通過pip install flask安裝flask
(flask_web) [root@localhost flask_web]# pip install flask
安裝的時候有可能報ModuleNotFoundError: No module named '_ctypes’的錯誤,原因是缺少libffi-devel包,具體可參考 https://blog.csdn.net/qq_36416904/article/details/79316972

運行yum install libffi-devel -y 并且要重新編譯執行安裝python
解決包依賴的問題
(flask_web) [root@localhost flask_web]# yum install libffi-devel -y
進入到python原始碼包目錄 執行使用make&make install 命令重新編譯并安裝python(這里比較坑)
然后再pip install flask 進行安裝
安裝完成后可以嘗試運行flask run,提示沒有Flask應用程式,說明flask已經安裝成功并且可以運行了,
(flask_web) [root@localhost flask_web]# flask run
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
Usage: flask run [OPTIONS]
Try 'flask run --help' for help.
Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.
3、建立測驗應用
vi hello.py創建一個hello.py的檔案,copy下面的內容到檔案中:wq保存退出
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
通過python hello.py運行測驗程式
(flask_web) [root@localhost flask_web]# python hello.py
* Serving Flask app 'hello' (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: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
新開一個shell視窗執行curl http://127.0.0.1:5000/ 可以看到有Hello World回傳說明應用在flask框架下運行沒有問題,
[root@localhost ~]# curl http://127.0.0.1:5000/
Hello World!
三、安裝及配置uwsgi
uWSGI是一個Web Server,并且獨占uwsgi協議,但是同時支持WSGI協議、HTTP協議等,它的功能是把HTTP協議轉化成語言支持的網路協議供python使用,有點類似于Java的web服務容器中間件tomcat
1、安裝uwsgi
通過pip命令安裝
(flask_web) [root@localhost flask_web]# pip install uwsgi
如果順利的話會顯示Successfully installed uwsgi-2.0.20,表示安裝成功了,
2、配置uwsgi
新建一個uwsgi.ini組態檔,并將配置資訊復制到組態檔
vi uwsgi.ini
[uwsgi]
#http=127.0.0.1:3366 #如果是http,通過proxy_pass http鏈接
socket=127.0.0.1:3366 #如果是socket,通過nginx配置uwsgi_pass socket鏈接
wsgi-file=/home/flask_web/hello.py
callable=app
touch-reload=/home/flask_web/
#最大請求數,最多請求5000次就重啟行程,以防止記憶體泄漏
max-requests=5000
#請求超時時間,超過60秒關閉請求
harakiri=60
#行程的數量
processes=1
#執行緒數
threads = 2
#記錄pid的檔案
pidfile=/home/flask_web/uwsgi.pid
buffer-size = 32768
#日志最大50M
log-maxsize=50000000
#配置虛擬環境路徑,如果是在虛擬環境下啟動,這個一定要配,不配會有些包找不到,應用會報錯,可以在uwsgi.log檔案中看報錯資訊
virtualenv =/home/flask_web
#uwsgi日志檔案,如果是通過supervisor托管,daemonize配置需要屏蔽
#daemonize=/home/flask_web/uwsgi.log
#專案更新后,自動加載
python-autoreload=1
#狀態檢測地址
stats = 127.0.0.1:9191
3、運行uwsgi
(flask_web) [root@localhost flask_web]# uwsgi --ini /home/flask_web/uwsgi.ini
啟動以后通過訪問curl http://127.0.0.1:3366有Hello World!的回傳資訊表示uwsgi已經成功啟動,并且應用程式正常,
[root@localhost flask_web]# curl http://127.0.0.1:3366
Hello World!
四、配置Nginx反向代理
ps -ef|grep nginx 找到nginx的組態檔
如果uwsgi配置的是socket連接
[uwsgi]
socket=127.0.0.1:3366 #如果是socket,通過nginx配置uwsgi_pass socket鏈接
nginx的server配置如下:
server {
listen 808;
server_name localhost;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:3366;
}
access_log /home/flask_web/access.log;
error_log /home/flask_web/error.log;
}
如果uwsgi配置的是http
[uwsgi]
http=127.0.0.1:3366 #如果是http,通過proxy_pass http鏈接
nginx的server配置如下:
server {
listen 808;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:3366;
}
access_log /home/flask_web/access.log;
error_log /home/flask_web/error.log;
}
重新加載nginx配置后,通過瀏覽器訪問可以正常顯示訪問結果
五、通過Supervisor進行行程托管
生產環境中,可以通過supervisor來進行uwsgi和nginx行程的托管,界面化的方式管理uwsgi和nginx,包括行程的監控、啟停等,
1、安裝supervisor
通過pip安裝
pip install supervisor
離線安裝請參考:http://xiejava.ishareread.com/posts/d670c9b8/
2、配置supervisor
找到supervisord的安裝目錄在/usr/local/bin下
[root@localhost bin]# which supervisord
/usr/local/bin/supervisord
cd到/usr/local/bin目錄下
通過echo_supervisord_conf > supervisord.conf
[root@localhost bin]# echo_supervisord_conf > supervisord.conf
可以看到生成了一個supervisord.conf的組態檔,
將生成的supervisord.conf組態檔放到/etc/目錄下
mv supervisord.conf /etc/
修改supervisord.conf的組態檔,主要是將子組態檔路徑開啟并指定組態檔路徑,按照慣例將組態檔放到/etc目錄下
[include]
files = /etc/supervisord.d/*.ini

我們在/etc目錄下建個supervisord.d目錄用來保存supervisor托管行程的組態檔
[root@localhost ~]# cd /etc/
[root@localhost etc]# mkdir supervisord.d
建立并配置子組態檔
[root@localhost etc]# cd supervisord.d/
[root@localhost supervisord.d]# vi uwsgi.ini
復制以下內容至uwsgi.ini檔案中
[program:uwsgi]
command =uwsgi --ini /home/flask_web/uwsgi.ini
directory=/home/flask_web
startsecs=10
startretries=5
autostart=true
autorestart=true
stdout_logfile=/home/flask_web/uwsgi_sup_log.log
stdout_logfile_maxbytes=10MB
user=root
stopasgroup=true
killasgroup=true
3、啟動supervisor
在啟動supervisor拉起uwsgi前兩個注意事項
- uwsgi的組態檔中daemonize一定要屏蔽掉,否則守護行程一直會重啟,導致埠每次都被占用,Supervisor托管不了,

- 在啟動之前先將已經啟動的uwsgi行程停掉,否則通過supervisor拉起uwsgi行程時埠沖突

啟動supervisord行程
[root@localhost bin]# supervisord -c /etc/supervisord.conf
修改組態檔后重新加載可以通過 supervisorctl reload 命令重新加載
查看supervisor托管狀態
[root@localhost supervisord.d]# supervisorctl status
uwsgi STARTING
可以看到uwsgi被supervisor托管并已經啟動,如果需要通過supervisor的web控制界面進行行程的管理,需要修改/etc/supervisord.conf的組態檔將訪問的IP地址限制放開,設定用戶名、口令
[inet_http_server] ; inet (TCP) server disabled by default
port=*:9001 ; ip_address:port specifier, *:port for all iface
username=user ; default is no username (open server)
password=user@123 ; default is no password (open server)
重新啟動supervisor,重啟時會報需要驗證的錯誤
[root@localhost supervisord.d]# supervisorctl shutdown
Server requires authentication
error: <class 'xmlrpc.client.ProtocolError'>, <ProtocolError for 127.0.0.1/RPC2: 401 Unauthorized>: file: /usr/local/lib/python3.8/site-packages/supervisor/xmlrpc.py line: 542
可以直接kill -9殺掉supervisor的行程再啟動,也可以通過supervisorctl 輸入用戶名、口令通過shutdown然后再重啟,
啟動命令:supervisord -c /etc/supervisord.conf
這時就可以通過supervisor的web控制界面進行行程的管理了,

至此,CentOS7下python3+Flask+uWSGI+Nginx+Supervisor環境全部搭建好了,
作者博客:http://xiejava.ishareread.com/
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/350874.html
標籤:其他
下一篇:將vue部署在nginx上
