在Mac上使用Nginx和FastCGI部署Flask應用

最近在學習Flask,本文介紹一下如何部署Flask開發的應用,同時也學習一下Nginx的使用,這只是在Mac上的一個實驗。html

應用

這裏使用的應用就是官方的文檔中給出的Flaskrpython

安裝Nginx

使用HomeBrew安裝Nginx:nginx

shell$ brew install nginx

HomeBrew會自動安裝Nginx及其依賴的程序。在個人電腦上安裝的是Nginx 1.6.2,配置文件的路徑是/usr/local/etc/nginx/nginx.confshell

啓動Nginx的命令:flask

shell$ nginx

Nginx的默認端口是8080,用瀏覽器打開localhost:8080,顯示以下所示的頁面說明Nginx已經工做了。瀏覽器

配置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時須要加上sudosocket

啓動完成後,訪問localhost
學習

訪問時出現了錯誤,這是由於咱們的應用尚未啓動。

FastCGI Server

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會報錯。

相關文章
相關標籤/搜索