這幾天學着用flask寫一些rest api,而後部署到雲上。這個過程雖然網上有不少的教程,但仍是遇到很多的問題!html
採用flask的緣由是由於它比較容易上手吧。用flask有專門restful api的框架,用起來簡單粗暴有木有!另外,python
查了一下flask的應用框架,發現用WSGI + Nginx有下面的幾個優點:nginx
在此很是感謝Ray在他的blog中提到了在阿里雲上部署Flask應用。他的這篇bolg給了我很大啓示(個人項目中的web
目錄都是按照他的作法),給出他的這篇blog的地址:
http://www.cnblogs.com/Ray-liang/p/4173923.htmljson
個人python環境和python開發環境都是和ray的這篇blog提到的同樣的,Ray已經寫得足夠好啦!flask
我寫一點不同的東西,我假設你的Flask的應用已經完成,如今只是部署的問題。個人項目總體的目錄以下:api
---/home/www/my_flask
| --- app
| --- __init__.py // 包文件
| --- ...... // 其餘目錄或文件
| --- config.ini // uwsgi文件
| --- requiremwnt.txt // 項目所需的pip安裝包
| --- manage.py // Flask Script,用於啓動Flask應用
| --- logs // Flask應用部署時的產生的log文件保存路徑
| --- venv // 虛擬環境
| --- bin
| --- local
| --- lib
| --- pip-selfcheck.json
其中config.ini爲部署uwsgi新建的文件,magnage.py爲啓動Flask應用所新建的文件。緩存
安裝uwsgi:restful
(venv) my_flask root@iZ25i0x7zadZ : pip install uwsgi
配置uwsgi:app
[uwsgi]
# uwsgi 啓動時所使用的地址與端口
http-socket = 127.0.0.1:5000
# 指向網站目錄
chdir = /home/www/my_flask
# python 啓動程序文件
wsgi-file = manage.py
# python 程序內用以啓動的 application 變量名
callable = app
# 處理器數
processes = 4
# 線程數
threads = 2
#狀態檢測地址
stats = 127.0.0.1:919
因爲在部署的時候,應用是rest api,採用socket的方式進行通訊會存在緩存不足的狀況,若是訪問url,
則會出現下面的狀況:
*** Stats server enabled on 127.0.0.1:919 fd: 15 ***
invalid request block size: 21573 (max 4096)...skip
此時,你應該修改你的config.ini的配置,將socket修改成http-socket.這樣問題就解決了。另外還有一篇
blog對這個講得很詳細:
https://emptyhammock.com/projects/info/pyweb/simple.html
uwsgi配置完成後,驗證配置是否正確
$ uwsgi config.ini
接下來安裝supervisor,
supervisor的安裝
my_flask root@iZ25i0x7zadZ : sudo apt-get install supervisor
配置supervisor
在/etc/supervisor/conf.d/目錄下新建my_flask.conf文件,具體配置以下:
[program:my_flask] # 啓動命令入口 command=uwsgi /home/www/my_flask/config.ini # 命令程序所在目錄 directory=/home/www/my_flask #運行命令的用戶名 user=root autostart=true autorestart=true #日誌地址 stdout_logfile=/home/www/my_flask/logs/uwsgi_supervisor.log
這裏的command和ray的有所不一樣, 具體緣由我如今還不太明白。但能夠肯定的是,在/home/www/my_flask目錄
下運行uwsgi config.ini能夠啓動flask 應用。此外通過測試,只要命令程序所在目錄正確,command的取值只需寫
命令,而不須要將目錄寫全。
當配置好supervisor後就能夠啓動supervisor進行本地測試。
最後爲Nginx的安裝與配置:
Nginx的安裝
sudo apt-get install nginx
Nginx的配置
server { listen 8080; server_name XXX.XX.XXX.XXX; #公網地址 location / { include uwsgi_params; proxy_pass http://127.0.0.1:5000; uwsgi_param UWSGI_PYHOME /home/www/my_flask/venv; # 指向虛擬環境目錄 uwsgi_param UWSGI_CHDIR /home/www/my_flask; # 指向網站根目錄 uwsgi_param UWSGI_SCRIPT manage; # 指定啓動程序 } }
這其中和ray的另一個不一樣在於proxy_pass,因爲以前在配置uwsgi的時候選擇了http-scoket的
方式,這樣在設置代理的時候應該是proxy_pass而不是uwsgi_pass.在stackoverflow的一篇問答
中查到,貌似uwsgi不支持http的反向代理。至於其餘的步驟則徹底參照ray的博客。
【參考資料】
[1] http://www.cnblogs.com/Ray-liang/p/4173923.html
[2] https://emptyhammock.com/projects/info/pyweb/simple.html
[3] http://maximebf.com/blog/2012/10/building-websites-in-python-with-flask/#.VbsPGBOqqkq
[4] http://flask-cn.readthedocs.org/en/latest/patterns/packages/#id2