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

python web 部署

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

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

正向代理:{ 客戶端 ---》 代理服務(wù)器 } ---》 服務(wù)器

反向代理:客戶端 ---》 { 代理服務(wù)器 ---》 服務(wù)器 }

{} 表示局域網(wǎng)

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

創(chuàng)建一個項目

mkdir myproject

創(chuàng)建 python 虛擬環(huán)境

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

mkdir myproject
cd myproject
virtualenv venv

創(chuàng)建了 venv 環(huán)境之后,激活就可以了

source venv/bin/activate

安裝 python web 框架 ---flask

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

pip install flask

測試我們的 flask 安裝是否成功,并使用 flask 寫一個簡單的 web 服務(wù)。
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 就能看到網(wǎng)頁顯示 hello world。

使用 gunicorn 部署 python web

現(xiàn)在我們使用 flask 自帶的服務(wù)器,完成了 web 服務(wù)的啟動。生產(chǎn)環(huán)境下,flask 自帶的 服務(wù)器,無法滿足性能要求。我們這里采用 gunicorn 做 wsgi容器,用來部署 python。

安裝 gunicorn

 pip install gunicorn

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

 pip freeze > requirements.txt

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

當我們安裝好 gunicorn 之后,需要用 gunicorn 啟動 flask,注意 flask 里面的name里面的代碼啟動了 app.run(),這個含義是用 flask 自帶的服務(wù)器啟動 app。這里我們使用了 gunicorn,myapp.py 就等同于一個庫文件,被 gunicorn 調(diào)用。

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

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

想要結(jié)束 gunicorn 只需執(zhí)行 pkill gunicorn,有時候還的 ps 找到 pid 進程號才能 kill??墒沁@對于一個開發(fā)來說,太過于繁瑣,因此出現(xiàn)了另外一個神器---supervisor,一個專門用來管理進程的工具,還可以管理系統(tǒng)的工具進程。

安裝 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:2170 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的狀態(tài)
supervisorctl -c supervisor.conf reload                    重新載入 配置文件
supervisorctl -c supervisor.conf start [all]|[appname]     啟動指定/所有 supervisor管理的程序進程
supervisorctl -c supervisor.conf stop [all]|[appname]      關(guān)閉指定/所有 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

現(xiàn)在可以使用 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的權(quán)限問題。nginx是sudo的方式安裝,啟動的適合也是 root用戶,那么我們現(xiàn)在也需要用 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 部屬已經(jīng)完成。當然,最終我們需要把項目代碼部屬到服務(wù)器上.批量的自動化部屬需要另外一個神器 fabric.具體使用,就不再這篇筆記闡述。項目源碼中包含了fabric文件。下載fabric,更改里面的用戶名和秘密,就可以部屬在自己或者遠程的服務(wù)器上了。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容