Debugging

使用自定义日志格式

您可以在 Nginx 配置中作为变量访问的任何内容都可以记录,包括非标准的 HTTP 标头等。因此,这是一种针对特定情况创建自己的日志格式的简单方法。

这对于调试特定的 location 指令非常有帮助。

示例:

  1. ## Default main log format from the Nginx repository:
  2. log_format main
  3. '$remote_addr - $remote_user [$time_local] "$request" '
  4. '$status $body_bytes_sent "$http_referer" '
  5. '"$http_user_agent" "$http_x_forwarded_for"';
  6. ## Extended main log format:
  7. log_format main-level-0
  8. '$remote_addr - $remote_user [$time_local] '
  9. '"$request_method $scheme://$host$request_uri '
  10. '$server_protocol" $status $body_bytes_sent '
  11. '"$http_referer" "$http_user_agent" '
  12. '$request_time';
  13. ## Debug log formats:
  14. log_format debug-level-0
  15. '$remote_addr - $remote_user [$time_local] '
  16. '"$request_method $scheme://$host$request_uri '
  17. '$server_protocol" $status $body_bytes_sent '
  18. '$request_id $pid $msec $request_time '
  19. '$upstream_connect_time $upstream_header_time '
  20. '$upstream_response_time "$request_filename" '
  21. '$request_completion';

使用调试模式来跟踪意外行为

通常,error_log 指令是在 main 中指定的,但是也可以在 serverlocation 块中指定,全局设置将被覆盖,并且这个 error_log 指令将设置其自己的日志文件路径和日志记录级别。

如果要记录 ngx_http_rewrite_module (at the notice level) ,应该在 httpserverlocation 块中开启 rewrite_log on;

注意:

  • 永远不要将调试日志记录留在生产环境中的文件上
  • 不要忘记在流量非常高的站点上恢复 error_log 的调试级别
  • 必须使用日志回滚政策

示例:

  • 将 debug 信息写入文件
  1. ## Turn on in a specific context, e.g.:
  2. ## - global - for global logging
  3. ## - http - for http and all locations logging
  4. ## - location - for specific location
  5. error_log /var/log/nginx/error-debug.log debug;
  • 将 debug 信息写入内存
  1. error_log memory:32m debug;
  • IP 地址/范围的调试日志:
  1. events {
  2. debug_connection 192.168.252.15/32;
  3. debug_connection 10.10.10.0/24;
  4. }
  • 为不同服务器设置不同 Debug 配置
  1. error_log /var/log/nginx/debug.log debug;
  2. ...
  3. http {
  4. server {
  5. ## To enable debugging:
  6. error_log /var/log/nginx/domain.com/domain.com-debug.log debug;
  7. ## To disable debugging:
  8. error_log /var/log/nginx/domain.com/domain.com-debug.log;
  9. ...
  10. }
  11. }

核心转储

核心转储基本上是程序崩溃时内存的快照。

Nginx 是一个非常稳定的守护程序,但是有时可能会发生正在运行的 Nginx 进程独特终止的情况。

如果要保存内存转储,它可以确保应启用两个重要的指令,但是,为了正确处理内存转储,需要做一些事情。 有关它的完整信息,请参见转储进程的内存(来自本手册)。

当您的 Nginx 实例收到意外错误或崩溃时,应始终启用核心转储。

示例:

  1. worker_rlimit_core 500m;
  2. worker_rlimit_nofile 65535;
  3. working_directory /var/dump/nginx;