Nginx + Flask + Flup: 完整演示
最近想学点Nginx, 发现大家一般都是自己编译. 自己编译也不难, 但是考虑到Ubuntu自带的安装包就已经够用了, 所以姑且先用起来再说.
安装Nginx
Ubuntu提供了四种nginx的安装包, 功能由简到繁依次为: nginx-light, nginx-core, nginx-full, nginx-extras.
安装前, 可以用 aptitude show 查看各个安装包支持的模块. 比如nginx-extras比nginx-full多了perl和lua支持.
权衡之后, 发现最佳选择为nginx-full, 也就是"标准版".
$ sudo apt-get install nginx-fullnginx-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 upgradeforce-reload restart start stop
当然, 直接用 /usr/sbin/nginx 也行, 通过 -s 给 nginx 进程发送信号.
用Flask写一个应用
Flask是Python的微型Web框架, 之前在文章里有过介绍, 现在写一个最简单的应用.
在HOME下建一个项目目录:
adam@t450s:~$ mkdir flaskr
在flaskr目录下创建文件app.py, 内容为:
# encoding: utf-8from flask import Flaskapp = Flask(__name__)@app.route('/')def hello(): return 'Hello World!'
再创建文件flaskr.fcgi, 内容为:
#!/usr/bin/pythonfrom flup.server.fcgi import WSGIServerfrom app import appif __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