重写特定日志记录

重写特定日志记录

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

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

有什么方法可以看到 nginx 中实际加载的配置,或者记录对传入请求应用的重写规则?

答案1

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

重写特定日志记录

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

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

虚拟主机范围的调试

通过将 nginx 日志设置为debuglevel,您将获得有关 nginx 在处理请求和响应时所做的一切的极其详细的说明。它包含大量信息,但其中包含了您遇到的所有 nginx 问题的答案。

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

一旦完成了此更改,您将需要让 nginx 重新加载其配置(无需重新启动)。

例子:

现有的错误日志严重性为:

改变这个:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log info;
  [...]

对此:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log debug;

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

改变这个:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log;
  [...]

对此:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log debug;

没有现有的错误日志:

改变这个:

server {
  server_name foo.example.com;
  [...]

对此:

server {
  server_name foo.example.com;
  error_log /var/log/nginx/foo.example.com.error_log debug;

通过IP地址进行针对性调试

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

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

events {
  debug_connection 192.0.2.42;
}

将其替换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;
    [...]
  }
}

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

相关内容