Server对象支持通过配置文件进行便捷的配置。支持的配置选项以及配置说明请查看接口文档说明,文档中有详细说明,以下章节不会对配置选项作介绍。

当使用g.Server(单例名称)获取Server单例对象时,将会自动通过默认的配置管理对象获取对应的Server配置。默认情况下会读取server.单例名称配置项,当该配置项不存在时,将会读取server配置项。

支持的配置文件配置项请参考Server配置管理对象属性:https://pkg.go.dev/github.com/gogf/gf/v2/net/ghttp#ServerConfig

示例1,默认配置项

server:
    address:    ":80"
    serverRoot: "/var/www/Server"

随后可以使用g.Server()获取默认的单例对象时自动获取并设置该配置。

在没有配置address的情况下,http server将会使用本地网卡的所有ip地址加上随机空闲端口来启动(默认配置:0)。如果想要指定ip但是使用随机空闲端口启动http server,可以使用ip:0的格式来配置address,例如:192.168.1.1:0, 10.0.1.1:0

示例2,多个配置项

多个Server的配置示例:

server:
    address:    ":80"
    serverRoot: "/var/www/Server"
    server1:
        address:    ":8080"
        serverRoot: "/var/www/Server1"
    server2:
        address:    ":8088"
        serverRoot: "/var/www/Server2"

我们可以通过单例对象名称获取对应配置的Server单例对象:

// 对应 server.server1 配置项
s1 := g.Server("server1")
// 对应 server.server2 配置项
s2 := g.Server("server2")
// 对应默认配置项 server
s3 := g.Server("none")
// 对应默认配置项 server
s4 := g.Server()

示例3,较完整示例

比如上一个章节的示例,对应的配置文件如下:

server:
    address:          ":8199"
    serverRoot:       "/var/www/Server"
    indexFiles:       ["index.html", "main.html"]
    accessLogEnabled: true
    errorLogEnabled:  true
    pprofEnabled:     true
    logPath:          "/var/log/ServerLog"
    sessionIdName:    "MySessionId"
    sessionPath:      "/tmp/MySessionStoragePath"
    sessionMaxAge:    "24h"
    dumpRouterMap:    false

同理,配置属性项的名称也不区分大小写,单词间也支持使用-/_符号连接。也就是说以下配置文件效果和上面的配置文件一致:

server:
    address:          ":8199"
    serverRoot:       "/var/www/Server"
    indexFiles:       ["index.html", "main.html"]
    accessLogEnabled: true
    errorLogEnabled:  true
    pprofEnabled:     true
    log-path:         "/var/log/ServerLog"
    session_Id_Name:  "MySessionId"
    Session-path:     "/tmp/MySessionStoragePath"
    session_MaxAge:   "24h"
    DumpRouterMap:    false

我们推荐配置文件中的配置项名称统一使用小驼峰的格式。

上传限制

Server对于客户端提交的数据是由大小限制的,主要有两个配置参数控制:

  • MaxHeaderBytes:请求头大小限制,请求头包括客户端提交的Cookie数据,默认设置为10KB
  • ClientMaxBodySize:客户端提交的Body大小限制,同时也影响文件上传大小,默认设置为8MB

由于安全性的考虑,默认的上传限制都不是很高,特别是ClientMaxBodySize的大小限制,在需要文件上传的场景可适当考虑调整,通过配置文件配置即可,例如:

server:
    maxHeaderBytes:    "20KB"
    clientMaxBodySize: "200MB"

这样便修改请求头大小限制为20KB,文件上传大小限制为200MB。如果不想做上传大小做任何限制,那么将clientMaxBodySize设置为0即可。

日志配置

v2版本开始,Server增加了对配置文件中Logger的配置项支持,主要是为了统一日志组件配置、并解决日志滚动切分的问题。配置示例:

server:
    address: ":8080"
    logger:
      path:                 "/var/log/server" 
	    file:                 "{Y-m-d}.log"          
	    stdout:               false      
	    rotateSize:           "100M"        
	    rotateBackupLimit:    10
	    rotateBackupExpire:   "60d"
	    rotateBackupCompress: 9
	    rotateCheckInterval:  "24h" 

关于其中logger项的详细介绍请参考 日志组件-配置管理 章节。

Content Menu

  • No labels

4 Comments

  1. 郭强 海亮 server的配置address,期望配置成

    [server]
    	address        = "0.0.0.0:8199"

    但是报错:

    2022-05-06 11:57:19.702 [INFO] swagger ui is serving at address: http://0.0.0.0:8199/redoc/ 
    2022-05-06 11:57:19.702 [INFO] openapi specification is serving at address: http://0.0.0.0:8199/api.json 
    2022-05-06 11:57:19.704 [FATA] 4289: net.Listen failed: listen tcp: address :0.0.0.0:8199: too many colons in address
    1. 4289: net.Listen failed
       1).  github.com/gogf/gf/v2/net/ghttp.(*gracefulServer).getNetListener
        	/root/go/pkg/mod/github.com/gogf/gf/v2@v2.0.6/net/ghttp/ghttp_server_graceful.go:192
       2).  github.com/gogf/gf/v2/net/ghttp.(*gracefulServer).ListenAndServe
        	/root/go/pkg/mod/github.com/gogf/gf/v2@v2.0.6/net/ghttp/ghttp_server_graceful.go:72
       3).  github.com/gogf/gf/v2/net/ghttp.(*Server).startServer.func1
        	/root/go/pkg/mod/github.com/gogf/gf/v2@v2.0.6/net/ghttp/ghttp_server.go:549
    2. listen tcp: address :0.0.0.0:8199: too many colons in address
    Stack:
    1.  github.com/gogf/gf/v2/net/ghttp.(*Server).startServer.func1
        /root/go/pkg/mod/github.com/gogf/gf/v2@v2.0.6/net/ghttp/ghttp_server.go:553

    期望配置地址能够设置ip,该怎么做?

    1. 这是一个BUG,已修复,你目前可以使用master分支试试。

  2. 请问多个配置项需要注意什么细节?

    我的项目中 address 等配置信息不会被 
    // 对应 server.server1 配置项
    s1 := g.Server("server1")
    这样的实例获取到 (sad)

    具体配置如下:

    server:
    graceful: true
    gracefulTimeout: 5
    dumpRouterMap: true
    errorLogEnabled: true
    accessLogEnabled: true
    serverAgent: 'PS-Proxy Server'
    errorLogPattern: "error-{Ymd}.log"
    accessLogPattern: "access-{Ymd}.log"
    api:
    address: ":8080"
    logPath: "./logs/api"
    swaggerPath: "/swagger"
    openapiPath: "/api.json"
    proxy:
    address: ":8888"
    logPath: "./logs/proxy"

    cmd 入口如下:
    var (
    Main = gcmd.Command{
    Name: "PatcherPro",
    Brief: "Start Patcher Proxy Server",
    Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
    // 代理服务
    sProxy := g.Server("serverProxy")
    sProxy.SetHandler(controller.Proxy())
    if port := parser.GetOpt("port").Int(); port > 0 {
    sProxy.SetPort(port)
    }
    err = sProxy.Start()
    if err != nil {
    return err
    }

    // 采集服务
    sAPI := g.Server("serverApi")
    sAPI.BindObject("/", controller.Ping)
    sAPI.Group("/api/helper", func(group *ghttp.RouterGroup) {
    group.Bind(
    controller.Allocation,
    controller.Financial,
    )
    })
    err = sAPI.Start()
    if err != nil {
    return err
    }

    g.Wait()
    return nil
    },
    }
    )

    目前全部是用
    sProxy.SetAddr(g.Config().MustGet(ctx, "server.proxy.address").String())

    这样的方式强制设置的。
  3. 提个建议:server配置支持指定network为tcp4。现在是写死的如下:

    net.Listen("tcp", s.httpServer.Addr) 

    这会导致一个问题,比如监听 0.0.0.0:8000  的时候,在linux下  ss -l | grep 8000   显示监听的是 *:8000

    如果  net.Listen("tcp4", s.httpServer.Addr)  则ss查看监听在 0.0.0.0:8000  

    不太了解具体的原理,但是如果是 *:8000  的话,windows无法通过 localhost:8000 访问 wsl2 中的server。

    当然了通过 s.SetListener 传一个自定义的也行,但不知道是否会损失一些功能。