如何测试 Nginx 配置并监控服务器状态

测试 Nginx 配置语法、安全重载、检查服务状态、查看日志以及验证实际的 HTTP 行为。

如何测试 Nginx 配置并监控服务器状态

了解如何测试 Nginx 配置并监控服务器状态,可以防止小错误演变成服务中断。缺少分号、证书路径错误或重复的服务器名称都可能导致重载失败,但 Nginx 提供了可靠的工具来及早发现问题。

在每次配置更改前后执行这些检查,尤其是在生产服务器上。

测试 Nginx 配置语法

首先要运行的命令是:

sudo nginx -t

此命令会验证加载的配置文件,并报告 Nginx 是否可以解析它们。成功的结果如下所示:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

如果测试失败,请不要重载。仔细阅读错误信息。Nginx 通常会包含文件路径和行号:

nginx: [emerg] unexpected "}" in /etc/nginx/sites-enabled/example.com:42

行号是起点,但不一定是完整的答案。真正的问题可能是在前面几行缺少分号或大括号。

在以下任何更改后使用此命令:

  • nginx.conf
  • conf.d 中的文件
  • sites-enabled 中的文件
  • TLS 证书路径
  • 代理上游定义
  • 包含的片段

要查看活动配置的完整视图,请运行:

sudo nginx -T

这会打印主文件和所有包含的文件。当你忘记某个文件中的指令时,这尤其有用。

测试通过后安全重载

一旦 sudo nginx -t 通过,重载 Nginx:

sudo systemctl reload nginx

重载通常比重启更安全。Nginx 会使用新配置启动新的工作进程,同时旧的工作进程完成现有请求。这意味着用户不太可能看到连接中断。

如果重载失败,请检查服务状态:

sudo systemctl status nginx

然后检查日志:

sudo journalctl -u nginx --since "10 minutes ago"

一个实用的工作流程如下:

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl status nginx

这个三步习惯可以捕获语法错误、应用更改并确认服务保持健康。

有关日常服务操作,请参阅 基本的 Nginx 服务控制命令

监控 Nginx 是否正在提供流量

服务状态告诉你 Nginx 是否正在运行。但它不能证明用户得到了正确的响应。同时检查进程和实际的 HTTP 行为。

确认服务处于活动状态:

systemctl is-active nginx

确认 Nginx 正在监听预期的端口:

sudo ss -ltnp | grep nginx

你应该看到监听在 80 端口、443 端口或配置中使用的任何自定义端口上。

然后在本地测试 HTTP 响应:

curl -I http://localhost

对于 HTTPS 和命名服务器块,请包含主机名:

curl -I https://example.com

如果 DNS 尚未指向服务器,你可以使用解析后的地址进行测试:

curl -I --resolve example.com:443:203.0.113.10 https://example.com

将 IP 替换为你的服务器地址。这允许你在公共 DNS 更改生效之前测试 Nginx 服务器块。

查看访问和错误日志

日志显示重载后 Nginx 正在做什么。两个常见的文件是:

/var/log/nginx/access.log
/var/log/nginx/error.log

实时跟踪错误日志:

sudo tail -f /var/log/nginx/error.log

实时跟踪访问日志:

sudo tail -f /var/log/nginx/access.log

访问日志告诉你哪些请求正在进入以及 Nginx 返回的状态码。错误日志告诉你有关上游连接失败、文件缺失、权限问题、请求体限制、TLS 问题以及与配置相关的运行时警告。

寻找模式,而不仅仅是单行:

  • 许多 404 响应可能意味着错误的根目录或位置块。
  • 许多 502 响应可能意味着上游应用程序已关闭。
  • 许多 499 响应可能意味着客户端在响应完成之前放弃。
  • 重复的权限错误可能意味着文件所有权或目录执行位设置错误。
  • TLS 握手错误可能意味着证书或协议不匹配。

如果你托管多个域名,请为每个服务器块配置单独的日志。这可以使监控更清晰,并加快事件响应速度。

启用基本的 Nginx 状态检查

Nginx 在许多构建中包含一个轻量级的状态模块。如果可用,你可以公开一个仅限本地的状态端点:

server {
    listen 127.0.0.1:8080;

    location /nginx_status {
        stub_status;
        allow 127.0.0.1;
        deny all;
    }
}

然后从服务器查询它:

curl http://127.0.0.1:8080/nginx_status

这可以显示活动连接和请求计数器。保持此端点私有。除非受到适当的网络控制保护,否则不要公开暴露它。

对于生产监控,将 Nginx 指标和日志连接到你的常规可观测性堆栈。基本检查很有用,但仪表板和警报更适合在你不在时发现问题。

测试真实场景,而不仅仅是语法

即使行为错误,语法检查也可能通过。更改后,测试你修改的特定路径或域名。

如果你更改了重定向,请测试旧 URL 和新 URL:

curl -I http://example.com/old-path

如果你更改了代理设置,请测试 API 路由:

curl -i https://api.example.com/health

如果你更改了静态文件处理,请请求一个真实的资源:

curl -I https://example.com/assets/app.css

这是一个常见场景:你添加了一个新的单页应用程序,并且 nginx -t 通过了。首页可以工作,但刷新 /dashboard 返回 404。这不是语法问题。这通常意味着你的位置块需要一个回退,例如 try_files $uri $uri/ /index.html;

何时寻求专业帮助

当重载失败影响生产时,当状态检查与用户报告不一致时,或者当错误同时涉及上游超时、TLS 故障、负载均衡器和 CDN 行为时,请向 DevOps 工程师或 Nginx 专家寻求帮助。

如果你看到重复崩溃、无法解释的工作进程退出,或者在回滚最后一次配置更改后错误仍然存在,你也应该升级问题。问题可能出在 Nginx 之外,例如系统限制、应用程序故障或网络路由。

在每次重载前测试语法,在每次更改后监控状态,并验证用户依赖的实际 URL 行为。这个简单的纪律可以在大多数 Nginx 配置问题变成公共事件之前捕获它们。