uWSGI+Nginx+Flask在Linux下的部署

       搞了一天多,終於搞通了uWSGI的部署原理,下面總結一下遇到的一些坑,但願給讀者可以少走彎路。html

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

一、flask應用

        這裏的flask應用隨意就行了。下面是一個簡單的應用:python

        目錄:nginx

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

  app.py的內容:web

 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()

 

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

既然uWSGI是一個服務器,使用前就必定要安裝,在python下,能夠直接使用命令pip install uwsgi安裝便可。注意,這裏若是是在virtualenv中安裝的話,在啓動的時候有必定要使用對應的虛擬環境。apache

uWSGI的啓動很是簡單,可是它的參數多到讓人髮指,固然,能夠把這些配置信息所有放到配置文件中,跟直接在命令行中使用的效果同樣的。因爲是最簡單的配置方法,因此下面的配置文件只寫了最簡單的幾個參數,可以部署成功就能夠了。(另外吐槽一下uWSGI的文檔的配置文件讀起來好混亂...)flask

假設個人配置文件叫作uwsgi.ini,注意這個文件能夠放在任何地方,只要你喜歡:ubuntu

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

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

  http-socket:使用的通信協議,除了這個協議以外,還有http和socket,這三者的區別是,http和http-socket都是http協議,二者的區別我也沒怎麼分,官方文檔推薦使用http-socket,socket就是uwsgi協議,官方解釋是uwsgi協議通信效率更高,這裏我暫且先使用更加簡單的http協議吧。另外若是用socket協議的話,nginx的配置會有所不一樣,後面會再說。服務器

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

  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服務就搭建起來了。

三、配置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/
相關文章
相關標籤/搜索