转载

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-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 也行, 通过 -s 给 nginx 进程发送信号.

用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

正文到此结束
Loading...