在nginx单元中找不到unit-go子进程,curl请求超时

时间:2018-05-28 04:00:11

标签: nginx

当我使用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

有人有同样的问题吗?

3 个答案:

答案 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