最近想学点 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