天天看點

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

  老毛病了,在用某個新架構或新架構之前,總得花時間谷歌和自己折騰一番,才能知道這個架構和架構的優缺點,才會發現自己最喜歡、用的最順手的的一種。近期在學習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為例:

<code># aptitude -y install nginx supervisor</code>

<code># pip install flask gunicorn gevent</code>

安裝完成之後,supervisor的配置檔案在/etc/supervisor/下,log檔案在/var/log/supervisor/目錄下。

2.元件的啟動

1)Flask的項目啟動比較簡單,這裡有一個hello world的示例,可以用來測試:

"myproject.py":

<code># -*- coding:utf-8 -*-</code>

<code># test code</code>

<code>from flask </code><code>import</code> <code>Flask</code>

<code>application = Flask(__name__)</code>

<code>@application.route(</code><code>"/"</code><code>)</code>

<code>def hello():</code>

<code>    </code><code>return</code> <code>"&lt;h1 style='color:blue'&gt;Hello There!&lt;/h1&gt;"</code>

<code>if</code> <code>__name__ == </code><code>"__main__"</code><code>:</code>

<code>    </code><code>application.run(host=</code><code>'0.0.0.0'</code><code>)</code>

測試Flask App:

<code>python myproject.py</code>

這時候打開浏覽器,通路5000端口應該能看到類似頁面:

<a href="https://s5.51cto.com/wyfs02/M01/9C/E7/wKioL1l3bBXBht_dAABWk7YbuFg279.png-wh_500x0-wm_3-wmp_4-s_3598203761.png" target="_blank"></a>

2) 建立WSGI檔案

<code># vim ~/myproject/wsgi.py</code>

導入flask app,然後run即可:

<code>from myproject </code><code>import</code> <code>application</code>

<code>    </code><code>application.run()</code>

3)用gunicorn啟動:

<code>gunicorn -w 4 -b 127.0.0.1:8000 -k gevent wsgi:application</code>

參數解釋:

-w: 指定worker的數量(根據實際情況設定)

-b:指定綁定的位址和端口号

-k: 指定worker-class模式,預設為sync,這裡用gevent使之變為異步協程,提高性能。

最後指定app的位置。

啟動成功後,用ps看一下會看到有四個程序已經在工作了。

<a href="https://s2.51cto.com/wyfs02/M00/9C/E7/wKiom1l3bqrCa9YvAAH5yR137fk523.png-wh_500x0-wm_3-wmp_4-s_2934309988.png" target="_blank"></a>

4)配置supervisor

    web服務跑起來之後,為了保證服務的穩定性,需要加一個收獲程序。supervisor非常好用,配置也簡單友善,它是一個用 Python 寫的程序管理工具,可以很友善的用來啟動、重新開機、關閉程序(不僅僅是 Python 程序)。除了對單個程序的控制,還可以同時啟動、關閉多個程序,比如很不幸的伺服器出問題導緻所有應用程式都被殺死,此時可以用 supervisor 同時啟動所有應用程式而不是一個一個地敲指令啟動。

  自己在conf.d目錄下寫一個gunicorn的配置:

<code># vim /etc/supervisor/conf.d/gunicorn.conf</code>

<code>[program:gunicorn]</code>

<code>command</code> <code>= </code><code>/usr/bin/gunicorn</code> <code>-w 4 -b 127.0.0.1:8000 -k gevent wsgi:application</code>

<code>directory = </code><code>/data/get_vm_info/</code>

<code>autorestart = </code><code>true</code>

<code>startsecs = 5</code>

<code>startretries = 3</code>

<code>user = root</code>

<code>nodaemon = </code><code>false</code>

需要注意的一點是directory的設定,否則會報錯“Import Error”。

配置完成之後,重新加載下配置檔案即可:

<code># supervisorctl  reload</code>

檢視狀态:

<code>root@localhost:~</code><code># supervisorctl  status</code>

<code>gunicorn                         RUNNING    pid 32505, uptime 5:21:30</code>

5)配置Nginx反向代理    

<code>root@localhost:~</code><code># cat /etc/nginx/sites-enabled/default</code>

<code>server {</code>

<code>    </code><code>listen 8001;</code>

<code>    </code><code>server_name localhost;</code>

<code>    </code><code>access_log  </code><code>/var/log/nginx/access</code><code>.log;</code>

<code>    </code><code>location / {</code>

<code>        </code><code>proxy_pass http:</code><code>//127</code><code>.0.0.1:8000;</code>

<code>        </code><code>proxy_set_header Host $host;</code>

<code>        </code><code>proxy_set_header X-Real-IP   $remote_addr;</code>

<code>        </code><code>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</code>

<code>    </code><code>}</code>

<code>  </code><code>}</code>

配置完成後重新開機Nginx即可。

整個環境基本初步搭建完成。

      本文轉自Jx戰壕  51CTO部落格,原文連結:http://blog.51cto.com/xujpxm/1950980,如需轉載請自行聯系原作者

繼續閱讀