nginx+uwsgi+flask+supervisor 項目部署


環境

- Linux: Ubuntu 16.04
- uWSGI        2.0.18 
- Flask         1.0.2
- supervisor    3.2.0
- nginx/1.8.1

首先區分幾個概念

uwsgi和WSGI協議

  1. WSGI

    • Web Server Gateway Interface (web服務器網管接口)
    • 是一種規范,是web服務器和web應用(django/flask) 之間的接口,是二者之間的通信橋梁
    • 沒有官方的實現,更像是一個協議,約定俗成的,規定WSGI application 應該實現為一個可調用的對象。只要遵循這些協議,WSGI應用都可以在任何服務器上運行
  2. uWSGI

    • 是一個web服務器,實現了WSGI協議,uwsgi、http等協議
    • 代碼完全用c編寫,效率高性能穩定,用於接收前端服務器轉發的動態請求並處理后給web應用程序
  3. uwsgi
    是uWSGI服務器實現的獨有的協議,是一種傳輸協議,用戶uWSGI與其他服務器間通信(
    如與Nginx之間通信)

在Django中啟動文件是wsgi.py, 該文件在生成Django目錄的時候便會自動生成,用於web server 與 Django 通信,相當於提供了一個可調用的application對象,在這個類中實現了call方法。

在flask 中 app = Flask(name) 所在的啟動文件 manager.py 便是與web server 進行通信的 application可調用對象

簡單的服務器項目准備

新建一個項目並寫一個簡單的flask web 服務器app
目錄~/Desktop/flask_deploy/manager.py

1 # coding=utf8
  2 from flask import Flask
  3 

  4 app = Flask(__name__)
  5 
  6 
  7 @app.route('/', methods=['GET'])
  8 def index():
  9    return 'hello world'
 10 
 11 
 12 if __name__ == '__main__':
 13    app.run(debug=False)

1 配置python項目虛擬環境

  • 安裝虛擬環境管理工具
    pip install virtualenv virtualenvwrapper
  • 編輯主目錄下的.bashrc文件,添加以下內容
    export WORKON_HOME=$HOME/.virtualenvs  # ./virtualvenvs便是虛擬環境安裝目錄
    source /urs/local/bin/virtualenvwrapper.sh

可以通過whereis virtaulenvwrapper.sh 查找該源文件
inux命令和文件查找

  • 執行以下命令使配置生效

source ./bashrc

  • 相關命令
mkvirtualenv -p python3 env_name  # -p 指定python環境
workon + tab*2 # 查看本機下有哪些虛擬環境
workon env_nmae  # 進入虛擬環境
deactivate       # 退出虛擬環境
rmvirtualenv env_name    # 刪除虛擬環境 

2 uwsgi安裝與配置

在當前虛擬環境下,進行安裝相應包

pip install falsk uwsgi
在當前項目目錄下創建文件 ~/Desktop/flask_deploy/uwsgi.ini
vi uwsgi.ini

[uwsgi]
# 使用nginx連接時使用socket通信
socket=127.0.0.1:8000
# 直接使用自帶web server 使用http通信
#http=127.0.0.1:8000
# 指定項目目錄
chdir=/home/python/Desktop/flask_deploy
# 指定python虛擬環境
home=/home/python/.virtualenvs/deploy
# 指定加載的WSGI文件
wsgi-file=manager.py
# 指定uWSGI加載的模塊中哪個變量將被調用
callable=app
# 設置工作進程的數量
processes=2
# 設置每個工作進程的線程數
threads=2
# 將主進程pid寫到指定的文件
pidfile=%(chdir)/uwsgi.pid
# 日志文件
req-logger=file:/home/python/Desktop/flask_deploy/log/req.log
logger=file:/home/python/Desktop/flask_deploy/log/err.log

#uid=xxx # uWSGI服務器運行時的用戶id,未設置則為當前啟動的用戶
#gid=xxx # uWSGI服務器運行時的用戶組id
#procname-prefix-spaced=site # 指定工作進程名稱的前綴

配置文件中指定wsgi啟動文件有幾種方式

    # 指定加載的WSGI文件
    wsgi-file=manager.py
    # 指定uWSGI加載的模塊中哪個變量將被調用
    callable=app
    # 模塊名:可調用對象app
    module=manager:app
    module=manager
    callable=app
uwsgi相關命令
uwsgi --ini uwsgi.ini   # 啟動   
uwsgi --stop uwsgi.pip  # 停止  
pkill -9 uwsgi          # 停止

3 supervisor 安裝與監控

簡介: supervisor就是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變為后台daemon,並監控進程狀態,異常退出時能自動重啟。

安裝:

apt-get install supervisor

默認配置文件在/etc/supervisro/supervisord.conf, 自己開發可以將配置文件寫在 /etc/supervisor/conf.d/目錄下,文件擴展名必須為*.conf

配置解釋
[program:uwsgi]
command=/home/python/.virtualenvs/deploy/bin/uwsgi /home/python/Desktop/flask_deploy/uwsgi.ini
user=root
autostart=true
autorestart=true
stdout_logfile=/home/python/Desktop/flask_deploy/log/uwsgi_supervisor.log
stderr_logfile=/home/python/Desktop/flask_deploy/log/uwsgi_supervisor_err.log
- [program:module_name]表示supervisor的一個模塊名  
- command 程序啟動命令如: /usr/bin/python - app.py  
- user 進程運行的用戶身份
- autostart=true  跟隨Supervisor一起啟動
- autorestart=true 掛掉之后自動重啟
- stderr_logfile, stdout_logfile 標准輸出,錯誤日志文件
啟動supervisor

sudo supervisord -c /etc/supervisor/supervisord.conf # supervisord.conf 會自動包含conf.d/目錄下的conf文件

相關命令

1️⃣supervisorctl status  # 查看啟動的項目
2️⃣supervisorctl start module_name  # 啟動項目
3️⃣supervisorctl stop module_name   # 停止木箱
4️⃣supervisorctl shutdown   # 關閉所有項目和服務

啟動后可以 ps -aux | grep 查看 uwsgi 和supervisor 都在運行了

4 Nginx安裝與配置

apt-get install nginx
默認安裝在/etc/nginx/目錄下
配置目錄 /etc/nginx/conf/flask_deploy.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    server {
        listen  80;
        server_name 127.0.0.1; #公網地址

    location / {
        include      uwsgi_params;
        uwsgi_pass   127.0.0.1:8000;
    }
    }
}

啟動

usr/sbin/nginx -c /etc/nginx/conf/flask_deploy.conf

相關命令:

1️⃣nginx -s reload  
2️⃣nginx -s stop  

nginx 詳細介紹及語法參考:nginx:詳細配置說明

不出意外的話瀏覽器訪問:127.0.0.1即可出現hello world。

部署負載均衡

nginx+uwsgi+flask+supervisor部署負載均衡,

  1. 只需要在項目目錄下加一個uwsgi2.ini文件(uWSGI 應用啟動配置),修改soket ip,pipfile,logfile路徑即可
  2. 再根據以上步驟在supervisor 配置文件中增加一個uwsgi2的監控模塊,增加相應配置
  3. nginx 負載均衡配置
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream flask {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
    }

    server {
        listen  80;
        server_name 127.0.0.1; #公網地址

    location / {
        include      uwsgi_params;
        uwsgi_pass   flask;
        proxy_
    }
    }
}

如此,便配置了一個簡單的負載均衡的服務器。訪問127.0.0.1,同時用tail 命令查看 兩個uwsgi配置中文件中設置的req_logfile 可以觀察到流量分發的現象。

小結

suervisor 是個后台進程管理工具,不僅局限於監控uwsgi 服務器,還可以監控其他 可能意外宕機的服務程序。

其他

相對的可作為web服務器的還有Gunicorn 是從Ruby 的(Unicorn)移植的python HTTP 服務器,兼容各種框架,不需要寫配置文件,輕量級的資源消耗.

安裝

pip install gunicorn
啟動服務器
gunicorn -w 4 -b 127.0.0.1:8080 manager:app --daemon # 已守護進程方式啟動,默認為False

gunicorn 以配置文件方式啟動

文件名 gunicorn.conf

    # 指定web服務器監聽的if和端口
    bind = '127.0.0.1:8080'
    # 指定工作進程
    workers = 4
    # 指定服務器后台運行
    daemon = True
    # 保存主進程id
    pidfile = 'gunicorn.pid'
    # 啟動服務器之后生成 access.log 保存訪問日志
    accesslog = 'access.log'
    # 啟動服務器之后生成 errorlog , 保存錯誤日志
    errorlog = 'error.log'

啟動方式:

gunicorn -c gunicorn.conf manager:app

Reference

Linux后台進程管理利器:supervisor
flask+nginx+uwsgi+supervisor項目部署


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM