最近在學習Flask,本文介紹一下如何部署Flask開發的應用,同時也學習一下Nginx的使用,這只是在Mac上的一個實驗。html
這裏使用的應用就是官方的文檔中給出的Flaskr。python
使用HomeBrew安裝Nginx:nginx
shell$ brew install nginx
HomeBrew會自動安裝Nginx及其依賴的程序。在個人電腦上安裝的是Nginx 1.6.2,配置文件的路徑是/usr/local/etc/nginx/nginx.conf
。shell
啓動Nginx的命令:flask
shell$ nginx
Nginx的默認端口是8080,用瀏覽器打開localhost:8080
,顯示以下所示的頁面說明Nginx已經工做了。瀏覽器
修改Nginx的配置文件:服務器
server { listen 80; server_name localhost; charset utf-8; location / { try_files $uri @flaskr; } location @flaskr { include fastcgi_params; fastcgi_param PATH_INFO $fastcgi_script_name; fastcgi_param SCRIPT_NAME ""; fastcgi_pass unix:/tmp/flaskr-fcgi.sock; } }
從新啓動Nginx:app
shell$ nginx -s quit $ sudo nginx
由於使用了80端口,啓動Nginx時須要加上sudo
。socket
啓動完成後,訪問localhost
:學習
訪問時出現了錯誤,這是由於咱們的應用尚未啓動。
Nginx是一個靜態WEB服務器,不能直接運行咱們的Python應用,當Nginx接受到請求時,會經過FastCGI轉發給咱們的應用,應用是運行在FastCGI Server上的,這個server接收Nginx的請求並調用咱們的程序,將結果返回給Nginx,Nginx再將結果返回給用戶。
咱們要使用的FastCGI Server是flup,安裝方法:
shell$ pip install flup
在應用目錄下建立一個fcgi文件,例如flaskr.fcgi:
Python#!/usr/bin/python from flup.server.fcgi import WSGIServer from flaskr import app if __name__ == '__main__': WSGIServer(app, bindAddress='/tmp/flaskr-fcgi.sock').run()
同時給fcgi文件可執行的權限:
shell$ chmod +x flaskr.fcgi
手動啓動server:
shell$ screen $ ./flaskr.fcgi
使用screen使server在後臺運行,或者:
shell$ nohup ./flaskr.fcgi &
再次訪問localhost
就能夠看到咱們的應用了。
第一次運行FastCGI server後,任然沒法訪問,查看Nginx的日誌後發現Nginx服務器沒有權限訪問socket文件,修改nginx.conf添加user配置:
user wzy;
啓動的時候Nginx報錯:
nginx: [emerg] getgrnam("wzy") failed in /usr/local/etc/nginx/nginx.conf:2
Google一下後發現要加上用戶組才行,改爲這樣:
user wzy wheel;
再次啓動Nginx後一切正常了。
Nginx配置項user
的使用方法:
Syntax: user user [group]; Default: user nobody nobody;
若是忽略group,Nginx會使用和user名稱同樣的用戶組,例如我設置user wzy
,那麼Nginx啓動的時候會去查找用戶組wzy
,個人電腦上沒有這個用戶組,因此Nginx會報錯。