<!-- review: finished -->

<a id="configfile"></a>

# 配置文件

Angie 使用基于文本的配置文件。默认情况下，该文件名为
`angie.conf`，根据 [--conf-path](https://cn.angie.software//angie/docs/installation/sourcebuild.md#paths) 构建参数的位置，通常位于 `/etc/angie` 目录下。

配置文件通常由以下上下文组成：

- [events](https://cn.angie.software//angie/docs/configuration/modules/core.md#events) – 一般连接处理
- [http](https://cn.angie.software//angie/docs/configuration/modules/http/index.md#d-http) – HTTP 流量
- [mail](https://cn.angie.software//angie/docs/configuration/modules/mail/index.md#m-mail) – 邮件流量
- [stream](https://cn.angie.software//angie/docs/configuration/modules/stream/index.md#s-stream) – TCP 和 UDP 流量
- [wasm_modules](https://cn.angie.software//angie/docs/configuration/modules/wasm/index.md#wasm-modules) – WASM 运行时

放置在这些上下文之外的指令被视为在 `main` 上下文中：

```nginx
user angie; # 在 'main' 上下文中的指令

events {

    # 连接处理的配置
}

http {

    # 特定于 HTTP 的配置，影响所有虚拟服务器

    server {

        # HTTP 虚拟服务器 1 的配置
        location /one {

            # 处理以 '/one' 开头的 URI 的配置
        }
        location /two {

            # 处理以 '/two' 开头的 URI 的配置
        }
    }

    server {

        # HTTP 虚拟服务器 2 的配置
    }
}

stream {

    # 特定于 TCP/UDP 的配置，影响所有虚拟服务器
    server {

        # TCP 虚拟服务器 1 的配置
    }
}
```

为了简化配置管理，我们建议在主 `angie.conf` 文件中使用 [include](https://cn.angie.software//angie/docs/configuration/modules/core.md#include) 指令引用特定功能文件的内容：

```nginx
include /etc/angie/http.d/*.conf;
include /etc/angie/stream.d/*.conf;
```

<a id="inheritance"></a>

## 继承

一般来说，子上下文（包含在另一个上下文中的上下文，被视为其父上下文）继承在父级定义的指令设置。一些指令可以出现在多个上下文中；在这种情况下，您可以通过在子上下文中包含该指令来覆盖从父级继承的设置。

<a id="syntax"></a>

## 语法

<a id="measurement-units"></a>

### 测量单位

可以使用以下单位来指定大小：

| 无后缀      | 字节   |
|----------|------|
| `k`, `K` | 千字节  |
| `m`, `M` | 兆字节  |
| `g`, `G` | 吉字节  |

例如：`1024`、`8k`、`1m`、`16g`。

时间间隔可以以毫秒、秒、分钟、小时、天等来指定，使用以下后缀：

| `ms`   | 毫秒            |
|--------|---------------|
| `s`    | 秒             |
| `m`    | 分钟            |
| `h`    | 小时            |
| `d`    | 天             |
| `w`    | 周             |
| `M`    | 月（假定等于 30 天）  |
| `y`    | 年（假定等于 365 天） |

多个单位可以通过按顺序从最重要到最不重要指定它们来组合成一个值，选用空格分隔。例如，`"1h 30m"` 指定的持续时间与 `"90m"` 或 `"5400s"` 相同。没有后缀的值被解释为秒。建议始终指定后缀。

某些时间间隔只能以秒级精度指定。

<a id="directives"></a>

### 指令

每个指令由一个名称和一组参数组成。
如果指令的任何部分需要包含空格，
它应被引号括起来或转义空格：

```nginx
add_header X-MyHeader "foo bar";
add_header X-MyHeader foo\ bar;
```

如果命名参数需要空格，并且您使用了引号，
则其名称也必须用引号括起来：

```nginx
server example.com "sid=server 1";
```

<a id="configure-hashes"></a>

## 设置哈希

为了有效处理静态数据集，例如服务器名称、[map](https://cn.angie.software//angie/docs/configuration/modules/http/http_map.md#id3) 指令值、MIME 类型和请求头名称，Angie 使用哈希表。在启动和每次重新配置时，Angie 确定这些哈希表的最佳大小，以确保存储具有相同哈希值的键的桶大小不超过配置参数（hash bucket size）。表的大小以桶为单位测量，并调整直到超过 hash max size 参数。大多数哈希表都有相应的指令来调整这些参数，例如 [server_names_hash_max_size](https://cn.angie.software//angie/docs/configuration/modules/http/index.md#server-names-hash-max-size) 和 [server_names_hash_bucket_size](https://cn.angie.software//angie/docs/configuration/modules/http/index.md#server-names-hash-bucket-size) 用于服务器名称。

hash bucket size 参数与处理器的缓存行大小对齐。这种对齐提高了现代处理器上键搜索的效率，减少了内存访问的次数。如果 hash bucket size 等于一个缓存行大小，则在键搜索期间的最大内存访问次数将为两个：一个用于计算桶地址，另一个用于在桶内搜索。因此，如果 Angie 指示应该增加 hash max size 或 hash bucket size，则首先增加 hash max size。

<a id="configfile-reloading"></a>

### 重新加载配置

要应用对配置文件的更改，必须重新加载它。您可以先通过配置语法检查重启 Angie 进程：

```console
$ sudo angie -t && sudo service angie restart
```

或者，您可以重新加载服务，以在不中断当前请求处理的情况下应用新配置：

```console
$ sudo angie -t && sudo service angie reload
```
