uWSGI+Nginx+Flask在Linux下的部署


       搞了一天多,終於搞通了uWSGI的部署原理,下面總結一下遇到的一些坑,希望給讀者能夠少走彎路。

       簡單來說,uWSGI是一個web服務器,Nginx進行反向代理的其實跟這些服務器可以說沒有任何關系,你提供動態內容的服務器可以是apache/nginx/tomcat,當然也可以是uWSGI,他們之間的代理關系其實都是通過tcp/ip協議進行通信的。當然uWSGI相對於其它服務器來說有其特殊的地方,不同之處在於它可以提供獨特的uwsgi協議進行通信。也就是說,nginx和uWSGI之間的通信協議可以有多種選擇,但常用http和uwsgi這兩種。
 
  搞懂了這個之后,整個部署過程就就剩下相對獨立的幾步:
    1、首先要有一個flask應用
    2、然后用uWSGI對flask應用進行部署
    3、配置nginx的反向代理,指向uWSGI的ip和端口,或者指向sock文件

1、flask應用

        這里的flask應用隨意就好了。下面是一個簡單的應用:

        目錄:

/home/ubuntu/flask_test/
        app.py
        templates/
                index.html
        static/    

  app.py的內容:

 1 from flask import Flask,render_template
 2 
 3 app = Flask(__name__)
 4 
 5 @app.route('/')
 6 def index():
 7     return render_template('index.html')
 8 
 9 if __name__ == '__main__':
10     app.run()

 

2、用uWSGI對flask應用進行部署

既然uWSGI是一個服務器,使用前就一定要安裝,在python下,可以直接使用命令pip install uwsgi安裝即可。注意,這里如果是在virtualenv中安裝的話,在啟動的時候有一定要使用對應的虛擬環境。

uWSGI的啟動非常簡單,但是它的參數多到讓人發指,當然,可以把這些配置信息全部放到配置文件中,跟直接在命令行中使用的效果一樣的。由於是最簡單的配置方法,所以下面的配置文件只寫了最簡單的幾個參數,能夠部署成功就可以了。(另外吐槽一下uWSGI的文檔的配置文件讀起來好混亂...)

假設我的配置文件叫做uwsgi.ini,注意這個文件可以放在任何地方,只要你喜歡:

[uwsgi]
http=127.0.0.1:8888
wsgi-file=/home/ubuntu/flask_test/app.py
callable=app
touch-reload=/home/ubuntu/flask_test/

沒錯就是這么少的參數,至於其他參數,有需要回去再慢慢看吧。簡單說一些這些參數的含義:

  http-socket:使用的通訊協議,除了這個協議之外,還有http和socket,這三者的區別是,http和http-socket都是http協議,兩者的區別我也沒怎么分,官方文檔推薦使用http-socket,socket就是uwsgi協議,官方解釋是uwsgi協議通訊效率更高,這里我暫且先使用更加簡單的http協議吧。另外如果用socket協議的話,nginx的配置會有所不同,后面會再說。

  wsgi-file:這個就是你的flask應用所在的文件

  callable:這個是你的flask應用實例的名稱,是flask獨有的配置項

  touch-reload:動態監控文件變化,然后重載服務,是跟uWSGI的emperor有關的配置項,當這個路徑下面的文件發生變化,服務就會重新加載,這在部署上線之后對項目內容進行修改的時候十分有用

配置好之后就可以使用命令行工具啟動uWSGI服務器:

1 $ uwsgi --ini /path/to/uwsgi.ini

如無意外,服務就啟動了,如果想實現持續監控應用,可以使用emperor功能,顧名思義,emperor帝王的意思,這是動態監控配置文件的選項,對應的vassal(諸侯)是被監控的對象,具體使用是:

1 $ uwsgi --emperor  /path/to/vassals/

 

注意了,這里--emperor后面的參數是一個文件夾的路徑,這個文件夾里面放置了你所有需要監控的應用的配置文件,一旦這些配置文件發生變更,uwsgi就會動態加載,所以雖然對上面的配置文件放置位置沒什么特殊要求,但是最好將你的配置文件用軟鏈接的方式放到這個配置文件中:

1 $ ln -s /file/path/of/conf.ini   /path/to/vassals/

        最后,配置完成之后,要放在后台持續運行,可以使用nohup命令:

1 $ nohup uwsgi --emperor  /path/to/vassals/  &

  到此為止,簡單的uWSGI服務就搭建起來了。

3、配置nginx反向代理

  安裝nginx:sudo apt-get install nginx

  啟動nginx服務:sudo service nginx start

  重載nginx服務:nginx -s reload

  這里說一下nginx的配置文件的讀寫順序問題:nginx的配置文件是/etc/nginx/nginx.conf,這個配置文件中又引用了/etc/nginx/conf.d/和/etc/nginx/sites-enabled/這兩個文件夾的配置文件,通過include來實現。所以,無論是直接在nginx.conf或者在conf.d、sites-enabled中配置都是可以的。

簡單的配置文件:

server{
  listen  80;
  server_name  localhost;
  location /xxx/yyy/zzz{
    proxy_pass  http://127.0.0.1:8888;
  }
}

上面就是一般的nginx反向代理的配置,如果使用http協議的話,與代理其它服務器的方式沒有什么不同。如果是使用uwsgi協議就要使用nginx提供的協議,則需要改變一下寫法:

server{
    listen  80;
    server_name  localhost;
    location /xxx/yyy/zzz{
        include uwsgi_params;
        uwsgi_pass  unix://path/to/uwsgi.sock
    }
}    

注意,如果使用uwsgi協議進行通信,則在uWSGI的配置文件中應該使用socket配置項而不是http或者http-socket,也就是類似於下面這種形式:   

[uwsgi]
socket=/path/to/uwsgi.sock
wsgi-file=/home/ubuntu/flask_test/app.py
callable=app
touch-reload=/home/ubuntu/flask_test/

 


免責聲明!

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



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