故障排除#
如果您遇到技术问题并且在其他部分找不到解决方案,请在 社区论坛 或 Telegram 频道 上提问。
客户技术支持:
调试日志#
在执行自我诊断或按照技术支持建议进行操作之前,应启用调试日志。
为此,请使用支持调试的可执行文件运行 Angie:
在 Linux 的 预构建包 中,angie-debug 文件是启用调试支持构建的:
$ ls -l /usr/sbin/ | grep angie
lrwxrwxrwx 1 root root 13 Sep 21 18:58 angie -> angie-nodebug
-rwxr-xr-x 1 root root 1561224 Sep 21 18:58 angie-debug
-rwxr-xr-x 1 root root 1426056 Sep 21 18:58 angie-nodebug
配置运行 angie-debug:
$ sudo ln -fs angie-debug /usr/sbin/angie
$ sudo angie -t && sudo service angie upgrade
这将启动 实时可执行文件升级。
调试后要恢复到常规可执行文件:
$ sudo ln -fs angie-nodebug /usr/sbin/angie
$ sudo angie -t && sudo service angie upgrade
在 FreeBSD 的 预构建包 中,angie-debug 文件是启用调试支持构建的:
$ ls -l /usr/local/sbin/ | grep angie
lrwxrwxrwx 1 root root 13 Sep 21 18:58 angie -> angie-nodebug
-rwxr-xr-x 1 root root 1561224 Sep 21 18:58 angie-debug
-rwxr-xr-x 1 root root 1426056 Sep 21 18:58 angie-nodebug
配置运行 angie-debug:
$ sudo ln -fs angie-debug /usr/local/sbin/angie
$ sudo angie -t && sudo service angie upgrade
这将启动 实时可执行文件升级。
调试后要恢复到常规可执行文件:
$ sudo ln -fs angie-nodebug /usr/local/sbin/angie
$ sudo angie -t && sudo service angie upgrade
在 模板化 Docker 镜像 中,您可以通过覆盖 ANGIE_BINARY 环境变量切换到支持调试的可执行文件:
$ docker run -it --rm -e ANGIE_BINARY="angie-debug" \
docker.angie.software/angie:templated
从源代码构建 Angie 时,请在编译前 启用调试,然后按照 从源代码构建 Angie 中的说明构建并安装 Angie:
$ ./configure --with-debug ...
$ make
$ sudo make install
安装后,请确认可执行文件在构建时启用了调试支持:使用 -V 选项运行它,并在输出中查找 --with-debug。使用默认的 --prefix 和 --sbin-path 时,可执行文件位于 /usr/local/angie/sbin/angie:
$ sudo /usr/local/angie/sbin/angie -V
...
configure arguments: --with-debug ...
然后重启 Angie 以切换到新的可执行文件,因为重新加载会保留已在运行的可执行文件。在启动新的可执行文件之前,请等待旧的主进程退出:旧的主进程会在退出时删除 PID 文件。如果 Angie 没有在运行,则只需运行最后一条命令:
$ sudo /usr/local/angie/sbin/angie -s quit
$ while [ -e /usr/local/angie/logs/angie.pid ]; do sleep 1; done
$ sudo /usr/local/angie/sbin/angie
要在不中断服务的情况下切换,请改用 在线升级。
备注
使用支持调试的可执行文件可能会略微降低性能;启用调试日志可能会显著降低性能并增加磁盘空间使用。
要启用调试日志,请在配置中使用 error_log 指令设置 debug 级别(模板化 Docker 镜像改用环境变量,如下方的 Docker 选项卡所示):
error_log /path/to/log debug;
然后使更改生效:
$ sudo angie -t && sudo service angie reload
$ sudo angie -t && sudo service angie reload
在 模板化 Docker 镜像 中,请使用 ANGIE_ERROR_LOG_SEVERITY 环境变量设置级别,而不是编辑 error_log;该变量设置主错误日志的级别。启动容器时,请将该变量与 ANGIE_BINARY 一起传递:
$ docker run -it --rm -e ANGIE_BINARY="angie-debug" \
-e ANGIE_ERROR_LOG_SEVERITY="debug" \
docker.angie.software/angie:templated
使用可执行文件自身的 命令行选项 测试配置并发送重新加载信号;使用默认的 --prefix 和 --sbin-path 时,可执行文件位于 /usr/local/angie/sbin/angie:
$ sudo /usr/local/angie/sbin/angie -t && sudo /usr/local/angie/sbin/angie -s reload
如果切换到不支持调试的可执行文件但在 error_log 指令中保留 error_log 指令的位置会影响收集的调试信息的完整性。 在较低配置级别(例如,在 为特定服务器禁用调试日志 如果全局启用了调试日志,但为单个服务器指定了不带 在服务器级别保留调试日志 要继续为特定服务器收集调试信息,请删除该服务器中的 error_log 覆盖设置;若要将这些信息写入另一个文件,请在覆盖设置中同时指定 您可以仅为 指定的客户端地址 启用调试日志: 调试日志可以写入循环内存缓冲区: 在 debug 级别,Angie 将以 info 级别记录条目。指令位置#
server 或 location 块内)指定的指令会覆盖在较高级别(例如,在主配置级别或 http 块内)指定的日志设置。debug 级别的 error_log,则不会为该服务器收集调试信息。error_log /var/log/angie/error.log debug; # 全局调试日志
http {
server {
listen 80;
server_name example.com;
error_log /var/log/angie/example.com.error.log;
# example.com 的调试日志被禁用,文件包含 error 级别
# ...
}
server {
listen 80;
server_name another.com;
# 此服务器将使用全局调试日志
# ...
}
}
debug 级别:error_log /var/log/angie/error.log debug; # 全局调试日志
http {
server {
listen 80;
server_name example.com;
error_log /var/log/angie/example.com.error.log debug;
# example.com 的调试日志已启用但写入单独的文件
# ...
}
}
记录特定地址#
error_log /path/to/log;
events {
debug_connection 192.168.1.1;
debug_connection 192.168.10.0/24;
}
循环内存缓冲区#
error_log memory:32m debug;
debug 级别写入内存缓冲区即使在高负载下也不会显著影响性能。在这种情况下,可以使用 GDB 脚本提取日志,例如:set $log = ngx_cycle->log
while $log->writer != ngx_log_memory_writer
set $log = $log->next
end
set $buf = (ngx_log_memory_buf_t *) $log->wdata
dump binary memory debug_log.txt $buf->start $buf->end
核心转储#
核心转储有助于调查崩溃。在 联系支持 时请包含它们。对于从 我们的仓库 构建的版本,我们在特殊包中提供调试符号。它们与原始包同名,但添加了 -dbg 后缀,例如 angie-dbg。
备注
本节假设您以 root 用户身份运行 Angie(推荐)。
Linux: systemd#
要在将 Angie 作为 systemd 服务运行时启用核心转储保存(例如,当 从包安装 时),请修改 /lib/systemd/system/angie.service 文件中的 服务设置:
[Service]
...
LimitCORE=infinity
LimitNOFILE=65535
或更新 /etc/systemd/system.conf 文件中的 全局设置:
[Manager]
...
DefaultLimitCORE=infinity
DefaultLimitNOFILE=65535
然后重新加载服务配置并重启 Angie 以重现崩溃条件:
$ sudo systemctl daemon-reload
$ sudo systemctl restart angie.service
崩溃后,查找核心转储文件:
$ sudo coredumpctl -1 # 可选
TIME PID UID GID SIG COREFILE EXE
--- 2026-10-13 11:05:40 GMT 1157 0 0 11 present /usr/sbin/angie
$ sudo ls -al /var/lib/systemd/coredump/ # 默认位置,另见 /etc/systemd/coredump.conf 和 /etc/systemd/coredump.conf.d/*.conf
...
-rw-r----- 1 root root 177662 Jul 27 11:05 core.angie.0.6135489c850b4fb4a74795ebbc1e382a.1157.1590577472000000.lz4
Linux: 手动配置#
本节适用于不通过 systemd 启动的 Angie,例如 从源代码构建 的 Angie,并假定以这种方式安装的 Angie 正在运行;命令中使用的是此类构建在 /usr/local/angie 下的默认路径。
内核把核心转储文件放在哪里,取决于 /proc/sys/kernel/core_pattern。如果该模式以 | 开头,内核会把转储交给 | 之后指定的程序(例如 systemd-coredump),即使对不通过 systemd 启动的 Angie 也是如此;此时请按 Linux: systemd 中的说明查找核心转储文件,并跳过下面与工作目录相关的步骤。如果该模式是 core 这样的普通名称,内核会把核心转储文件写入崩溃进程的工作目录;对工作进程来说,默认就是启动 Angie 时所在的目录。
工作进程以 user 指令设置的账户运行(采用默认选项从源代码构建时为 nobody);如果该账户无法写入工作目录,崩溃时就不会留下核心转储文件,因此请创建一个用于存放核心转储文件的目录:
$ sudo mkdir -p /var/tmp/angie-cores
$ sudo chown nobody /var/tmp/angie-cores
请在 /usr/local/angie/conf/angie.conf 的 main 上下文中,使用 working_directory 指令把刚创建的目录设为工作目录:
working_directory /var/tmp/angie-cores;
然后提高核心转储大小限制。若只想为工作进程提高该限制并避免重启,请再添加 worker_rlimit_core 指令(该指令的参数是大小,而不是 unlimited),并重新加载配置:
worker_rlimit_core 1g;
$ sudo /usr/local/angie/sbin/angie -s reload
若还要为主进程提高核心转储大小限制,请改为重启 Angie。默认情况下,sudo 启动命令时会把核心转储大小限制设为 0,而 ulimit 只会更改运行它的 shell 以及该 shell 所启动命令的限制。请停止正在运行的 Angie,等待 Angie 主进程退出,然后在同一个 root shell 中提高限制并启动 Angie:
$ sudo /usr/local/angie/sbin/angie -s quit
$ while [ -e /usr/local/angie/logs/angie.pid ]; do sleep 1; done
$ sudo sh -c 'ulimit -c unlimited && exec /usr/local/angie/sbin/angie'
若从源代码构建时使用 --with-debug 进行配置,则 /usr/local/angie/sbin/angie 本身就支持调试,没有单独的 angie-debug 可执行文件。
检查工作进程的限制;重启后,两个值都是 unlimited,而使用 worker_rlimit_core 时,它们显示的是所设置的大小(以字节为单位):
$ grep 'core file' /proc/$(pgrep -n -f 'angie: worker process')/limits
Max core file size unlimited unlimited bytes
然后重现崩溃。如果崩溃留下了核心转储文件,错误日志(默认为 /usr/local/angie/logs/error.log)会显示 worker process pid exited on signal number (core dumped);如果同一条消息中没有 (core dumped),则说明是核心转储大小限制或工作目录导致没有生成核心转储文件。请查找核心转储文件:
$ sudo ls -al /var/tmp/angie-cores
...
-rw------- 1 nobody nogroup 177662 Jul 27 11:05 core.1157
FreeBSD#
检查 /etc/sysctl.conf 文件中的 核心转储设置,必要时修改它们:
kern.coredump=1 # 应为 1
kern.corefile=/path/to/core/files/%N.core # 需要正确路径
或在运行时更新设置:
$ sudo sysctl kern.coredump=1
$ sudo sysctl kern.corefile=/path/to/core/files/%N.core
无论采用上述哪种方式,user 指令设置的账户都必须对 kern.corefile 中的目录有写权限:工作进程以该账户运行,并将各自的核心转储文件写入该目录。
然后重启 Angie 以重现崩溃条件。 如果 Angie 作为服务安装:
$ sudo service angie restart
如果 Angie 是手动安装的,请停止它,等待 Angie 主进程退出,然后在同一个 root shell 中提高核心转储大小限制并启动 Angie,与 Linux 上的做法相同:
$ sudo <Angie 安装目录路径>/sbin/angie -s quit
$ while [ -e <Angie 安装目录路径>/logs/angie.pid ]; do sleep 1; done
$ sudo sh -c 'ulimit -c unlimited && exec <Angie 安装目录路径>/sbin/angie'
崩溃后,查找核心转储文件:
$ sudo ls -al <核心转储文件路径>
...
-rw------- 1 nobody nobody 9912320 Jul 27 11:05 angie.core