當前位置:
首頁 > 知識 > Python Web 部署:Nginx + Gunicorn + Supervisor + Flask 部署筆記

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

(點擊

上方藍字

,快速關注我們)




來源:人世間


www.jianshu.com/p/be9dd421fb8d


如有好文章投稿,請點擊 → 這裡了解詳情




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






看完本文有收穫?請轉

發分享給更多人


關注「P

ython開發者」,提升Python技能


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Java、PHP、Python、JS 等開發者如何繪製統計圖?
用Python從Youtube下載視頻
Python多線程編程基礎1:為什麼要使用線程
7 個你該學習 Python的理由
如何用Python和機器學習炒股賺錢?

TAG:Python |

您可能感興趣

在 Kubernetes 上部署 Spinnaker
使用Centos7.5+Nginx+Gunicorn+Django+Python3部署blog項目
在Azure Stack上部署Kubernetes
Chrome部署Material Design:似Firefox早期版本
如何使用Rancher 2.0在Kubernetes集群上部署Istio
Chrome部署Material Design:標籤欄類似於Firefox早期版本
Oracle開源GraphPipe:幾行代碼讓你在TensorFlow部署PyTorch模型
索尼為Xperia XA1/Plus和Ultra部署Android Oreo推送
Inception部署
Nginx+uwsgi部署Django應用
Aruba OnConnect 方案部署
如何使用 TensorFlow mobile將PyTorch和Keras 部署到移動設備
BM推出了AIOpenScale和Multi-cloud Manager,以簡化AI和雲部署
拋棄Windows Phone,紐約警察局開始部署蘋果iPhone 7/7 Plus
Semtech與Comcast旗下的machineQ宣布已在美國的10座城市部署LoRaWAN網路
Symantec NetBackup 部署需要調整Linux內核詳解
Ansible自動部署nginx+keepalived高可用負載均衡
使用Kubespray部署生產可用的Kubernetes集群
華為CloudCampus助力義大利Fastweb部署城市Wi-Fi熱點
OCS Inventory NG部署