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技能
※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部署