我正在尝试调试为什么某些重写规则在我的登台服务器上不起作用,即使它们在我的虚拟机上起作用。
似乎当我重新启动 nginx 时,它根本没有看到我的更改。
有没有办法可以看到 nginx 中实际加载的 confs 是什么,或者记录哪些重写规则应用于传入的请求?
wom*_*ble 13
您可以使用多种策略来调试 nginx 请求和响应处理。
如果您在一个块中启用该rewrite_log
指令server
,然后重新加载 nginx 配置,您将获得一大堆信息(在notice
严重性上),关于 nginx 在您的请求被重写时究竟在做什么。
但是,如果您需要更深入地了解,则可以在更广泛的级别上启用调试。
通过将 nginx 日志设置为debug
级别,您将获得有关 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;
[...]
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;
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 地址(例如您正在测试的机器)的请求启用调试。为此,您要编辑主要的 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
在相当短的时间内填满您的分区。
归档时间: |
|
查看次数: |
7885 次 |
最近记录: |