Python Web 部署:Nginx+Gunicorn+Supervisor+Flask部署筆記

2021-03-02 煉數成金前沿推薦

python web 部署

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

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

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

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

{} 表示區域網

nginx既可以做正向,也可以做反向。

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

創建一個項目

mkdir myproject

創建 python 虛擬環境

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

mkdir myproject

cd myproject

virtualenv venv

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

source venv/bin/activate

安裝 python web 框架 —flask

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

pip install flask

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

vim myapp.py

from flask import Flask

app = Flask(__name__)

@app.route('/')

def index():

    return 'hello world'

if __name__ == '__main__':

    app.debug = True

    app.run()

啟動 flask

python myapp.py

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

使用 gunicorn 部署 python web

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

安裝 gunicorn

pip install gunicorn

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

 pip freeze > requirements.txt

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

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

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

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

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

安裝 supervisor

pip install supervisor

echo_supervisord_conf > supervisor.conf   # 生成 supervisor 默認配置文件

vim supervisor.conf                       # 修改 supervisor 配置文件,添加 gunicorn 進程管理

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

[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的基本使用命令

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的管理界面,可以激活。更改下配置

[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。增加下面的配置文件

[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

文章來源:簡書

《web高並發服務架構》從低成本、高性能和高擴張性的角度來講解對高並發高負載網站的運行與維護技術。學員學完將熟悉大型web站點的運維工作流程,並且能快速提高自己在大型web站點運維的技術能力。點擊下方二維碼報名課程

相關焦點

  • 使用Flask,Nginx,Gunicorn,Supervisor完成網站部署
    作者 | 簡訊出品 | 腳本之家(ID:jb51net)當我們使用 flask 開發完成 web 應用後,關鍵是部署到雲伺服器上,這樣才能真正在網絡上讓用戶讀者訪問。安裝Flask,Gunicorn,Supervisor因為使用的是 python3,避免 pip 安裝錯位置,終端輸入命令:python3 -m pip install flask gunicorn supervisor等待安裝完成。
  • 【超詳細】使用Gunicorn+Nginx部署Flask項目 | 收藏系列
    $ mysql -uroot -pmysql> create database pythonbbs charset utf8mb4;9. 映射ORM模型到資料庫中:使用flask db upgrade將之前項目中生成的遷移腳本,映射到資料庫中,生成表。
  • Flask+React 的全棧開發和部署
    本項目的部署採用 nginx+gunicorn+supervisor 的方式,其中:nginx 用來做反向代理伺服器:通過接收 Internet 上的連接請求,將請求轉發給內網中的目標伺服器,再將從目標伺服器得到的結果返回給 Internet 上請求連接的客戶端(比如瀏覽器);gunicorn 是一個高效的 Python WSGI Server,我們通常用它來運行
  • [技術]最全的Python-Flask部署流程
    Pip安裝gunicorn(在virtualenv虛擬環境下)pip install gunicorn創建入口文件,添加工廠函數app = create_app()進入到項目目錄,啟動app(w是並發, 不是flask內網地址
  • 使用Nginx和Gunicorn部署Django項目
    創建虛擬獨立環境# 創建虛擬環境$ virtualenv --python /usr/local/bin/python3.6 py-env-boluomi# 進入虛擬環境$ source py-env-boluomi/bin/activate# 退出依賴環境(py-env-boluomi)$ deactivate
  • Flask 項目打包 線上部署
    本文涉及的相關技術:flask + gunicorn + gevent+ docker圖床簡介Flask代碼Gunicorn ||  gevent編寫gunicorn配置文件導出依賴編寫一般還有其他2種啟動方式:python -m flask run -p 8088 -h 127.0.0.2,這種可以指定項目啟動時的ip和埠flask run -p 8088 -h 127.0.0.2 純flask啟動,但作用和上面一種一樣
  • Keras模型生產環境的部署[源碼+教程]
    需要的模塊:tensorflowFlaskgeventgunicornkerasnumpyh5pypillowuwsgisupervisor2.核心代碼分享代碼目錄如下:為了部署Flask應用,採用nginx+uwsgi+supervisor的方式把上述Flask應用部署到centOs伺服器。
  • 在 Ubuntu 上使用 Nginx 部署 Flask 應用
    (點擊上方藍字,快速關注我們)譯文:開源中國英文:Vladikwww.oschina.net/translate/serving-flask-with-nginx-on-ubuntu
  • 讓你的項目更輕鬆——docker部署django項目
    因此,我們需要靜態文件伺服器(nginx)以及應用伺服器(gunicorn、uwsgi伺服器)。數據處理完成後,將響應結果返回給gunicorn,gunicorn拿到響應結果將其封裝(響應頭、響應行、響應體)發送給nginx,最後在由nginx返回到前端展示。因此,我們需要在linux伺服器上安裝配置gunicorn、nginx,這裡我們採用docker部署的方式。首先,我們的目標是要準備3個容器:
  • 如何用 Python 和 Flask 建立部署一個 Facebook Messenger 機器人
    最後 Git[4] 版本控制系統用來維護代碼和部署到 Heroku。值得一提:Virtualenv[5]。這個 python 工具是用來創建清潔的 python 庫「環境」的,這樣你可以只安裝必要的需求和最小化應用的大小。
  • 基於 Flask 部署 Keras 深度學習模型
    文 | 風玲兒出處 | 掘金本文主要記錄在進行Flask部署過程中所使用的流程,遇到的問題以及相應的解決方案。1、項目簡介該部分簡要介紹一下前一段時間所做的工作:這是第一次進行深度學習模型的 web 應用部署,在整個過程中,進一步折射出以前知識面之窄,在不斷的入坑、解坑中實現一版。
  • .NET Core 部署到 Linux(CentOS) 最全解決方案,進階篇 (Supervisor+Nginx)
    本文講講解通過使用Supervisor+Nginx的組合來實現.NET Core的高效部署。我們可以方便的通過supervisor提供的web管理界面對我們的應用進行啟動與停止,查看日誌等操作,非常的方便,絲般潤滑般的爽呀。
  • Docker+Flask+Gunicorn上線項目
    Docker部署FlaskFlask依賴於Python環境,目前我使用的Python為Python3.7.7。Python官方在docker.io中維護了相應的docker鏡像,我們只需要基於官方的python3.7.7鏡像構建出自己的鏡像則可。
  • 使用 GitHub 和 Python 實現持續部署 | Linux 中國
    這裡是 app/__init__.py 的內容:import osfrom flask import Flaskfrom .webhooks import webhookdef create_app(): """ Create, configure and return the Flask application
  • GitLab CICD與Kubernetes實踐·部署Flask Web服務
    上篇👉Gitlab CICD 與Kubernetes實踐·部署GitLab Runner文章內通過Kubernetes已經完成Gitlab Runner的部署的,現在我通過一個實際的案例來測試和使用Gitlab Runner在持續集成方面的優勢。
  • 3分鐘部署Python Web應用,雲開發了解一下?
    hello-cloud-developcd hello-cloud-develop創建名為  main.py  的文件,並將以下代碼粘貼到其中:import osfrom flaskFROM python:3.8-slim# 將本地代碼拷貝到容器內ENV APP_HOME /appWORKDIR $APP_HOMECOPY . .
  • Django+Linux+Uwsgi+Nginx項目部署文檔
    100GB web 爬蟲  數據分析  人工智慧視頻免費領文章結尾也有資料領取方式哦
  • Docker部署nginx&php5環境
    docker運行centos7並在centos7中部署nginx&php5環境
  • Python Web開發從入門到放棄
    版本發布部署代碼開發完成之後,我們怎麼把我們代碼「發布」到線上伺服器呢?這裡我們需要學習了解一下Fabric或者Ansbile,SaltStack這一類自動化工具。那麼我們需要了解一下Linux伺服器配置部署,Linux方面資料,這裡面推薦由happypeter翻譯的「The Linux Command Line」中文「快樂的Linux」命令行(關注我的公眾號,回復Linux可以下載)。我自己是看鳥哥的私房菜進行學習入門的,大家有興趣也可以看看。
  • Python Web部署方式總結
    相比起來,Python在web應用上的部署就繁雜的多,主要是工具繁多,主流伺服器支持不足,在了解Python的生產環境部署方式之前,先明確一些概念!很重要!CGI:CGI即通用網關接口(Common Gateway Interface),是外部應用程式(CGI程序)與Web伺服器之間的接口標準,是在CGI程序和Web伺服器之間傳遞信息的規程。