Nginx官方推出动态服务器NGINX Unit

unit是一个动态的web应用服务器,采用了类似php-fpm的机制,不过支持Python/Go/Perl/Ruby/PHP等多种语言,后面也会增加对Java/Javascript的支持。

配置源码
clone源码仓库

$ git clone https://github.com/nginx/nginx.git
进入目录执行configure

$ ./configure
配置go模块
这里配置对go的支持,其他的语言配置类似,可参考官方文档

首先要安装golang环境,可以在这里下载相应的二进制包安装。安装过的可以跳过。

$ wget https://dl.google.com/go/go1.10.1.linux-amd64.tar.gz
$ tar -xf go1.10.1.linux-amd64.tar.gz -C /usr/local/
$ export PATH=$PATH:/usr/local/go/bin
在用户的目录下新建文件夹go作为go的工作目录,并设置环境变量GOPATH

$ mkdir $HOME/go
$ export GOPATH=$HOME/go
配置unit对golang的支持,主要工作是为go引入了 “nginx/unit”包,用于在go中调用

$ ./configure go
$ make go-install
创建go程序
$ cd $GOPATH
$ mkdir src/unit-demo
$ vim ./src/unit-demo/main.go
main.go中的代码如下

package main

import (
“fmt”
“net/http”
“nginx/unit”
)

func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Add(“Content-Type”, “text/plain”);

fmt.Fprintf(w, “Method : %s\n”, r.Method)
fmt.Fprintf(w, “URL : %s\n”, r.URL.Path)
fmt.Fprintf(w, “Host : %s\n”, r.Host)
}

func main() {
http.HandleFunc(“/”, handler)
unit.ListenAndServe(“8000”, nil)
}
这里和普通的go实现的http服务器最大的区别是调用unit.ListenAndServe而不是http.ListenAndServe。编译后的程序在作为单独的程序使用时,unit.ListenAndServe和http.ListenAndServe完全相同。通过unit启动时,uint.ListenAndServe的参数被忽略,真正的监听端口通过环境变量从unit的主程序中获取,而不是使用参数里的8000端口。这里也可以不用”8000″而用其他的端口。

编译安装go程序

$ go install unit-demo
编译执行unit
$ cd /path/to/unit
$ make
$ ./build/unitd
配置unit
unit貌似配置项很少,而且只能通过unix socket配置 这里为了简单用curl来配置

新建一个unit.config的文本文件,输入下面的配置

{
“applications”: {
“example_go”: {
“type”: “go”,
“executable”: “/home/kenan/go/bin/unit-demo”
}
},
“listeners”: {
“*:8500”: {
“application”: “example_go”
}
}
}
配置里listeners表示监听地址及对应的处理程序,applications对应所有的处理程序的信息,type为go表示是golang程序,executable为可执行文件路径。对于8500端口的HTTP请求,将有前面生成的unit-demo程序处理

通过curl将unit.config文件内容传递给unitd程序,返回Reconfiguration done表示配置成功。

$ curl -X PUT -d @unit.config –unix-socket control.unit.sock http://localhost/
{
“success”: “Reconfiguration done.”
}
用curl访问,可以看到返回的结果。

$ curl http://localhost:8500/t
Method : GET
URL : /t
Host : localhost:8500
总结
比起Nginx,unit更像是一个进程管理器。以往对于多个后端的应用程序需要分别管理,如今unit一个程序就可以实现。如果一个项目使用了PHP/Python/Go/Ruby等多种语言,用unit来管理一切貌似也是不错的选择。