NGINX功能强大,模块多,对复杂需求要正确配置或正确调优 ,是有一定难度的。因此,如何进行配置调试就很重要,特别是对于生产环境调试。本文主要提供调试方法或技巧,对于配置调试Nginx非常又帮助。
目录
在线调试步骤
如何用好日志
日志配置
非调试级别日志
不匹配测试
匹配测试
调试级别日志
不匹配测试
匹配测试
指定客户端调试
如何使用debug_connection
配置指定客户端
不匹配测试
匹配测试
最佳实践
利用curl工具
巧用return
巧用响应头
在线调试步骤
1、 备份当前配置文件;
2、 配置调试;
3、 检查命令:;
nginx -t 测试 NGINX 配置。
nginx -T 测试 NGINX 配置并将验证后的配置打印到屏幕上。此命令在寻求支持时很有用。
4、 不中断加载配置命令:;
nginx -s reload
5、 观察如果出现较大问题,就先备份新配置,然后恢复旧配置重加载,接下来分析配置改动带来问题原因;
如何用好日志
用好日志是研发和运维人员的基本功。Nginx提供了强大的日志功能(用法详见精通Nginx(06)-日志)。
日志配置
1、 错误日志开启到debug级别(注意:如果Nginx是编译安装的,注意检查编译参数是否带--with-debug);
2、 访问日志根据调试对象设置格式;
3、 调试rewrite,开启rewrite_log,开启指令:rewrite_logon;;
4、 针对特定的服务器,在server{...}单独定义访问及错误日志文件;
非调试级别日志
有如下配置:
error_log /var/log/nginx/error.log error;
http{
server {
listen 80;
rewrite_log on;
location /download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
location / {
root /usr/share/nginx/trialroot;
index index.html;
}
}
}
如果不开启debug级别日志,用error级别日志。
不匹配测试
用如下实际不匹配的命令测试:
curl -I http://127.0.0.1/download/media/a1.mp3
控制台返回如下:
error日志无输出(虽然rewrite不匹配,但无错误)。
匹配测试
用如下命令测试:
curl -I http://127.0.0.1/download/a/media/a1.mp3
控制台返回如下:
error日志输出((虽然rewrite匹配,但有错误发生):
调试级别日志
配置调整如下:
error_log /var/log/nginx/error.log debug;
重新加载:
nginx -s reload
测试error日志输出如下:
2023/11/16 10:02:00 [notice] 17969#17969: signal process started
# 打印当前请求处理模式
2023/11/16 10:02:00 [notice] 15995#15995: using the "epoll" event method
# 打印工作进程号
2023/11/16 10:02:00 [notice] 15995#15995: start worker processes
2023/11/16 10:02:00 [notice] 15995#15995: start worker process 17970
# 配置了缓存,启用了缓存管理器
2023/11/16 10:02:00 [notice] 15995#15995: start cache manager process 17971
# 内部信号控制
2023/11/16 10:02:01 [notice] 15995#15995: signal 17 (SIGCHLD) received from 17898
2023/11/16 10:02:01 [notice] 15995#15995: worker process 17898 exited with code 0
2023/11/16 10:02:01 [notice] 15995#15995: signal 29 (SIGIO) received
2023/11/16 10:02:01 [notice] 15995#15995: signal 17 (SIGCHLD) received from 17899
2023/11/16 10:02:01 [notice] 15995#15995: cache manager process 17899 exited with code 0
2023/11/16 10:02:01 [notice] 15995#15995: signal 29 (SIGIO) received
不匹配测试
用如下实际不匹配的命令测试:
curl -I http://127.0.0.1/download/media/a1.mp3
控制台返回同非调试级别一样。
error日志输出如下:
显然输出了不匹配信息。
匹配测试
用如下命令测试:
curl -I http://127.0.0.1/download/a/media/a1.mp3
控制台返回同非调试级别一样。
error日志输出如下:
输出了匹配信息 ,也输出了错误信息。
指定客户端调试
开启对特定连接的调试,用于测试客户端连接非常有效。用debug_connection 指令开启(详见精通Nginx(04)-核心指令)。注意:debug_connection 会自动在指定连接上开启debug级别日志,其它连接错误日志为error_log。如果开启了error_log为debug,可先关闭,这样可以集中在特定连接上。这可帮助调试生产问题,并避免因调试所有连接而降低性能。
如何使用debug_connection
Nginx默认不支持debug_connection指令。使用方式:
1、 如果是yum安装版,需用如下命令切换到调试版:;
# 停止非调试版
service nginx stop
# 启用调试版
service nginx-debug start
2、 如果是编译版,需带"--with-debug"编译;
调试版启动后,输出信息很多(会不停输出),部分截图如下:
配置指定客户端
配置如下:
# 如果用指定客户端调试模式,错误日志级别设置为error为好;如果设置debug,会输出大量信息
error_log /var/log/nginx/error.log error;
events {
worker_connections 1024;
调试指定客户端:为选定的客户端连接启用调试日志。其他连接将使用error_log指令设置的日志记录级别
debug_connection 127.0.0.1;
debug_connection 192.168.1.168;
}
不匹配测试
用如下实际不匹配的命令测试:
curl -I http://127.0.0.1/download/media/a1.mp3
控制台返回同非调试级别一样。
error日志输出如下:
匹配测试
用如下命令测试:
curl -I http://127.0.0.1/download/a/media/a1.mp3
控制台返回同非调试级别一样。
error日志输出如下:
上图详细展示rewrite过程,由于rewrite用"/download/"匹配,结果又含有" /download/",rewrite实际执行了10次。
如果用非127.0.0.1发出命令测试,错误日志不会输出信息,除非发生错误(如rewrite后,结果网页不存在)。
最佳实践
1、 用nginx-debug可查看Nginx指令详细工作过程,非常有助于学习nginx;
2、 用nginx-debug(或编译带选项),如果错误日志用debug级别,会输出大量信息;因此通常把错误日志设置为error级别,然后指定客户端来进行调试;
利用curl工具
利用curl命令在客户端发起请求。
格式: curl [option] url
curl url :默认会发送 GET 请求来获取链接内容到标准输出
option参数意义:
-I(i大写i) :发送 GET 请求,显示 响应头信息,但不显示文件内容
-i :发送 GET 请求,显示 响应头信息,且显示文件内容
-H:发送自定义head头信息
-d: 发送数据
-xPOST:post方式提交
-cfile:保存cookie到文件
简单示例如下:
# 访问baidu
curl https://www.baidu.com
# 只显示响应头信息
curl -I https://www.baidu.com
# 自定义头信息
curl -H "Referer: www.example.com" -H "User-Agent: Custom-User-Agent" http://www.baidu.com
# POST方式提交,带需要数据
curl -d "userName=jack&passwd=123456" -X POST http://www.example.com/login
# 保存cookie
curl -c "cookie-example" http://www.example.com
巧用return
调试rewrite时,可用return指令来明确nginx到达位置。实例如下:
server {
测试看return效果
listen 8000 default_server;
location = / {
return 901;
}
location / {
return 902;
}
location /a/ {
return 903;
}
location /a/b/ {
return 904;
}
}
用curl -I非常方便查看。上述示例查看如下:
###### 901#
# 只有ip+端口(域名)
[root@ddkk.com nginx]# curl -I http://127.0.0.1:8000
HTTP/1.1 901
Server: nginx/1.24.0
Date: Thu, 16 Nov 2023 01:26:06 GMT
Content-Length: 0
Connection: keep-alive
# ip+端口+"/"
[root@ddkk.com nginx]# curl -I http://127.0.0.1:8000/
HTTP/1.1 901
Server: nginx/1.24.0
Date: Thu, 16 Nov 2023 01:26:15 GMT
Content-Length: 0
Connection: keep-alive
###### 902#
# ip+端口+"/"+任何不匹配其它项
[root@ddkk.com nginx]# curl -I http://127.0.0.1:8000/index.html
HTTP/1.1 902
Server: nginx/1.24.0
Date: Thu, 16 Nov 2023 01:26:29 GMT
Content-Length: 0
Connection: keep-alive
# ip+端口+"/a",注意匹配项是"/a/",因此值匹配902
[root@ddkk.com nginx]# curl -I http://127.0.0.1:8000/a
HTTP/1.1 902
Server: nginx/1.24.0
Date: Thu, 16 Nov 2023 01:26:37 GMT
Content-Length: 0
Connection: keep-alive
###### 903#
# ip+端口+"/a/"+任何不匹配其它项
[root@ddkk.com nginx]# curl -I http://127.0.0.1:8000/a/
HTTP/1.1 903
Server: nginx/1.24.0
Date: Thu, 16 Nov 2023 01:27:00 GMT
Content-Length: 0
Connection: keep-alive
# ip+端口+"/a/b",不匹配"/a/b/"
[root@ddkk.com nginx]# curl -I http://127.0.0.1:8000/a/b
HTTP/1.1 903
Server: nginx/1.24.0
Date: Thu, 16 Nov 2023 01:27:04 GMT
Content-Length: 0
Connection: keep-alive
###### 903#
# ip+端口+"/a/b/"
[root@ddkk.com nginx]# curl -I http://127.0.0.1:8000/a/b/
HTTP/1.1 904
Server: nginx/1.24.0
Date: Thu, 16 Nov 2023 01:27:09 GMT
Content-Length: 0
Connection: keep-alive
巧用响应头
使用add_header,可在响应头增加相关变量或其它值,以便查看具体值。例如:
location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
...
添加响应头,主要用于调试(非必须)
add_header Nginx-Cache $upstream_cache_status;
add_header Nginx-Cache-Static-Key $scheme$proxy_host$request_uri;
}
显示结果如下:
这篇文章如果对您有所帮助或者启发的话,帮忙关注或点赞,有问题请评论,必有所复。您的支持是我写作的最大动力!