如何查看对请求应用了哪些 nginx 重写规则?

Agm*_*her 8 nginx centos

我正在尝试调试为什么某些重写规则在我的登台服务器上不起作用,即使它们在我的虚拟机上起作用。

似乎当我重新启动 nginx 时,它根本没有看到我的更改。

有没有办法可以看到 nginx 中实际加载的 confs 是什么,或者记录哪些重写规则应用于传入的请求?

wom*_*ble 13

您可以使用多种策略来调试 nginx 请求和响应处理。

重写特定的日志记录

如果您在一个块中启用该rewrite_log指令server,然后重新加载 nginx 配置,您将获得一大堆信息(在notice严重性上),关于 nginx 在您的请求被重写时究竟在做什么。

但是,如果您需要更深入地了解,则可以在更广泛的级别上启用调试。

虚拟主机范围的调试

通过将 nginx 日志设置为debug级别,您将获得有关 nginx 在处理请求和响应时所做的一切的极其详细的说明。这是很多信息,但是您在 nginx 中遇到的每个问题的答案都包含在其中。

获取调试日志的最简单方法是为要诊断error_logserver块的指令设置严重性debug。替换可能存在的任何现有严重性关键字,例如infowarn。如果特定server块没有error_log指令,您应该添加一个(因为将服务器范围更改error_logdebug会导致大量噪音。

进行此更改后,您需要使 nginx 重新加载其配置(无需重新启动)。

例子:

具有严重性的现有 error_log:

改变这个:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log info;
  [...]
Run Code Online (Sandbox Code Playgroud)

对此:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log debug;
Run Code Online (Sandbox Code Playgroud)

现有的 error_log,没有现有的严重性:

改变这个:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log;
  [...]
Run Code Online (Sandbox Code Playgroud)

对此:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log debug;
Run Code Online (Sandbox Code Playgroud)

没有现有的错误日志:

改变这个:

server {
  server_name foo.example.com;
  [...]
Run Code Online (Sandbox Code Playgroud)

对此:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log debug;
Run Code Online (Sandbox Code Playgroud)

通过IP地址定向调试

如果您正在运行一个繁忙的站点,即使打开单个虚拟主机的调试也可能会导致严重的性能下降(将大量日志写入磁盘会减慢速度),并且您将有很多不相关的调试杂物需要处理,你永远不会弄清楚发生了什么。

在这种情况下,您可以仅对来自特定 IP 地址(例如您正在测试的机器)的请求启用调试。为此,您要编辑主要的 nginx 配置文件(例如,/etc/nginx/nginx.conf),找到该events部分,并使其看起来像这样:

events {
  debug_connection 192.0.2.42;
}
Run Code Online (Sandbox Code Playgroud)

替换192.0.2.42为 nginx 将看到的 IP 地址(因此,可能是您的 NAT 网关或代理的公共 IP 地址,而不是您工作站的 IP)。重新加载nginx。

您现在将获得来自该 IP(并且该 IP)的所有连接的调试日志。如果您需要调试来自多个位置的请求,您可以debug_connection多次重复该指令,或者指定一个 CIDR 样式的网络掩码来覆盖整个 IP 块。

激光制导调试

如果您决定需要调试给定location块中的请求,则可以error_log在该块中添加指令,这样您就可以将调试日志写入单独的位置。像这样的事情可以解决问题:

server {
  server_name foo.example.com;

  location ~ ^/somewhere/.*\.php {
    error_log /tmp/somewhere_php.log debug;
    [...]
  }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以重新加载 nginx,发出请求,然后查看/tmp/somewhere_php.log所有详细信息。请记住在完成后再次删除该指令,否则您可能会/tmp在相当短的时间内填满您的分区。