搞了一天多,終於搞通了uWSGI的部署原理,下面總結一下遇到的一些坑,但願給讀者可以少走彎路。html
這裏的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是一個服務器,使用前就必定要安裝,在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: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/