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

来源:http://www.cnblogs.com/8hao/archive/2016/03/04/5242190.html
-Advertisement-
Play Games

python web 部署 web開發中,各種語言爭奇鬥艷,web的部署方面,卻沒有太多的方式。簡單而已,大概都是 nginx 做前端代理,中間 webservice 調用程式腳本。大概方式:nginx + webservice + script nginx 不用多說,一個高性能的web伺服器。通常


python web 部署

web開發中,各種語言爭奇鬥艷,web的部署方面,卻沒有太多的方式。簡單而已,大概都是 nginx 做前端代理,中間 webservice 調用程式腳本。大概方式:nginx + webservice + script

nginx 不用多說,一個高性能的web伺服器。通常用來在前端做反向代理伺服器。所謂正向與反向(reverse),只是英文說法翻譯。代理服務,簡而言之,一個請求經過代理伺服器從區域網發出,然後到達互聯網上伺服器,這個過程的代理為正向代理。如果一個請求,從互聯網過來,先進入代理伺服器,再由代理伺服器轉發給區域網的目標伺服器,這個時候,代理伺服器為反向代理(相對正向而言)。

正向代理:{ 客戶端 —》 代理伺服器 } —》 伺服器

反向代理:客戶端 —》 { 代理伺服器 —》 伺服器 }

{} 表示區域網

nginx既可以做正向,也可以做反向。
webservice 的方式同樣也有很多方式。常見的有FastCGIWSGI等。我們採用gunicorn為 wsgi容器。python為伺服器script,採用flask框架。同時採用supervisor管理伺服器進程。也就是最終的部署方式為:
nginx + gunicorn + flask ++ supervisor

創建一個項目

 

          Vim  
1 mkdir myproject

 

創建 python 虛擬環境

virtualenv 可以說是 python 的一個大殺器。用來在一個系統中創建不同的 python 隔離環境。相互之間還不會影響,使用簡單到令人髮指。(我的工作路徑是 /home/rsj217/rsj217

   
1 2 3 mkdir myproject cd myproject virtualenv venv

創建了 venv 環境之後,激活就可以了

   
1 source venv/bin/activate

 

安裝 python web 框架 —flask

flask 是一個 python web micro framework。簡潔高效,使用也很簡單。flask 依賴兩個庫 werkzeug 和 jinjia2。採用 pip 方式安裝即可。

   
1 pip install flask

測試我們的 flask 安裝是否成功,並使用 flask 寫一個簡單的 web 服務。
vim myapp.py

   
1 2 3 4 5 6 7 8 from flask import Flask app = Flask(__name__) @app.route('/') def index():     return 'hello world' if __name__ == '__main__':     app.debug = True     app.run()

啟動 flask

   
1 python myapp.py

此時,用瀏覽器訪問 http://127.0.0.1:5000 就能看到網頁顯示 hello world

使用 gunicorn 部署 python web

現在我們使用 flask 自帶的伺服器,完成了 web 服務的啟動。生產環境下,flask 自帶的 伺服器,無法滿足性能要求。我們這裡採用 gunicorn 做 wsgi容器,用來部署 python。

安裝 gunicorn

 

   
1 pip install gunicorn

pip 是一個重要的工具,python 用來管理包。還有一個最佳生產就是每次使用 pip 安裝的庫,都寫入一個 requirement 文件裡面,既能知道自己安裝了什麼庫,也方便別人部署時,安裝相應的庫。

   
1 pip freeze > requirements.txt

以後每次 pip 安裝了新的庫的時候,都需freeze 一次。

當我們安裝好 gunicorn 之後,需要用 gunicorn 啟動 flask,註意 flask 裡面的name裡面的代碼啟動了 app.run(),這個含義是用 flask 自帶的伺服器啟動 app。這裡我們使用了 gunicorn,myapp.py 就等同於一個庫文件,被 gunicorn 調用。

   
1 gunicron -w4 -b0.0.0.0:8000 myapp:app

此時,我們需要用 8000 的埠進行訪問,原先的5000並沒有啟用。其中 gunicorn 的部署中,,-w 表示開啟多少個 worker,-b 表示 gunicorn 開發的訪問地址。

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

安裝 supervisor

 

   
1 2 3 pip install supervisor echo_supervisord_conf > supervisor.conf   # 生成 supervisor 預設配置文件 vim supervisor.conf                       # 修改 supervisor 配置文件,添加 gunicorn 進程管理

在myapp supervisor.conf 配置文件底部添加 (註意我的工作路徑是/home/rsj217/rsj217/)

   
1 2 3 4 5 6 7 8 9 [program:myapp] command=/home/rsj217/rsj217/myproject/venv/bin/gunicorn -w4 -b0.0.0.0:8000 myapp:app    ; supervisor啟動命令 directory=/home/rsj217/rsj217/myproject                                                 ; 項目的文件夾路徑 startsecs=0                                                                             ; 啟動時間 stopwaitsecs=0                                                                          ; 終止等待時間 autostart=false                                                                         ; 是否自動啟動 autorestart=false                                                                       ; 是否自動重啟 stdout_logfile=/home/rsj217/rsj217/myproject/log/gunicorn.log                           ; log 日誌 stderr_logfile=/home/rsj217/rsj217/myproject/log/gunicorn.err                           ; 錯誤日誌

supervisor的基本使用命令

   
1 2 3 4 5 supervisord -c supervisor.conf                             通過配置文件啟動supervisor 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的管理界面,可以激活。更改下配置

   
1 2 3 4 5 6 7 8 9 10 11 12 [inet_http_server]         ; inet (TCP) server disabled by default port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface) username=user              ; (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=user              ; 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:2170 可以看見gunciron 啟動的返回的 hello world

安裝配置 nginx

採用 apt-get方式安裝最簡單。運行 sudo apt-get install nginx。安裝好的nginx的二進位文件放在 /usr/sbin/文件夾下麵。而nginx的配置文件放在 /etc/nginx下麵。

使用 supervisor 來管理 nginx。這裡需要註意一個問題,linux的許可權問題。nginx是sudo的方式安裝,啟動的適合也是 root用戶,那麼我們現在也需要用 root用戶啟動supervisor。增加下麵的配置文件

   
1 2 3 4 5 6 7 8 [program:nginx] command=/usr/sbin/nginx startsecs=0 stopwaitsecs=0 autostart=false autorestart=false stdout_logfile=/home/rsj217/rsj217/myproject/log/nginx.log stderr_logfile=/home/rsj217/rsj217/myproject/log/nginx.err

到此為止,進步的 web 部屬已經完成。當然,最終我們需要把項目代碼部屬到伺服器上.批量的自動化部屬需要另外一個神器 fabric.具體使用,就不再這篇筆記闡述。項目源碼中包含了fabric文件。下載fabric,更改裡面的用戶名和秘密,就可以部屬在自己或者遠程的伺服器上了。

項目源碼: https://coding.net/u/rsj217/p/myproject/git

問啊-定製化IT教育平臺,牛人一對一服務,有問必答,開發編程社交頭條 官方網站:www.wenaaa.com

QQ群290551701 聚集很多互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每次寫分頁導航的時候都要在html頁面寫一堆標簽和樣式,太麻煩了,所以乾脆自己動手封裝一個自己喜歡的類直接生成。 一、PageHelper類: /// <summary> /// 分頁導航 /// </summary> /// <param name="pageNum">當前第幾頁</param>
  • 好久沒有寫博客了,這段時間準備寫一下字元串函數 QQ群: 499092562;歡迎交流 字元串函數: 1、LEN(需要獲取長度的字元串) 返回:字元串的長度 示例: SELECT LEN('小搬運工很帥!') 2、RIGHT(需要被從右邊截取的字元串,截取的開始下標,截取的長度) 返回:右邊的字元串
  • http://www.ourd3js.com/wordpress/
  • Lua中的協程和多線程很相似,每一個協程有自己的堆棧,自己的局部變數,可以通過yield-resume實現在協程間的切換。不同之處是:Lua協程是非搶占式的多線程,必須手動在不同的協程間切換,且同一時刻只能有一個協程在運行。並且Lua中的協程無法在外部將其停止,而且有可能導致程式阻塞。 協同程式(C
  • 2014年3月,Java 8發佈,Lambda表達式作為一項重要的特性隨之而來。或許現在你已經在使用Lambda表達式來書寫簡潔靈活的代碼。比如,你可以使用Lambda表達式和新增的流相關的API,完成如下的大量數據的查詢處理: int total = invoices.stream() .filt
  • Queue介面與List、Set同一級別,都是繼承了Collection介面。LinkedList實現了Queue接 口。Queue介面窄化了對LinkedList的方法的訪問許可權(即在方法中的參數類型如果是Queue時,就完全只能訪問Queue介面所定義的方法 了,而不能直接訪問 LinkedLi
  • 在 openssl 中使用非阻塞的bio方法紀要。通過與 epoll 的配合,完成高效的加密連接處理。
  • 本文內容來源:http://blog.privatenode.in/torifying-scrapy-project-on-ubuntu/ 在使用Scrapy的時候,一旦進行高頻率的爬取就容易被封IP,此時可以通過使用TOR來進行匿名爬取,同時要安裝Polipo代理伺服器 註意:要進行下麵的操作的前...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...