Flask + WSGI + Nginx 雲部署


這幾天學着用flask寫一些rest api,然后部署到雲上。這個過程雖然網上有很多的教程,但還是遇到不少的問題!

采用flask的原因是因為它比較容易上手吧。用flask有專門restful api的框架,用起來簡單粗暴有木有!另外,

查了一下flask的應用框架,發現用WSGI + Nginx有下面的幾個優勢:

  •  高性能
  • 部署比較方便,采用Nginx可以部署多個Flask的應用

在此非常感謝Ray在他的blog中提到了在阿里雲上部署Flask應用。他的這篇bolg給了我很大啟示(我的項目中的

目錄都是按照他的做法),給出他的這篇blog的地址:
  http://www.cnblogs.com/Ray-liang/p/4173923.html

 我的python環境和python開發環境都是和ray的這篇blog提到的一樣的,Ray已經寫得足夠好啦!

 我寫一點不一樣的東西,我假設你的Flask的應用已經完成,現在只是部署的問題。我的項目整體的目錄如下:

---/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:

 (venv) my_flask root@iZ25i0x7zadZ : pip install uwsgi

 配置uwsgi:

[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

 

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM