大家都是怎麼部署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在伺服器中分別起什麼作用?