標籤:

centos下通過gunicorn+nginx+supervisor部署Flask項目

之前用Flask寫了個解析Tumblr博客(為Tumblr默哀)的網站,然後直接放在DigitalOcean上運行:

python run.py

結果感覺怎麼那麼不穩定!!!然後就以為是伺服器不行

後來才知道原來Flask的app.run()只是用來本地調試用的,如果真正放到伺服器上運行的話,是完全不行的!需要配合gunicorn/uWsgi和Nginx才行。

然後就在網上找到這篇文章jianshu.com/p/be9dd421f。文章看起來不錯,但是尼瑪寫文章能不能用點心!!你根本就沒有說完整個部署過程好嗎!!Nginx的配置都沒有說完好嗎!!!對於沒有接觸過Nginx的小白來說,這是致命的好嗎!!!

結果就搭配著gunicorn把Flask半部署,直接運行

gunicorn -w4 -b 0.0.0.0:80 run:app

把網站運行起來了!

ok,以上屬於吐槽部分,接下來講整個的部署過程!

首先說明搭建環境:

  • DigitalOcean伺服器

  • CentOS 64位系統

通過鏈接m.do.co/c/dbd97068223d註冊,可以獲得10刀!可以相當於免費用兩個月哦!

1首先安裝Flask、gunicorn、Nginx

DO的CentOS是沒有安裝pip和setuptools的,所以如果需要安裝Python庫的話,需要自己先安裝setuptools。我比較懶,所以只安裝了setuptools,用easy_install來安裝Python庫。

安裝setuptools過程:(1)下載setuptools包# wget http://pypi.python.org/packages/source/s/setuptools/setuptools-2.0.tar.gz(2)解壓setuptools包# tar zxvf setuptools-2.0.tar.gz# cd setuptools-2.0(3)編譯setuptools# python setup.py build(4)開始執行setuptools安裝# python setup.py install

咳咳!!DO的CentOS好像連wget也沒有安裝,所以需要提前安裝wget:

yum install wget

安裝好setuptools後,就可以通過easy_install 安裝各種Python庫了:

easy_install flaskeasy_install gunicorn

Flask和gunicorn安裝好之後就安裝Nginx,CentOS不能直接安裝Nginx,還需要添加rpm(其實我根本不知道這是什麼鬼,可能就是一個源吧)

1、CentOS 6,先執行:[root@server ~]# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm2,安裝nignx[root@server ~]# yum install nginx

嗯,Nginx安裝好了!

2、添加Flask項目

這裡就創建一個最簡單的Flask項目,項目目錄是/home/flask,在該目錄下創建一個run.py的Python文件。

#run.pyfrom flask import Flaskapp = Flask(__name__)@app.route(/) def index(): return <h1>Hello World!</h1>if __name__ == __main__: app.run()

然後運行gunicorn

[root@server ~]# gunicorn -w 4 -b 0.0.0.0:5000 run:app[2016-05-28 12:35:26 +0000] [1541] [INFO] Starting gunicorn 19.6.0[2016-05-28 12:35:26 +0000] [1541] [INFO] Listening at: http://0.0.0.0:5000 (1541)[2016-05-28 12:35:26 +0000] [1541] [INFO] Using worker: sync[2016-05-28 12:35:26 +0000] [1546] [INFO] Booting worker with pid: 1546[2016-05-28 12:35:26 +0000] [1551] [INFO] Booting worker with pid: 1551[2016-05-28 12:35:26 +0000] [1552] [INFO] Booting worker with pid: 1552[2016-05-28 12:35:26 +0000] [1553] [INFO] Booting worker with pid: 1553

這個時候打開瀏覽器,輸入http://你的伺服器ip:5000就可以看到運行結果

然後配置Nginx,剛才安裝了Nginx之後,我們打開/etc/nginx/conf.d/default.conf,然後修改默認的default.conf為:

server { listen 80; server_name localhost; location / { proxy_pass http://127.0.0.1:5000; proxy_redirect off; proxy_set_header Host $host:80; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}

其中server_name就是你的域名,這裡用localhost代表通過ip訪問

配置好default.conf之後就啟動Nginx吧!

[root@server ~]# service nginx startStarting nginx: [ OK ][root@server ~]# nginx -s reload

ok!到這一步,整個部署過程就搞定了!打開瀏覽器輸入http://你的伺服器ip 看是否運行?

整個部署過程可以總結為:

安裝Flask、gunicorn、Nginx -->

添加Flask項目 -->

運行Gunicorn -->

修改Nginx配置文件 -->

運行Nginx

----------------------------------------------------------------------------

以上步驟不能保證開機運行網站,因此需要通過supervisor對網站進行開機啟動,步驟如下:

1、首先安裝supervisor

pip install supervisor

2、在項目目錄添加supervisor的配置文件,在本例中是/home/flask

echo_supervisord_conf > supervisord.conf

3、配置

vi supervisord.conf

添加如下信息

[program:myapp]directory = /home/flaskcommand = gunicorn -w4 -b 0.0.0.0:5000 run:app

同時可以開啟supervisor的web管理頁面

[inet_http_server]port = 0.0.0.0:9001

4、最後,我不清楚怎麼通過supervisor開啟啟動這個配置文件,因此通過開機任務啟動

vi /etc/rc.d/rc.local

並在最後添加

supervisord -c /home/flask/supervisord.conf

尾聲:通過以上步驟,那麼基本上就可以開啟啟動網站了!reboot試一試~~


推薦閱讀:

誰能給我詳細講解一下python中類是什麼意思?
ruby和python該學那一個?
有哪些應用場景適合用python的gevent來完成?
怎麼看待最近 Python 變成 Web 開發語言排行第二?
如何優雅的「輪帶逛」初級篇——獲取單張圖片

TAG:Python | Nginx | Flask |