搞了一天多,終於搞通了uWSGI的部署原理,下面總結一下遇到的一些坑,希望給讀者能夠少走彎路。
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/