python flask+gunicorn+nginx部署應用 ...
失敗版本:flask+uwsgi
ini配置文件
[uwsgi]
callable = app ;//程式內啟用的application變數名
home = /home/jcuan/code/python/project/venv ;如果是venv環境下,一定要設置路徑
pythonpath = /home/jcuan/code/python/project/venv ;可以設置pythonpath的路徑,flask命令行會自動設置一些路徑(比如我的自動設置了: /home/jcuan/code/python/project/venv),註意這個不會
socket = /tmp/uwsgi.sock ; 啟動程式時所使用的地址和埠,可以採用埠或者unix socket
wsgi-file = /home/jcuan/code/python/project/venv/application/__init__.py ;flask程式的啟動文件,這個文件里不需要有app.run(),有了反而會出錯
processes = 4 ;//處理器個數
threads = 2 ;//線程個數
不知道是有什麼特殊原因:1,callable不能在ini文件里配置,不管配置什麼都是預設的application;2,chmod-sock在ini里配置無效
運行
uwsgi --plugin python --ini uwsig.ini --callable app --chmod-sock=666
nginx的文件配置大概如下(location是/,不會分別配置。。):
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/uwsgi.sock;
}
雖然可以運行,不過我在__init__.py裡面import的視圖函數統統沒有起作用,雖然綁定了,但是訪問對應的url是404,只有定義在__init__.py的視圖函數才起作用
成功版本flask+gunicorn
gunicorn.conf的基本配置,註意字元串都要用引號包含起來
註意這個地方也有坑,不要把sock文件放在/tmp目錄下,最好放/run等目錄下,因為伺服器的原因,/tmp目錄下文件可能只對特定的服務可見。
your system probably using namespaced temporary directories, which means every service can only see its own files in /tmp
workers = 3 #進程數
timeout = 30 #超時
bind = 'unix:/tmp/flask.socks' #nginx監聽位置
backlog = 1000 #監聽隊列長度
然後又進入了一個坑,nginx那邊的超簡化版配置應該像這樣
server {
listen 80;
server_name 127.0.0.1;
location / {
include proxy_params; #這裡邊設置了一些代理需要轉換的頭,比如得到真實ip, proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://unix:/tmp/flask.sock; #很奇葩,我一直寫的是unix:/tmp/flask.sock,然後一直都不對
}
}
運行l類似下邊的命令就可以了gunicorn --config application/gunicorn.conf application:app
。application:我的應用所在包的名字,app,flask啟動文件中Flask實例變數的名字