我试图debugging为什么一些重写规则不能在我的登台服务器上工作,即使他们在我的虚拟机上工作。
好像当我重新启动nginx时,它根本没有看到我的更改。
有没有办法,我可以看到实际加载的conf是在nginx中,还是logging什么重写规则正在应用到传入的请求?
有几种策略可用于debuggingnginx请求和响应处理。
如果在server块中启用了rewrite_log指令 ,然后重新加载nginxconfiguration,则会得到一大堆信息( notice严重性),nginx在请求重写时正在处理什么。
如果您需要深入研究,则可以在更广泛的层面上启用debugging。
通过将nginx日志logging设置为debug级别,您将获得nginx在处理请求和响应时执行的所有操作的非常详细的信息。 这是一个很多的信息,但是你对nginx的每个问题的答案都包含在其中。
获取debugging日志的最简单方法是在要诊断debug的server块的error_log指令中设置严重性。 replace可能存在的任何现有严重性关键字,例如info或warn 。 如果特定server块没有error_log指令,则应该添加一个(因为将服务器范围的error_log更改为debug将会导致很大的噪音。
一旦你做了这个改变,你需要让nginx重新加载它的configuration(不需要重启)。
例子:
改变这个:
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;
改变这个:
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;
如果你正在运行一个繁忙的站点,甚至打开单个虚拟主机的debugging,可能会导致严重的性能下降(写大量的日志到磁盘会降低速度),你将会有太多不相干的debugging信息,你永远不会搞清楚发生了什么。
在这种情况下, 只能对来自特定IP地址(例如正在testing的计算机)的请求启用debugging。 为此,您要编辑主要的nginxconfiguration文件(比如/etc/nginx/nginx.conf ),findevents部分,并使其看起来像这样:
events { debug_connection 192.0.2.42; }
将nginx将会看到的IP地址replace为192.0.2.42 (因此,可能是您的NAT网关的公有IP地址,或您的代理,而不是您的工作站的IP)。 重新加载nginx。
您现在将获得来自该IP的所有连接的debugging日志(并且只有该IP)。 如果您需要debugging来自多个位置的请求,则可以多次重复debug_connection指令,或者指定一个CIDR样式的networking掩码来覆盖整个IP块。
如果您决定只需debugging给定location块中的请求,则可以在该块中添加一个error_log指令,因此可以将debugging日志写入单独的位置。 像这样的事情会做的伎俩:
server { server_name foo.example.com; location ~ ^/somewhere/.*\.php { error_log /tmp/somewhere_php.log debug; [...] } }
现在您可以重新加载nginx,发出请求,并在/tmp/somewhere_php.log查看所有血腥详细信息。 只要记得在完成时再次删除指令,否则可能会以相当短的时间填满你的/tmp分区。