最近在學習Flask,本文介紹一下如何部署Flask開發的應用,同時也學習一下Nginx的使用,這只是在Mac上的一個實驗。
應用
這里使用的應用就是官方的文檔中給出的Flaskr。
安裝Nginx
使用HomeBrew安裝Nginx:
1
|
$ brew install nginx |
HomeBrew會自動安裝Nginx及其依賴的程序。在我的電腦上安裝的是Nginx 1.6.2,配置文件的路徑是/usr/local/etc/nginx/nginx.conf。
啟動Nginx的命令:
1
|
$ nginx |
Nginx的默認端口是8080,用瀏覽器打開localhost:8080,顯示如下所示的頁面說明Nginx已經工作了。
配置Nginx
修改Nginx的配置文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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:
1
2
|
$ nginx -s quit $ sudo nginx |
因為使用了80端口,啟動Nginx時需要加上sudo。
啟動完成后,訪問localhost:
訪問時出現了錯誤,這是因為我們的應用還沒有啟動。
FastCGI Server
Nginx是一個靜態WEB服務器,不能直接運行我們的Python應用,當Nginx接受到請求時,會通過FastCGI轉發給我們的應用,應用是運行在FastCGI Server上的,這個server接收Nginx的請求并調用我們的程序,將結果返回給Nginx,Nginx再將結果返回給用戶。
我們要使用的FastCGI Server是flup,安裝方法:
1
|
$ pip install flup |
在應用目錄下創建一個fcgi文件,例如flaskr.fcgi:
1
2
3
4
5
6
|
#!/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文件可執行的權限:
1
|
$ chmod +x flaskr.fcgi |
手動啟動server:
1
2
|
$ screen $ . / flaskr.fcgi |
使用screen使server在后臺運行,或者:
1
|
$ nohup . /flaskr .fcgi & |
再次訪問localhost就可以看到我們的應用了。
遇到的問題
第一次運行FastCGI server后,任然無法訪問,查看Nginx的日志后發現Nginx服務器沒有權限訪問socket文件,修改nginx.conf添加user配置:
啟動的時候Nginx報錯:
1
|
nginx: [emerg] getgrnam( "wzy" ) failed in /usr/local/etc/nginx/nginx .conf:2 |
Google一下后發現要加上用戶組才行,改成這樣:
再次啟動Nginx后一切正常了。
Nginx配置項user的使用方法:
1
2
|
Syntax: user user [group]; Default: user nobody nobody; |
如果忽略group,Nginx會使用和user名稱一樣的用戶組,例如我設置user wzy,那么Nginx啟動的時候會去查找用戶組wzy,我的電腦上沒有這個用戶組,所以Nginx會報錯。