约定：

```xml
//资源路径约定（不用配置；也不能配置）
resources/app.yml（ 或 app.properties ） #为应用配置文件

resources/static/     #为静态文件根目录（v2.2.10 后支持）
resources/templates/  #为视图模板文件根目录（v2.2.10 后支持）
```

属性之间的引用，使用 `${...}`：

```yaml
test.demo1: "${db1.url}"                          #引用应用属性
test.demo2: "jdbc:mysql:${db1.server}"            #引用应用属性并组合
test.demo3: "jdbc:mysql:${db1.server}/${db1.db}"  #引用多个应用属性并组合
test.demo4: "${JAVA_HOME}"                        #引用环境变量
test.demo5: "${.demo4}"                           #引用本级其它变量（v2.9.0 后支持）
```

使用参考：

[《注入或手动获取配置（IOC）》](/article/31)

### 1、服务端基本属性

```yaml
#服务端口（默认为8080）
server.port: 8080
#服务主机（ip）
server.host: "0.0.0.0"
#服务包装端口（默认为 ${server.port}）//v1.12.1 后支持  //一般用docker + 服务注册时才可能用到
server.wrapPort: 8080
#服务包装主机（ip）//v1.12.1 后支持
server.wrapHost: "0.0.0.0"
#服务上下文路径
server.contextPath: "/test-service/" #v1.11.2 后支持（或者 "!/test-service/" 表示原路径不能再请求 v2.6.3 后支持）

#服务 http 信号名称，服务注册时可以为信号指定名称（默认为 ${solon.app.name}）
server.http.name: "waterapi"
#服务 http 信号端口（默认为 ${server.port}）
server.http.port: 8080
#服务 http 信号主机（ip）
server.http.host: "0.0.0.0"
#服务 http 信号包装端口 //v1.12.1 后支持  //一般用docker + 服务注册时才可能用到
server.http.wrapPort: 8080
#服务 http 信号包装主机（ip）//v1.12.1 后支持
server.http.wrapHost: "0.0.0.0"
#服务 http 最小线程数（默认：0表示自动，支持固定值 2 或 内核倍数 x2）//v1.10.13 后支持 //一般不用配置
server.http.coreThreads: 0 
#服务 http 最大线程数（默认：0表示自动，支持固定值 32 或 内核倍数 x32） //v1.10.13 后支持
server.http.maxThreads: 0
#服务 http 闲置线程或连接超时（0表示自动，默认为5分钟，单位毫秒） //v1.10.13 后支持
server.http.idleTimeout: 0
#服务 http 是否为IO密集型？ //v1.12.2 后支持
server.http.ioBound: true

#服务 socket 信号名称，服务注册时可以为信号指定名称（默认为 ${solon.app.name}）
server.socket.name: "waterapi.tcp"
#服务 socket 信号端口（默认为 20000+${server.port}）
server.socket.port: 28080
#服务 socket 信号主机（ip）
server.socket.host: "0.0.0.0"
#服务 socket 信号包装端口 //v1.12.1 后支持  //一般用docker + 服务注册时才可能用到
server.socket.wrapPort: 28080
#服务 socket 信号包装主机（ip）//v1.12.1 后支持
server.socket.wrapHost: "0.0.0.0"
#服务 socket 最小线程数（默认：0表示自动，支持固定值 2 或 倍数 x2）） //v1.10.13 后支持
server.socket.coreThreads: 0 
#服务 socket 最大线程数（默认：0表示自动，支持固定值 32 或 倍数 x32）） //v1.10.13 后支持
server.socket.maxThreads: 0
#服务 socket 闲置线程或连接超时（0表示自动，单位毫秒）） //v1.10.13 后支持
server.socket.idleTimeout: 0
#服务 socket 是否为IO密集型？ //v1.12.2 后支持
server.socket.ioBound: true


#服务 websocket 信号名称，服务注册时可以为信号指定名称（默认为 ${solon.app.name}）
server.websocket.name: "waterapi.ws"
#服务 websocket 信号端口（默认为 10000+${server.port}）
server.websocket.port: 18080
#服务 websocket 信号主机（ip）
server.websocket.host: "0.0.0.0"
#服务 websocket 信号包装端口 //v1.12.1 后支持  //一般用docker + 服务注册时才可能用到
server.websocket.wrapPort: 18080
#服务 websocket 信号包装主机（ip）//v1.12.1 后支持
server.websocket.wrapHost: "0.0.0.0"
#服务 websocket 最小线程数（默认：0表示自动，支持固定值 2 或 倍数 x2）） //v1.10.13 后支持
server.websocket.coreThreads: 0 
#服务 websocket 最大线程数（默认：0表示自动，支持固定值 32 或 倍数 x32）） //v1.10.13 后支持
server.websocket.maxThreads: 0
#服务 websocket 闲置线程或连接超时（0表示自动，单位毫秒）） //v1.10.13 后支持
server.websocket.idleTimeout: 0
#服务 websocket 是否为IO密集型？ //v1.12.2 后支持
server.websocket.ioBound: true
```

关于包装主机与包装端口的说明：

* 比如，服务在docker里运行，就相当于被docker包装了一层。
* 此时，要向外部注册服务，就可能需要使用包装主机与包装端口。


### 2、请求会话相关

```yaml
#设定最大的请求包大小（或表单项的值大小）//默认: 2m
server.request.maxBodySize: 2mb #kb,mb
#设定最大的上传文件大小
server.request.maxFileSize: 2mb #kb,mb (默认使用 maxBodySize 配置值)
#设定最大的请求头大小//默认: 8k
server.request.maxHeaderSize: 8kb #kb,mb
#设定上传使用临时文件（v2.7.2 后支持。v3.6.0 后失效，由 fileSizeThreshold 替代）
server.request.useTempfile: false #默认 false
#设定上传文件大小阀值（v3.6.0 后支持。低于阀值走内存，高于走临时文件）
server.request.fileSizeThreshold: 512kb #默认 512kb
#设定路由使用原始路径（v2.8.6 后支持）//即未解码状态
server.request.useRawpath: false //默认 false
#设定请求体编码
server.request.encoding: "utf-8"

#设定响应体编码
server.response.encoding: "utf-8"

#设定会话超时秒数（单位：秒）
server.session.timeout: 7200 
#设定会话id的cookieName
server.session.cookieName: "SOLONID"
#设定会话状态的cookie域（默认为当前域名）
server.session.cookieDomain: noear.org
```


### 3、服务端SSL证书配置属性（https）

```yaml
#设定 ssl 证书（属于所有信号的公共配置）
server.ssl.keyStore: "/data/ca/demo.jks" #（本地绝对位置）或 "classpath:demo.pfx"（资源目录位置）
server.ssl.keyPassword: "demo"

#设定 http 信号的 ssl 证书（如果没有，会使用 server.ssl 的配置）//v2.3.7 后支持
server.http.ssl.enable: true
server.http.ssl.keyStore: "/data/ca/demo.jks" #（本地绝对位置）或 "classpath:demo.pfx"（资源目录位置）
server.http.ssl.keyPassword: "demo"

#设定 socket 信号的 ssl 证书（如果没有，会使用 server.ssl 的配置）//v2.3.7 后支持
server.socket.ssl.enable: true
server.socket.ssl.keyStore: "/data/ca/demo.jks" #（本地绝对位置）或 "classpath:demo.pfx"（资源目录位置）
server.socket.ssl.keyPassword: "demo"

#设定 websocket 信号的 ssl 证书（如果没有，会使用 server.ssl 的配置）//v2.3.7 后支持
server.websocket.ssl.enable: true
server.websocket.ssl.keyStore: "/data/ca/demo.jks" #（本地绝对位置）或 "classpath:demo.pfx"（资源目录位置）
server.websocket.ssl.keyPassword: "demo"
```

注意：添加 ssl 证书后，应用的 "server.port" 端口只能用 `https` 来访问。


### 4、服务端压缩输出（gzip）

v2.5.7 后支持

```yaml
# 设定 http gzip配置
server.http.gzip.enable: false  #是否启用（默认 fasle）
server.http.gzip.minSize: 4096 #最小多少大小才启用（默认 4k）
server.http.gzip.mimeTypes: 'text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml'
```

注意：mimeTypes 默认的常见的类型，如果有需要增量添加

### 5、应用基本属性

```yaml
#应用名称
solon.app.name: "waterapi"
#应用组
solon.app.group: "water"
#应用命名空间（一般用不到，只有支持的组件才用）
solon.app.namespace: "demo"
#应用标题
solon.app.title: "WATER"
#应用是否启用？
solon.app.enabled: true

#应用体外扩展目录
solon.extend: "ext"

#应用元信息输出开启（输出每个插件的信息）
solon.output.meta: 1
```

`solon.app.*` 属性，可通过 `Solon.cfg().app*()` 获取。

### 6、应用环境配置切换

```yaml
#应用环境配置（主要用于切换包内不同的配置文件）
solon.env: dev

#例：
# app.yml      #应用主配置（必然会加载）
# app-dev.yml  #应用dev环境配置
# app-pro.yml  #应用pro环境配置
#
#启动时：java -Dsolon.env=pro -jar demo.jar 或者 java -jar demo.jar --env=pro
```

### 7、应用配置增强

```yaml
#添加外部扩展配置（用于指定外部配置。策略：先加载内部的，再加载外部的盖上去）
solon.config.add: "./demo.yml" #把文件放外面（多个用","隔开） //替代已弃用的 solon.config

#添加多个内部配置（在 app.yml 之外，添加配置加载）//v2.2.7 后支持
solon.config.load:
  - "app-ds-${solon.env}.yml"     #可以是环境相关的
  - "app-auth_${solon.env}.yml"
  - "config/common.yml"           #也可以环境无关的或者带目录的
```


### 8、视图后缀与模板引擎的映射配置

```yaml
solon.view.prefix: "/templates/" #默认为资源目录，使用体外目录时以"file:"开头（例："file:/data/demo/"）

#默认约定的配置（不需要配置，除非要修改）
solon.view.mapping.htm: BeetlRender #简写
solon.view.mapping.shtm: EnjoyRender
solon.view.mapping.ftl: FreemarkerRender
solon.view.mapping.jsp: JspRender
solon.view.mapping.html: ThymeleafRender
solon.view.mapping.vm: VelocityRender

#添加自义定映射时，需要写全类名
solon.view.mapping.vm: org.noear.solon.view.velocity.VelocityRender #全名（一般用简写）
```


### 9、MIME 配置

一般有特别的静态资源后缀，才会用到

```yaml
#添加MIME印射（如果有需要？）
solon.mime:
  vue: "text/html"
  map: "application/json"
  log: "text/plain" #这三行只是示例一下!
```


### 10、安全停止配置

```yaml
solon.stop.safe: 0   #安全停止（0或1）//（v2.1.0 后支持；之前只能用接口启用）
solon.stop.delay: 10   #安全停止的延时秒数（默认10秒）
```


### 11、虚拟线程配置


```yaml
solon.threads.virtual.enabled: true #启用虚拟线程池（默认false）//v2.7.3 后支持
```
