歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

Flask+Gunicorn+Gevent+Supervisor+Nginx生產環境部署

來源:本站整理 作者:佚名 時間:2017-08-27 TAG: 我要投稿

老毛病了,在用某個新框架或新架構之前,總得花時間谷歌和自己折騰一番,才能知道這個框架和架構的優缺點,才會發現自己最喜歡、用的最順手的的一種。近期在學習python,這里記錄一下自己用的一套python web開發的部署環境。
簡介
  之所以選擇Flask,而沒選擇用的最多的django,是因為現在這個小項目是一個簡單的web工具,提供上傳文件、數據處理、并下載的功能。簡單小巧,沒必要折騰Django。而Flask正好是一個Python實現的Web開發微框架,它基于Werkzeug 和 Jinja2,雖然小巧但也足夠強大。像其他幾個Python輕量級的框架,比如Bottle、web.py、web2等這里不多說。沒有最好,只有更好,所謂適合自己的才是最合適的。
  Flask的部署可以選擇獨立的wsgi,也可以用uWSGI,FastCGI等。獨立容器除了Gunicorn還可以選擇Tornado、Gevent來部署。
1)Gunicorn是一個Python WSGI UNIX的HTTP服務器。這是一個預先叉工人模式,從Ruby的獨角獸(Unicorn)項目移植。該Gunicorn服務器與各種Web框架兼容,我們只要簡單配置執行,輕量級的資源消耗,以及相當迅速。它既支持 eventlet ,也支持 greenlet。部署簡單、方便是我選擇他的主要原因,另外跟gevent結合之后,性能一點不屬于tornado。
2)Tornado 是一個開源的可伸縮的、非阻塞式的 web 服務器和工具集,它驅動了FriendFeed 。因為它使用了 epoll 模型且是非阻塞的,它可以處理數以千計的并發固定連接,這意味著它對實時 web 服務是理想的。
3)Gevent 是一個基于協同程序的 Python 網絡庫,使用 greenlet 來在 libevent 的事件循環上提供高層的同步 API。
    每種方式都有自己的優缺點,建議根據個人喜好和應用場景靈活運用。
部署
每個組件的作用:
1). nginx:高性能Web服務器+負責反向代理;
2). gunicorn:高性能WSGI服務器;
3). gevent:把Python同步代碼變成異步協程的庫;
4). supervisor:監控服務進程的工具;
Flask Gunicorn Gevent Supervisor都可以用'pip'進行安裝。這里我建議Supervisor用apt或yum源安裝,這樣省去了多余的配置,只需要寫自己的配置文件即可。以apt為例:
# aptitude -y install nginx supervisor
# pip install flask gunicorn gevent
安裝完成之后,supervisor的配置文件在/etc/supervisor/下,log文件在/var/log/supervisor/目錄下。
2.組件的啟動
1)Flask的項目啟動比較簡單,這里有一個hello world的示例,可以用來測試:
"myproject.py":
# -*- coding:utf-8 -*-
# test code
from flask import Flask
application = Flask(__name__)
 
@application.route("/")
def hello():
    return "Hello There!"
 
if __name__ == "__main__":
    application.run(host='0.0.0.0')
測試Flask App:

python myproject.py
這時候打開瀏覽器,訪問5000端口應該能看到類似頁面
2) 創建WSGI文件

# vim ~/myproject/wsgi.py
導入flask app,然后run即可:
from myproject import application
 
if __name__ == "__main__":
    application.run()
3)用gunicorn啟動:

gunicorn -w 4 -b 127.0.0.1:8000 -k gevent wsgi:application
參數解釋:
-w: 指定worker的數量(根據實際情況設定)
-b:指定綁定的地址和端口號
-k: 指定worker-class模式,默認為sync,這里用gevent使之變為異步協程,提高性能。
最后指定app的位置。
啟動成功后,用ps看一下會看到有四個進程已經在工作了。

4)配置supervisor
    web服務跑起來之后,為了保證服務的穩定性,需要加一個收獲進程。supervisor非常好用,配置也簡單方便,它是一個用 Python 寫的進程管理工具,可以很方便的用來啟動、重啟、關閉進程(不僅僅是 Python 進程)。除了對單個進程的控制,還可以同時啟動、關閉多個進程,比如很不幸的服務器出問題導致所有應用程序都被殺死,此時可以用 supervisor 同時啟動所有應用程序而不是一個一個地敲命令啟動。
  自己在conf.d目錄下寫一個gunicorn的配置:
# vim /etc/supervisor/conf.d/gunicorn.conf
[program:gunicorn]
command = /usr/bin/gunicorn -w 4 -b 127.0.0.1:8000 -k gevent wsgi:application
directory = /data/get_vm_info/
autorestart = true
startsecs = 5
startretries = 3
user = root
nodaemon = false
需要注意的一點是directory的設置,否則會報錯“Import Error”。
配置完成之后,重新加載下配置文件即可:

# supervisorctl  reload
查看狀態:
[email protected]:~# supervisorctl  status
gunicorn                         RUNNING    pid 32505, uptime 5:21:30
5)配置Nginx反向代理   
[email protected]:~# cat /etc/nginx/sites-enabled/default
server {
    listen 8001;
    server_name localhost;
    access_log  /var/log/nginx/access.log;
 
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP   $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
配置完成后重啟Nginx即可。
整個環境基本初步搭建完成。
 

【聲明】:黑吧安全網(http://www.fhetww.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        江西十一选五走势图爱彩乐