<!-- review: finished -->

<a id="runtime"></a>

# 运行时控制

要启动 Angie,请使用 **systemd** 执行以下命令:

```console
$ sudo service angie start
```

建议事先检查配置语法。方法如下:

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

重新加载配置:

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

停止 Angie:

```console
$ sudo service angie stop
```

安装后,运行以下命令以确保 Angie 已启动并正在运行:

```console
$ curl localhost:80
```

#### NOTE
开源版本 Angie 的运行方法可能因安装方式而异。

Angie 有一个主进程和多个工作进程。主进程负责读取和评估配置,并维护工作进程。工作进程处理实际的请求。Angie 使用基于事件的模型和依赖于操作系统的机制,在工作进程之间高效分配请求。工作进程的数量在配置文件中定义,可以针对给定配置固定,也可以根据可用 CPU 核心数自动调整(参见 [worker_processes](https://cn.angie.software//angie/docs/configuration/modules/core.md#worker-processes))。

配置后,Angie 还会在退出前将某些共享内存区域(目前是 [proxy_cache_path](https://cn.angie.software//angie/docs/configuration/modules/http/http_proxy.md#proxy-cache-path) 中的 `keys_zone`)刷新到磁盘,以便新的主进程可以恢复它们,从而提高性能。如果由于区域大小更改、二进制版本不兼容或其他原因导致恢复失败,Angie 将记录警告(`failed to restore zone at address`),并且不会使用区域恢复机制。

<a id="control-signals"></a>

## 使用信号

也可以使用信号来控制 Angie。默认情况下,主进程的进程 ID 会写入文件 `/run/angie.pid`。此文件名可以在配置时或在 `angie.conf` 中使用 [pid](https://cn.angie.software//angie/docs/configuration/modules/core.md#pid) 指令更改。主进程支持以下信号:

| `TERM`、`INT`   | 快速关闭                                                                                                     |
|----------------|----------------------------------------------------------------------------------------------------------|
| `QUIT`         | [优雅](https://cn.angie.software//angie/docs/configuration/modules/core.md#worker-shutdown-timeout) 关闭     |
| `HUP`          | 重新加载配置,更新时区(仅适用于 FreeBSD 和 Linux),使用更新后的配置启动新的工作进程,:ref:优雅 <worker_shutdown_timeout> 关闭旧的工作进程            |
| `USR1`         | 重新打开日志文件                                                                                                 |
| `USR2`         | 升级可执行文件                                                                                                  |
| `WINCH`        | [优雅](https://cn.angie.software//angie/docs/configuration/modules/core.md#worker-shutdown-timeout) 关闭工作进程 |

您可以使用 **kill** 发送信号:

```console
$ sudo kill -QUIT $(cat /run/angie.pid)
```

也可以使用信号控制单个工作进程,尽管这是可选的。支持的信号有:

| `TERM`、`INT`   | 快速关闭                                                                                                             |
|----------------|------------------------------------------------------------------------------------------------------------------|
| `QUIT`         | [优雅](https://cn.angie.software//angie/docs/configuration/modules/core.md#worker-shutdown-timeout) 关闭             |
| `USR1`         | 重新打开日志文件                                                                                                         |
| `WINCH`        | 用于调试的异常终止(需要启用 [debug_points](https://cn.angie.software//angie/docs/configuration/modules/core.md#debug-points)) |

<a id="control-config-change"></a>

## 更改配置

为了让 Angie 重新读取配置文件,应向主进程发送 `HUP` 信号。主进程首先检查语法有效性,然后尝试应用新配置,包括打开新的日志文件和监听套接字。如果应用新配置失败,主进程将回滚更改并继续使用旧配置运行。如果应用成功,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们 [优雅](https://cn.angie.software//angie/docs/configuration/modules/core.md#worker-shutdown-timeout) 关闭。旧的工作进程关闭其监听套接字并继续为现有客户端提供服务。在所有客户端都得到服务后,旧的工作进程将关闭。

Angie 跟踪每个进程的配置更改。代数从服务器首次启动时的 1 开始。这些数字随着每次配置重新加载而递增,并在进程标题中可见:

```console
$ sudo angie
$ ps aux | grep angie

    angie: master process v|version| #1 [angie]
    angie: worker process #1
```

成功重新加载配置后(无论是否有实际更改),Angie 会为接收到新配置的进程递增代数:

```console
$ sudo kill -HUP $(cat /run/angie.pid)
$ ps aux | grep angie

    angie: master process v|version| #2 [angie]
    angie: worker process #2
```

如果前几代的任何工作进程继续运行,它们将立即可见:

```console
$ ps aux | grep angie

    angie: worker process #1
    angie: worker process #2
```

#### NOTE
不要将配置代数与"进程编号"混淆;出于实际目的,Angie 不使用连续的进程编号。

<a id="log-rotation"></a>

## 轮转日志文件

要轮转日志文件,首先重命名文件。然后,向主进程发送 `USR1` 信号。主进程将重新打开所有当前打开的日志文件,并将它们分配给运行工作进程的非特权用户。成功重新打开文件后,主进程关闭所有打开的文件并通知工作进程重新打开其日志文件。工作进程也将立即打开新文件并关闭旧文件。因此,旧文件几乎立即可用于后处理,例如压缩。

<a id="service-upgrade"></a>

## 在线升级可执行文件

要升级服务器可执行文件,首先用新文件替换旧的可执行文件。然后,向主进程发送 `USR2` 信号。主进程将把其当前带有进程 ID 的文件重命名为带有 `.oldbin` 后缀的新文件,例如 `/usr/local/angie/logs/angie.pid.oldbin`,然后启动新的可执行文件,新可执行文件又会启动新的工作进程。

请注意,旧的主进程不会关闭其监听套接字,如有必要,可以管理它以重新启动其工作进程。如果新的可执行文件未按预期执行,您可以采取以下操作之一:

* 向旧的主进程发送 `HUP` 信号。这将在不重新读取配置的情况下启动新的工作进程。然后,您可以通过向新的主进程发送 `QUIT` 信号来 [优雅](https://cn.angie.software//angie/docs/configuration/modules/core.md#worker-shutdown-timeout) 关闭所有新进程。
* 向新的主进程发送 `TERM` 信号。它将向其工作进程发送消息,请求它们立即退出。如果有任何进程未退出,请发送 `KILL` 信号强制它们退出。当新的主进程退出时,旧的主进程将自动启动新的工作进程。

如果新的主进程退出,旧的主进程将从带有进程 ID 的文件名中删除 `.oldbin` 后缀。

如果升级成功,向旧的主进程发送 `QUIT` 信号,只有新进程将保留。

配置后,Angie 还会在升级前将某些共享内存区域(目前是 [proxy_cache_path](https://cn.angie.software//angie/docs/configuration/modules/http/http_proxy.md#proxy-cache-path) 中的 `keys_zone`)刷新到磁盘,以便新的主进程可以恢复它们,从而提高性能。如果由于区域大小更改、二进制版本不兼容或其他原因导致恢复失败,Angie 将记录警告(`failed to restore zone at address`),并且不会使用区域恢复机制。

<a id="runtime-cli-options"></a>

## 命令行选项

| `-?`、`-h`       | 显示命令行参数的帮助信息,然后退出。                                                                                                                                                            |
|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `--build-env`   | 显示有关构建环境的辅助信息,然后退出。                                                                                                                                                           |
| `-c` file       | 使用 file 作为配置文件,而不是使用 [默认文件](https://cn.angie.software//angie/docs/configuration/configfile.md#configfile)。                                                                    |
| `-e` file       | 使用 file 作为错误日志文件,而不是使用 [默认文件](https://cn.angie.software//angie/docs/configuration/processing.md#logging)。特殊值 `stderr` 指定标准错误<br/>输出。                                          |
| `-g` directives | 设置 [全局配置指令](https://cn.angie.software//angie/docs/configuration/modules/core.md#core),<br/>例如:`angie -g "pid /var/run/angie.pid; worker_processes<br/>`sysctl -n hw.ncpu`;"`。 |
| `-m`、`-M`       | 显示内置模块(`-m`)或内置和已加载模块<br/>(`-M`)的列表,然后退出。                                                                                                                                     |
| `-p` prefix     | 为 `angie` 使用指定的 prefix 路径(服务器<br/>文件所在的目录;默认为 `/usr/local/angie/`)。                                                                                                           |
| `-q`            | 如果设置了 `-t` 或 `-T`,则仅显示错误消息;<br/>否则,无效果。                                                                                                                                       |
| `-s` signal     | 向主进程发送 [信号](#control-signals):<br/>`stop`、`quit`、`reopen`、`reload` 等。                                                                                                         |
| `-t`            | 测试配置文件,然后退出。Angie 检查<br/>配置语法,递归包含其中提到的文件。                                                                                                                                    |
| `-T`            | 与 `-t` 相同,但在递归包含配置中提到的所有文件后,<br/>还会将汇总配置输出到标准输出。                                                                                                                              |
| `-v`            | 显示 Angie 版本,然后退出。                                                                                                                                                             |
| `-V`            | 显示 Angie 版本、编译器版本、构建时间<br/>以及使用的 [构建参数](https://cn.angie.software//angie/docs/installation/sourcebuild.md#configure),然后退出。                                                    |
