9 CHN 10 配置文件
ProTankerAlfa edited this page 2024-05-20 01:29:57 -03:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

English | 简体中文

你可以通过DrogonAppFramework实例的多个接口配置各种参数来控制Http服务端的某些行为。不过使用配置文件是更好的方式原因如下

  • 使用配置文件而不是源码,可以在运行期而不是编译期决定应用的行为,这无疑是更方便和灵活的方式;
  • 可以保持main文件的简洁

所有的配置接口都有对应的配置文件选项支持,基于上面这些额外的好处,建议应用开发者使用配置文件配置应用的各种参数。

配置文件的加载很简单在DrogonAppFramework实例调用run接口之前调用loadConfigFile接口即可参数是配置文件的路径和文件名比如

int main()
{
    drogon::app().loadConfigFile("config.json");
    drogon::app().run();
}

这段程序,加载配置文件config.json然后运行。具体的监听端口、日志输出、数据库配置等等行为都可以由配置文件配置事实上这段程序基本就可以是整个webapp应用的主函数的全部代码了。

文件说明

配置文件的例子在源码目录的顶层config.example.json如果你使用drogon_ctl create project命令创建工程那么在工程目录里也可以找到内容一致的文件config.json。所以你基本上不需要重写而是对这个文件进行适当的修改就可以完成对webapp的配置。

文件是json格式支持注释你可以用c++的注释符号/**///把不需要的配置项注释掉。

注释掉配置项后,框架会使用默认值初始化,对应项的默认值在配置文件中都有说明,

支持配置文件格式

  • json
  • yaml 需要安装yaml-cpp以提供yaml文件解析

下面以json格式分项详述。

  • SSL

    ssl项是为了配置https服务的加密配置文件如下

      "ssl": {
        "cert": "../../trantor/trantor/tests/server.pem",
        "key": "../../trantor/trantor/tests/server.pem",
        "conf":[
          ["Options", "Compression"],
          ["min_protocol", "TLSv1.2"]
        ]
      }
    

    其中cert是证书文件路径key是私钥文件路径如果一个文件既包含证书也包含私钥则两个路径可以配制成相同的。文件的编码格式为PEMconf则是可选的SSL选项。他们会直接被传入SSL_CONF_cmd用来定制化SSL连接。这些选项必须是一个或是两个元素的字串数组。

  • listeners监听器

    顾名思义listeners项是为了配置webapp的监听器它是一个JSON数组类型每一个JSON对象都表示一个监听具体的配置如下

    "listeners": [
        {
          "address": "0.0.0.0",
          "port": 80,
          "https": false
        },
        {
          "address": "0.0.0.0",
          "port": 443,
          "https": true,
          "cert": "",
          "key": ""
        }
      ]
    

    其中:

    • address: 字符串类型表示监听的IP地址如果没有该项则采用默认值"0.0.0.0"
    • port: 整数类型,表示监听的端口,必须是合法的端口号,没有默认值,必填项。
    • https: 布尔类型表示是否采用https默认值是false表示使用http。
    • certkey: 字符串类型在https为true时有效表示https的证书和私钥默认值是空字符串表示采用全局的ssl配置的证书和私钥文件;
  • db_clients数据库客户端

    用于配置数据库客户端它是一个JSON数组类型每一个JSON对象都表示一个单独的数据库客户端具体的配置如下

      "db_clients":[
        {
          "name":"",
          "rdbms": "postgresql",
          "host": "127.0.0.1",
          "port": 5432,
          "dbname": "test",
          "user": "",
          "passwd": "",
          "is_fast": false,
          "connection_number":1,
          "filename": ""
        }
      ]
    

    其中:

    • name:字符串,客户端名字,默认是"default"name是应用开发者从框架获取数据库客户端的标记如果有多项客户端name字段必须不同否则框架不会正常工作
    • rdbms:字符串,表示数据库服务端类型,目前支持"postgresql""mysql"和“sqlite3”大小写不敏感。
    • host字符串数据库服务端地址localhost是默认值
    • port:整数,数据库服务端的端口号;
    • dbname:字符串,数据库名字;
    • user:字符串,用户名;
    • passwd:字符串,密码;
    • is_fastbool默认false表明该客户端是否是FastDbClient
    • connection_number到数据库服务端的连接数至少是1默认值也是1影响数据读写的并发量如果is_fast为真,该数值表示每个事件循环的连接数,否则表示总的连接数;
    • filename: sqlite3 数据库的文件名;
  • threads_num线程数

    属于app选项的子项整数默认值是1表示框架IO线程数对网络并发有明确的影响这个数字并不是越大越好了解non-blocking I/O原理的应该知道这个数值应该和你期望网络IO占用的CPU核心数一致。如果这个参数设为0那么IO线程数将设置为全部CPU核心数。比如

    "threads_num": 16,
    

    表示网络IO占用16个线程在高负荷情况下最多可以跑满16个CPU核心(线程核心)。

  • session会话

    会话相关的选项也是app的子项控制是否采用session和session的超时时间。如

    "enable_session": true,
    "session_timeout": 1200,
    

    其中:

    • enable_session布尔值表示是否采用会话默认值是false如果客户端不支持cookie请设为false因为框架会为每个不带会话cookie 的请求创建新的会话如果客户端不支持cookie 而又有大量请求,则服务端会生成大量的无用 session对象这是完全没必要的资源和性能损失
    • session_timeout整数值表示会话的超时时间单位是秒默认值是0只有enable_session为true时才发挥作用。0表示永久有效。
  • document_root根目录

    app项的子项字符串表示Http根目录对应的文档路径是静态文件下载的根路径默认值是"./",表示程序运行的当前路径。比如:

    "document_root": "./",
    
  • upload_path上传文件路径

    app项的子项字符串表示上传文件的默认路径默认值是"uploads",如果这个值不是/,./../开始的,并且这个值也不是...则这个路径是前面document_root项的相对路径否则就是一个绝对路径或者当前目录的相对路径。如

    "upload_path":"uploads",
    
  • client_max_body_size请求体最大值

    app项的子项字符串用来限制请求体的大小。 你可以使用后缀 k, m, g, 来指定千字节,兆字节或者吉字节 (byte * 1024),在 64 位的系统上,你也可以使用 t 来表示一个太字节。后缀可以是小写或者大写。

    "client_max_body_size": "10M",
    
  • client_max_memory_body_size请求体内存分配最大值

    app项的子项字符串用来限制对请求体进行缓存分配内存的大小。 你可以使用后缀 k, m, g, 来指定千字节,兆字节或者吉字节 (byte * 1024),在 64 位的系统上,你也可以使用 t 来表示一个太字节。后缀可以是小写或者大写。

    "client_max_memory_body_size": "50K"
    
  • file_types文件类型

    app项的子项字符串数组默认值如下表示框架支持的静态文件下载类型如果请求的静态文件扩展名在这些类型之外的框架将返回404错误。

    "file_types": [
          "gif",
          "png",
          "jpg",
          "js",
          "css",
          "html",
          "ico",
          "swf",
          "xap",
          "apk",
          "cur",
          "xml"
        ],
    
  • mime 注册新的MIME类型

    app项的子项、字符串字典。声明发送与静态文件時如何将文件扩展映射到新的MIME类型即。默认情况下未识别的。注意此选项仅注册MIME。如果扩展不在上述file_types则框架仍发送404。

    "mime" : {
      "text/markdown": "md",
      "text/gemini": ["gmi", "gemini"]
    }
    
  • connections连接数控制

    app项的子项有两个选项如下

    "max_connections": 100000,
    "max_connections_per_ip": 0,
    

    其中:

    • max_connections:整数,默认值是 100000表示同时并发的最大连接数当服务端维持的连接达到这个数量时新的TCP连接请求将被直接拒绝。
    • max_connections_per_ip整数默认值是0表示单个IP的最大连接数0表示没有限制。
  • log日志选项

    app项的子项同时也是个JSON对象控制日志输出的行为如下

    "log": {
          "log_path": "./",
          "logfile_base_name": "",
          "log_size_limit": 100000000,
          "log_level": "TRACE"
        },
    

    其中:

    • log_path:字符串,默认值是空串,表示文件存放的路径,如果是空串,则所有日志输出到标准输出;
    • logfile_base_name:字符串,表示日志文件的basename默认值是空串这时basename将为drogon
    • log_size_limit整数单位是字节默认值是100000000(100M),当日志文件的大小达到这个数值时,日志文件会切换。
    • log_level:字符串,默认值是"DEBUG",表示日志输出的最低级别,可选值从低到高为:"TRACE","DEBUG","INFO","WARN"其中的TRACE级别只有在DEBUG编译的情况下才有效。

    注意: Drogon的文件日志采用了非阻塞输出结构大概可以达到每秒百万行的日志输出能力可以放心使用。

  • 应用控制

    也是app子项有两个控制项如下

        "run_as_daemon": false,
        "relaunch_on_error": false,
    

    其中:

    • run_as_daemon布尔值默认值是false当为true时应用程序将以daemon的形式变成1号进程的子进程运行于系统后台。
    • relaunch_on_error布尔值默认值时false当为true时应用程序将fork一次子进程执行真正的工作父进程什么都不干只负责在子进程崩溃或因其它原因退出时重启子进程这是一种简单的服务保护机制。
  • use_sendfile发送文件

    app子选项布尔值表示在发送文件时是否采用linux系统调用sendfile默认值时true使用sendfile 可以提高发送效率,减少大文件的内存占用。如下:

    "use_sendfile": true,
    

    注意即使该项为truesendfile系统调用也不一定会采用因为小文件使用sendfile并不一定划算框架会根据自己的优化策略决定是否采用。

  • use_gzip压缩传输

    app子选项布尔值默认值是true表示 Http响应的Body是否采用压缩传输。当该项为true时下面的情况采用压缩传输

    • 客户端支持gzip压缩
    • body是文本类型
    • body的长度大于一定值

    配置例子如下:

    "use_gzip": true,
    
  • static_files_cache_time文件缓存时间

    app子选项整数值单位秒表示静态文件在框架内部的缓存时间在这段时间内对该文件的请求框架会直接从内存返回响应而不会读取文件系统这对提高静态文件性能有一定好处当然代价是更新实时性有n秒的延时。默认值是5秒0表示永远缓存只会读文件系统一次慎用负数表示没有缓存。如下

    "static_files_cache_time": 5,
    
  • simple_controllers_map简单控制器映射

    app子选项JSON对象数组每一项表示一个从Http路径到HttpSimpleController的映射这种配置只是一个可选途径并不是必须配置在这里请参阅HttpSimpleController。 具体的配置如下:

    "simple_controllers_map": [
          {
            "path": "/path/name",
            "controller": "controllerClassName",
            "http_methods": ["get","post"],
            "filters": ["FilterClassName"]
          }
        ],
    

    其中:

    • path字符串Http路径
    • controller字符串HttpSimpleController的名字
    • http_methods字符串数组支持的Http方法这个列表之外的会被过滤掉返回405错误
    • filters字符串数组路径上的filter列表参见中间件和过滤器
  • idle_connection_timeout空闲连接超时控制

    app子选项整数值单位秒默认值是60当一个连接超过这个数值的时间没有任何读写的时候该连接将会被强制断开。如下

    "idle_connection_timeout":60
    
  • dynamic_views动态视图加载

    app的子选项控制动态视图的使能和路径有两个选项如下

    "load_dynamic_views":true,
    "dynamic_views_path":["./views"],
    

    其中:

    • dynamic_views_path布尔值默认值是false当为true时框架会在视图路径中搜索视图文件并动态编译成so文件然后加载进应用当任何视图文件发生变化时也会引起自动编译和重新加载
    • dynamic_views_path:字符串数组,每一项表示动态视图的搜索路径,如果路径值不是/,./../开始的,并且这个值也不是...则这个路径是前面document_root项的相对路径否则就是一个绝对路径或者当前目录的相对路径。

    参见视图

  • server_header_field头字段

    app的子选项配置由框架发送的所有response的Server头字段默认值是空串当该选项为空时框架会自动生成形如Server: drogon/version string的头字段。如下:

    "server_header_field": ""
    
  • keepalive_requests长连接请求数

    keepalive_requests 选项设置客户端在一个keepalive长连接上可以发送的最大请求数。当达到这个请求数时长连接将被关闭。默认值0代表没有限制。如下

    "keepalive_requests": 0
    
  • Pipelining请求数

    pipelining_requests选项用于设置长连接上已接收但未必处理的最大的请求数。当这个数字达到时长连接将被关闭。默认值0代表没有限制。关于pipelining的详细描述请参阅标准文档rfc2616-8.1.1.2。配置如下所示:

    "pipelining_requests": 0
    

11 drogon_ctl 命令