当我使用nginx / unit项目作为我的LoadBalancer组件时,我想使用golang编程语言来创建一个插件工具。根据{{3}},我config/make
单位源代码和go build
我的程序,然后使用http put
命令更新配置:
{
"listeners": {
"*:8500": {
"application": "go_chat_app"
}
},
"applications": {
"go_chat_app": {
"type": "go",
"working_directory": "/tmp",
"executable": "/tmp/unit-go"
}
}
}
#curl -X PUT -d @go.json --unix-socket /var/run/control.unit.sock http://localhost/
启动单元服务后,我无法在ps
commond中看到unit-go子进程,但我看到8500
端口按unit router
进程列出:< / p>
#netstat -anpt | grep 8500
tcp 0 0 0.0.0.0:8500 0.0.0.0:* LISTEN 12798/unit: router
#ps auxf
root 12795 0.0 0.0 16224 952 ? Ss 5月25 0:00 unit: main [/usr/sbin/unitd --log /var/log/unitd.log --pid /run/unitd.pid]
nobody 12797 0.0 0.0 26468 976 ? S 5月25 0:00 \_ unit: controller
nobody 12798 0.0 0.0 174076 932 ? Sl 5月25 0:00 \_ unit: router
有人有同样的问题吗?
答案 0 :(得分:1)
@Xim非常感谢〜
我修改了golang程序的监听端口,重建它并替换二进制文件:
[root @ centos7 unit] #cat unit.go 包主要
import (
"net/http"
"fmt"
"nginx/unit"
)
func main() {
http.HandleFunc("/", handler)
// http.ListenAndServe(":8080", nil)
unit.ListenAndServe(":8500", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello world\n")
w.Header().Add("X-Content-Lenght", "256")
var b [10]byte
var res int = 1
for res > 0 {
res, _ = r.Body.Read(b[:])
if res > 0 {
fmt.Fprintf(w, "body partion: '%s'\n", b[:res])
}
}
fmt.Fprintf(w, "<head></head><body bgcolor=#ddf> Welcome to Go app. Hi there. I Love '%s' of '%s' at '%s'</body>\n",
r.Method, r.URL.Path[1:], r.Host)
}
我更新了配置:
curl -X PUT -d @go.json --unix-socket /var/run/control.unit.sock http://localhost/
它返回:
{
"success": "Reconfiguration done."
}
但是当我使用curl localhost:8500
同时响应Read header timeout
顺便说一句,当我将processes
对象添加到json中时,出现错误:
# cat go.json
{
"listeners": {
"*:8500": {
"application": "go_unit"
}
},
"applications": {
"go_unit": {
"type": "go",
"processes": 1,
"working_directory": "/tmp",
"executable": "/tmp/unit"
}
}
}
更新配置:
#curl -X PUT -d @go.json --unix-socket /var/run/control.unit.sock http://localhost/
它返回:
{
"error": "Invalid configuration."
}
答案 1 :(得分:0)
使用官方示例,它也不起作用:
# yum install unit-devel
# go build -o /tmp/go-app /usr/share/doc/unit/examples/go-app/let-my-people.go
# sudo service unitd restoreconfig /usr/share/doc/unit/examples/example.config
{
"success": "Reconfiguration done."
}
curl http://localhost:8500/foo/bar/
Read header timeout
我编译的单元版本:
#unitd version
unit version: 0.1
configured as ./configure --prefix=/usr --modules=/usr/lib64/unit/modules --control=unix:/var/run/control.unit.sock --pid=/var/run/unitd.pid --log=/var/log/unitd.log --debug --tests
我的compile/make/make go-install
单位阶段可能出现问题吗?官方的例子不能正常工作是不能接受的,哭泣.....
答案 2 :(得分:0)
mar0x解决了这个问题,我可能正在使用不同的单元bianary并使用新版本的源代码,这里是由mar0x逐步编写的hello world
示例:
$ cd $HOME
$ script $HOME/unit-i126.log $ rm -rf $HOME/unit-i126 && mkdir -p $HOME/unit-i126/src
$ cd $HOME/unit-i126/src
$ git clone https://github.com/nginx/unit.git
$ cp unit/pkg/rpm/rpmbuild/SOURCES/unit.example-go-app ../go-app.go
$ cp unit/pkg/rpm/rpmbuild/SOURCES/unit.example-go-config ../go-app.json
$ cd unit
$ export GOPATH=$HOME/unit-i126
$ ./configure
$ ./configure go
$ make -s all
$ make go-install
$ ./build/unitd
$ cd $HOME/unit-i126
$ go build go-app.go
$ cp go-app /tmp/
$ curl -X PUT -d @go-app.json --unix-socket src/unit/control.unit.sock http://localhost/
$ curl http://localhost:8500/
$ kill `cat src/unit/unit.pid`
$ exit