我正在尝试调试为什么某些重写规则在我的暂存服务器上不起作用,即使它们在我的虚拟机上运行。
似乎当我重新启动 nginx 时,它根本看不到我的更改。
有什么方法可以看到 nginx 中实际加载的配置,或者记录对传入请求应用的重写规则?
答案1
您可以使用多种策略来调试 nginx 请求和响应处理。
重写特定日志记录
如果您启用rewrite_log
指示在一个server
块中,然后重新加载 nginx 配置,您将获得一大堆信息(严重性notice
),关于 nginx 在重写您的请求时到底做了什么。
但是,如果您需要更深入地了解,您可以在更广泛的层面上启用调试。
虚拟主机范围的调试
通过将 nginx 日志设置为debug
level,您将获得有关 nginx 在处理请求和响应时所做的一切的极其详细的说明。它包含大量信息,但其中包含了您遇到的所有 nginx 问题的答案。
获取调试日志的最简单方法是将要诊断的块error_log
的指令的严重性设置为。替换可能存在的任何现有严重性关键字,如或。如果特定块没有指令,则应添加一个(因为将服务器范围的更改为将导致server
debug
info
warn
server
error_log
error_log
debug
很多噪音。
一旦完成了此更改,您将需要让 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
很快填满您的分区。