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