我正在尝试调试为什么某些重写规则不能在我的登台服务器上运行,即使它们在我的虚拟机上运行.
似乎当我重新启动Nginx时,它根本没有看到我的更改.
有没有办法可以看到Nginx中实际加载的confs是什么,或者记录对传入请求应用了哪些重写规则?
特定于重写的日志记录
如果在服务器块中启用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分区.