NGINX Unit

Grafana§

在此,我们从 源代码 安装 Grafana,以便我们 对其进行配置 以在 Unit 上运行。

  1. 使用 Go 语言模块安装 Unit

    此外,确保 Unit 的 Go 模块在 $GOPATH 中可用。

  2. 下载 Grafana 的源文件

    $ go get github.com/grafana/grafana
    
  3. 更新代码,将 Unit 添加到 Grafana 的协议列表。你可以应用补丁 (grafana.patch)

    $ cd $GOPATH/src/github.com/grafana/grafana
    $ curl -O https://unit.nginx.ac.cn/_downloads/grafana.patch
    $ patch -p1 < grafana.patch
    

    或手动更新源代码。在 conf/defaults.ini

    #################################### Server ##############################
    [server]
    # Protocol (http, https, socket, unit)
    protocol = unit
    

    pkg/api/http_server.go

    import (
        // ...
        "net/http"
        "unit.nginx.org/go"
        "os"
        // ...
    )
    
    // ...
    
    switch setting.Protocol {
    
    // ...
    
    case setting.HTTP, setting.HTTPS, setting.HTTP2:
        var err error
        listener, err = net.Listen("tcp", hs.httpSrv.Addr)
        if err != nil {
            return errutil.Wrapf(err, "failed to open listener on address %s", hs.httpSrv.Addr)
        }
    case setting.SOCKET:
        var err error
        listener, err = net.ListenUnix("unix", &net.UnixAddr{Name: setting.SocketPath, Net: "unix"})
        if err != nil {
            return errutil.Wrapf(err, "failed to open listener for socket %s", setting.SocketPath)
        }
    case setting.UNIT:
        var err error
        err = unit.ListenAndServe(hs.httpSrv.Addr, hs.macaron)
        if err == http.ErrServerClosed {
            hs.log.Debug("server was shutdown gracefully")
            return nil
        }
    

    pkg/setting/setting.go

     const (
         HTTP              Scheme = "http"
         HTTPS             Scheme = "https"
         SOCKET            Scheme = "socket"
         UNIT              Scheme = "unit"
         DEFAULT_HTTP_ADDR string = "0.0.0.0"
     )
    
     // ...
    
     Protocol = HTTP
     protocolStr, err := valueAsString(server, "protocol", "http")
     // ...
     if protocolStr == "https" {
         Protocol = HTTPS
         CertFile = server.Key("cert_file").String()
         KeyFile = server.Key("cert_key").String()
     }
     if protocolStr == "h2" {
         Protocol = HTTP2
         CertFile = server.Key("cert_file").String()
         KeyFile = server.Key("cert_key").String()
     }
     if protocolStr == "socket" {
         Protocol = SOCKET
         SocketPath = server.Key("socket").String()
     }
     if protocolStr == "unit" {
         Protocol = UNIT
     }
    
  4. 构建 Grafana

    $ cd $GOPATH/src/github.com/grafana/grafana
    $ go get ./...
    $ go run build.go setup
    $ go run build.go build
    $ yarn install --pure-lockfile
    $ yarn start
    

    记下新构建的 grafana-server 所在的目录,通常为 $GOPATH/bin/;它用于 Unit 配置中的 executable 选项。

  5. 运行以下命令,以便 Unit 可以访问 Grafana 的文件

    # chown -R unit:unit $GOPATH/src/github.com/grafana/grafana
    # chown unit:unit $GOPATH/bin/grafana-server
    

    注意

    unit:unit 用户组对仅适用于 官方包、Docker 镜像 和一些 第三方仓库。否则,帐户名称可能不同;运行 ps aux | grep unitd 命令以确保。

    有关更多详细信息,包括权限,请参阅 安全检查表

  6. 接下来,准备 配置(将 $GOPATH 替换为其在 executableworking_directory 中的值)

    {
        "listeners": {
            "*:3000": {
                "pass": "applications/grafana"
            }
        },
    
        "applications": {
            "grafana": {
                "executable": "$GOPATH/bin/grafana-server",
                "type": "external",
                "working_directory": "$GOPATH/src/github.com/grafana/grafana/"
            }
        }
    }
    

    有关详细信息,请参阅 Go 应用程序选项 和 Grafana 文档

  7. 上传更新后的配置。假设上述 JSON 已添加到 config.json

    # curl -X PUT --data-binary @config.json --unix-socket \
           /path/to/control.unit.sock http://localhost/config/
    

    注意

    控制套接字 路径可能有所不同;运行 unitd -h 或参阅 启动和关闭 以了解更多详细信息。

    成功更新后,Grafana 应可在侦听器的 IP 和端口上使用

    Grafana on Unit - Setup Screen