加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > Nginx > 正文

如何查看正在应用于请求的nginx重写规则?

发布时间:2020-12-13 21:23:14 所属栏目:Nginx 来源:网络整理
导读:我正在尝试调试为什么某些重写规则不能在我的登台服务器上运行,即使它们在我的虚拟机上运行. 似乎当我重新启动nginx时,它根本没有看到我的更改. 有没有办法可以看到nginx中实际加载的confs是什么,或者记录对传入请求应用了哪些重写规则? 最佳答案 您可以使

我正在尝试调试为什么某些重写规则不能在我的登台服务器上运行,即使它们在我的虚拟机上运行.

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

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

最佳答案
您可以使用几种策略来调试nginx请求和响应处理.

特定于重写的日志记录

如果在服务器块中启用rewrite_log directive,然后重新加载nginx配置,您将获得一大堆信息(通知严重性),了解nginx在重写时对您的请求做了什么.

但是,如果您需要深入研究,则可以在更广泛的层面上启用调试.

虚拟主机广泛调试

通过将nginx日志记录设置为调试级别,您将获得nginx在处理请求和响应时所执行的所有操作的非常详细的帐户.这是很多信息,但你对nginx的每个问题的答案都包含在其中.

获取调试日志记录的最简单方法是在您要诊断要调试的服务器块的error_log指令上设置严重性.替换可能存在的任何现有严重性关键字,如信息或警告.如果特定服务器块没有error_log指令,则应添加一个(因为将服务器范围的error_log更改为debug将导致大量噪声.

完成此更改后,您需要使nginx重新加载其配置(无需重新启动).

例子:

现有error_log的严重性:

改变这个:

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;

没有现有的error_log:

改变这个:

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 {
  debug_connection 192.0.2.42;
}

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

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

激光制导调试

如果您决定只调试给定位置块中的请求,则可以在该块中添加error_log指令,这样您就可以将调试日志写入单独的位置.像这样的东西可以解决这个问题:

server {
  server_name foo.example.com;

  location ~ ^/somewhere/.*.php {
    error_log /tmp/somewhere_php.log debug;
    [...]
  }
}

现在你可以重新加载nginx,发出请求,然后在/tmp/somewhere_php.log中查看所有的血腥细节.只需记住在完成后再次删除指令,否则你可能会在相当短的时间内填满/ tmp分区.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读