標籤:

大家都是怎麼部署python網站的?

是用wsgi+nginx這種和SAE/BAE類似的這種方式,還是用screen來使./tornadowebsite.py保持運行狀態這種方式?
ps:後一種是我yy的,實在不知道什麼方式是現在流行的~


gunicorn + nginx


flask+gunicorn+nginx
作者:Python小白
鏈接:centos下通過gunicorn和nginx部署Flask項目 - Python小白的文章 - 知乎專欄
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

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

python run.py

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

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

然後就在網上找到這篇文章《python web 部署:nginx + gunicorn + supervisor + flask 部署筆記》。文章看起來不錯,但是尼瑪寫文章能不能用點心!!你根本就沒有說完整個部署過程好嗎!!Nginx的配置都沒有說完好嗎!!!對於沒有接觸過Nginx的小白來說,這是致命的好嗎!!!

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

gunicorn -w4 -b 0.0.0.0:80 run:app

把網站運行起來了!

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

首先說明搭建環境:

  • DigitalOcean伺服器
  • CentOS 64位系統

通過鏈接https://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 flask
easy_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.rpm
2,安裝nignx
[root@server ~]# yum install nginx

嗯,Nginx安裝好了!

2、添加Flask項目

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


#run.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
return "&Hello World!&"

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 start
Starting nginx: [ OK ]
[root@server ~]# nginx -s reload

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

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

安裝Flask、gunicorn、Nginx --&>

添加Flask項目 --&>

運行Gunicorn --&>

修改Nginx配置文件 --&>

運行Nginx


nginx + supervisord


nginx+tornado
另外,python程序正確切換成daemon後,可以直接後台運行,不需要screen.
切換方法如下:

import os
if os.fork() != 0:
sys.exit()
os.setsid()
os.chdir("/")

這個只是一個簡單實現。完整的實現方法請參考《UNIX環境高級編程》中關於守護進程的描述。


Tornado 的應用就跟 wsgi 無關,這兩個方法本身應對的就是不同的應用,討論什麼?


我是用的django
使用nginx/supervisor/uwsgi


推薦閱讀:

python中如何使用requests模塊下載文件並獲取進度提示?
最近在學習Python爬蟲,求大神給點乾貨?
一個網站用兩種或以上的後端編程語言會出現什麼情況?為什麼?
selenium爬蟲被檢測到 該如何破?
Nginx、Gunicorn在伺服器中分別起什麼作用?

TAG:Python | 網站 | WSGI |