Nginx + Flask + Flup:完整演示

adam1q84發表於2015-11-13

最近想學點 Nginx,發現大家一般都是自己編譯。自己編譯也不難,但是考慮到 Ubuntu 自帶的安裝包就已經夠用了,所以姑且先用起來再說。

安裝 Nginx

Ubuntu 提供了四種 nginx 的安裝包,功能由簡到繁依次為:nginx-lightnginx-corenginx-fullnginx-extras

安裝前,可以用 aptitude show 檢視各個安裝包支援的模組。比如 nginx-extrasnginx-full 多了 perllua 支援。

權衡之後,發現最佳選擇為 nginx-full,也就是「標準版」。

$ sudo apt-get install nginx-full

nginx-full:
     nginx-common (= 1.9.3-1ubuntu1), libc6 (>= 2.14), libexpat1 (>= 2.0.1), libgd3 (>=
     2.1.0~alpha~), libgeoip1, libpam0g (>= 0.99.7.1), libpcre3, libssl1.0.0 (>= 1.0.2~beta3),
     libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25), zlib1g (>= 1:1.2.0)

如果不清楚到底安裝了哪些檔案,可以通過 dpkg --listfiles 命令檢視:

adam@t450s:~/study/nginx$ dpkg --listfiles nginx-full
/.
/usr
/usr/sbin
/usr/sbin/nginx
/usr/share
/usr/share/doc
/usr/share/doc/nginx-full
/usr/share/doc/nginx-full/copyright
/usr/share/doc/nginx-full/changelog.Debian.gz
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/nginx.8.gz
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/nginx-full

可以順帶安裝一下文件:

$ sudo apt-get install nginx-doc

Nginx 命令

重啟等操作可以通過 /etc/init.d/nginx 執行:

$ sudo /etc/init.d/nginx restart

這是一個 shell 指令碼(/etc/init.d/ 目錄下都是 shell 指令碼),有如下命令可用:

configtest    reload        rotate        status        upgrade
force-reload  restart       start         stop

當然,直接用 /usr/sbin/nginx 也行,通過 -snginx 程式傳送訊號。

用 Flask 寫一個應用

Flask 是 Python 的微型 Web 框架,之前在文章裡有過介紹,現在寫一個最簡單的應用。

HOME 下建一個專案目錄:

adam@t450s:~$ mkdir flaskr

flaskr 目錄下建立檔案 app.py,內容為:

# encoding: utf-8

from flask import Flask

app = Flask(__name__)

@app.route(`/`)
def hello():
    return `Hello World!`

再建立檔案 flaskr.fcgi,內容為:

#!/usr/bin/python

from flup.server.fcgi import WSGIServer
from app import app

if __name__ == `__main__`:
    WSGIServer(app, bindAddress=`/tmp/flaskr-fcgi.sock`).run()

這就是 FastCGI wrapper。需要安裝 Flup 以支援 FastCGI:

$ sudo pip install flup

注意啟動 WSGI Server 時,繫結的 socket 檔案。這個檔案後續配置 Nginx 時要用到,它是 Flup 和 Nginx 通訊的橋樑。

flaskr.fcgi 檔案新增執行許可權,不加也行,反正它就是個 Python 檔案。

$ chmod +x flaskr.fcgi

配置 Nginx

簡單起見,直接編輯 nginx.conf 檔案:

$ sudo vim /etc/nginx/nginx.conf

新增一個 server 配置到 http 模組:

http {
    server {
        listen 80;
        server_name localhost;

        location / {
            try_files $uri @flaskr;
        }
        location @flaskr {
            include fastcgi_params;
            fastcgi_param SCRIPT_NAME "";
            fastcgi_param PATH_INFO $fastcgi_script_name;
            fastcgi_pass unix:/tmp/flaskr-fcgi.sock;
        }
    }
}

最後一行指定了 Nginx 和 FastCGI 通訊的 socket 檔案:

fastcgi_pass unix:/tmp/flaskr-fcgi.sock;

執行程式

啟動 FastCGI wrapper:

adam@t450s:~/flaskr$ ./flaskr.fcgi 

或者:

adam@t450s:~/flaskr$ python flaskr.fcgi 

切換到 root 使用者,修改 socket 檔案的許可權:

adam@t450s:/tmp$ sudo su
[sudo] adam 的密碼: 
root@t450s:/tmp# chmod 777 flaskr-fcgi.sock

否則 Nginx 無權訪問這個 socket 檔案。檢視 /var/log/nginx/error.log 的話,會看到如下錯誤:

2015/11/09 22:23:21 [crit] 15357#15357: *1 connect() to unix:/tmp/flaskr-fcgi.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/flaskr-fcgi.sock:", host: "localhost"

修改 socket 檔案的許可權後,Nginx 好像並不需要重啟。

訪問 http://localhost/,不出意外即可看到 "Hello World!"

另請參閱http://segmentfault.com/a/1190000002652109

相關文章