最近想學點 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!"