virtualenv 環境下 Django + Nginx + Gunicorn+ Supervisor 搭建 Python Web

來源:互聯網
上載者:User

標籤:

在這篇文章裡,我們將搭建一個簡單的 Web 應用程式,在虛擬環境中基於 Flask 架構,用 Gunicorn 做 wsgi 容器,用 Supervisor 管理進程,然後使用 OneAPM Python 探針來監測應用效能,形成一個「閉環」 !希望能對大家有所協助,首先簡單來介紹一下環境:

系統內容:ubuntu 14.04 Python 2.7.6

安裝組件庫

第一步安裝所需要的存放庫,因為打算用到虛擬環境,用到 pip 安裝和管理 Python 組件,所以先更新當地套件,然後安裝組件:

sudo apt-get update  sudo apt-get install python-pip python-dev nginx  
建立虛擬環境 virtualenv

在一個系統中建立不同的 Python 隔離環境,相互之間還不會影響,為了使系統保持乾淨,遂決定用 virtualenv 跑應用程式,建立一個容易識別的目錄,開始安裝,再建立項目目錄 super,然後啟用環境:

sudo pip install virtualenv  mkdir ~/supervisor && cd ~/supervisor  virtualenv super  source super/bin/activate  
安裝 Flask 架構

好了,現在在虛擬環境裡面,開始安裝 Flask 架構,flask 依賴兩個庫 werkzeug 和 jinjia2, 採用 pip 方式安裝即可, pip 是一個重要的工具,Python 用它來管理組件:

pip install flask  

先用 Flask 寫一個簡單的 Web 服務 myweb.py ,因為後面要做一些測試,所以設定了幾個請求:

from flask import Flask  app = Flask(__name__)  @app.route(‘/‘)def index():      return ‘hello world  supervisor gunicorn ‘@app.route(‘/1‘)def index1():      return ‘hello world  supervisor gunicorn  ffffff‘@app.route(‘/qw/1‘)def indexqw():      return ‘hello world  supervisor gunicorn fdfdfbdfbfb ‘if __name__ == ‘__main__‘:      app.debug = True    app.run()

啟動 Flask 看看!

python myweb.py  

在瀏覽器中訪問 http://127.0.0.1:5000 就可以看到了「幾個路徑都試一試」

用 Gunicorn 部署 Python Web

現在我們使用 Flask 內建的伺服器,完成了 Web 服務的啟動。生產環境下,Flask 內建的伺服器,無法滿足效能要求。所以我們這裡採用 Gunicorn 做 wsgi 容器,用來部署 Python,首先還是安裝 Gunicorn:

pip install gunicorn  

當我們安裝好 Gunicorn 之後,需要用 Gunicorn 啟動 Flask,Flask 用內建的伺服器啟動時,Flask 裡面的 name 裡面的代碼啟動了 app.run()。而這裡我們使用 Gunicorn,myweb.py 就等同於一個庫檔案,被 Gunicorn 調用,這樣啟動:

gunicorn -w 4 -b 0.0.0.0:8000 myweb:app  

其中 myweb 就是指 myweb.py,app 就是那個 wsgifunc 的名字,這樣運行監聽 8000 連接埠,原先的 5000 連接埠並沒有啟用,-w 表示開啟多少個 worker,-b 表示 Gunicorn 開發的訪問地址。

想要結束 Gunicorn 只需執行 pkill Gunicorn,但有時候還要 ps 找到 pid 進程號才能 kill。可是這對於一個開發來說,太過於繁瑣,因此出現了另外一個神器 ---supervisor,一個專門用來管理進程的工具,還可以管理系統的工具進程。

安裝 Supervisor
pip install supervisor  echo_supervisord_conf > supervisor.conf  # 產生 supervisor 預設設定檔  gedit  supervisor.conf                   # 修改 supervisor 設定檔,添加 gunicorn 進程管理  

在 supervisor.conf 底部下添加 myweb.py 的配置 /home/wang/supervisor/super 是我的項目目錄」

[program:myweb]command=/home/wang/supervisor/super/bin/gunicorn -w 4 -b 0.0.0.0:8000 myweb:app  directory=/home/wang/supervisor  startsecs=0  stopwaitsecs=0  autostart=false  autorestart=false  user=wang  stdout_logfile=/home/wang/supervisor/log/gunicorn.log  stderr_logfile=/home/wang/supervisor/log/gunicorn.err  


supervisor 的基本使用命令:

supervisord -c supervisor.conf  supervisorctl -c supervisor.conf status                  查看supervisor的狀態  supervisorctl -c supervisor.conf reload                  重新載入 設定檔  supervisorctl -c supervisor.conf start [all]|[appname]   啟動指定/所有 supervisor 管理的程式進程  supervisorctl -c supervisor.conf stop [all]|[appname]    關閉指定/所有 supervisor 管理的程式進程  

supervisor 還有一個 web 的管理介面,可以啟用。更改下配置:

[inet_http_server]     ; inet (TCP) server disabled by defaultport=127.0.0.1:9001    ; (ip_address:port specifier, *:port for alliface)  username=wang          ; (default is no username (open server)  password=123           ; (default is no password (open server))[supervisorctl]serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket  serverurl=http://127.0.0.1:9001       ; use an http:// url to specify an inet socket  username=wang                         ; should be same as http_username if set  password=123                          ; should be same as http_password if set  ;prompt=mysupervisor                  ; cmd line prompt (default "supervisor");history_file=~/.sc_history           ; use readline history if available

現在可以使用 supervsior 啟動 gunicorn 啦。運行命令:

supervisord -c supervisor.conf  

瀏覽器訪問 http://127.0.0.1:9001 可以得到 supervisor 的 web 管理介面,訪問http://127.0.0.1:8000 可以看見 gunicorn 啟動的返回的頁面。

配置 Nginx

前面我們已經在系統內容下安裝了 Nginx, 安裝好的 Nginx 二進位檔案放在 /usr/sbin/ 檔案夾下,接下來使用 Supervisor 來管理 Nginx。這裡需要注意一個問題,許可權問題。Nginx 是 sudo 的方式安裝,啟動的適合也是 root 使用者,那麼我們現在也需要用 root 使用者啟動 supervisor。在 supervisor.conf 下添加設定檔:

[program:nginx]command=/usr/sbin/nginx  startsecs=0  stopwaitsecs=0  autostart=false  autorestart=false  stdout_logfile=/home/wang/supervisor/log/nginx.log  stderr_logfile=/home/wang/supervisor/log/nginx.err  

好了,都配置完之後,啟動 supervisor:

supervisord -c supervisor.conf  

訪問頁面,也可以用 ab 進行壓力測試:

ab -c 100 -n 100 http://127.0.0.1:8000/qw/1  

-c 用於指定壓力測試的並發數, -n 用於指定壓力測試總共的執行次數。

安裝 Python 探針

搭建好了 web,想即時監控應用資料,有什麼好的工具,用 OneAPM 的 Python 探針試試, 首先也是安裝 Python 探針:

pip install -i http://pypi.oneapm.com/simple --upgrade blueware  

根據 License Key 組建組態檔案:

blueware-admin generate-config (License Key) = blueware.ini  

由於是在虛擬環境下,所以要特別注意路徑,修改 supervisor.conf 裡面兩項:

[program:myapp]command = /home/wang/supervisor/super/bin/blueware-admin run-program /home/wang/supervisor/super/bin/gunicorn -w 4 -b 0.0.0.0:8000 myapp:app  environment = BLUEWARE_CONFIG_FILE=blueware.ini  

重啟應用

supervisorctl    # 進入命令列  supervisor>  reload    # 重新載入  

向上面一樣訪問頁面,也可以用 ab 進行壓力測試 幾分鐘後有,可以看到頁面載入時間,web 事物,頁面輸送量,其中後面是設定自訂事物「Business Transaction」。

參考文章:

How To Serve Flask Applications with uWSGI and Nginx on Ubuntu 14.04

OneAPM Python 探針安裝

python web 部署:nginx + gunicorn + supervisor + flask 部署筆記

Tornado+nginx+supervisor 在生產環境上部署

supervisor + Tornado + Nginx 使用詳解

本文系 OneAPM 工程師編譯整理。OneAPM 是應用效能管理領域的新興領軍企業,能協助企業使用者和開發人員輕鬆實現:緩慢的程式碼和 SQL 陳述式的即時抓取。想閱讀更多技術文章,請訪問 OneAPM 官方部落格。

 

virtualenv 環境下 Django + Nginx + Gunicorn+ Supervisor 搭建 Python Web

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.