OpenResty日志调试与性能优化教程
OpenResty接入业务后,需要通过日志了解请求情况、定位Lua报错,并分析接口响应缓慢的原因。做好日志配置、超时控制和连接复用,有助于提高排查效率,减少不必要的资源消耗。
一、查看访问日志与错误日志
查看访问日志。
tail -f /usr/local/openresty/nginx/logs/access.log
查看错误日志。
tail -f /usr/local/openresty/nginx/logs/error.log
两类日志的用途有所不同。
- access.log主要用于查看请求记录。
- error.log主要用于检查配置错误、Lua报错和运行异常。
排查问题时,可以结合请求发生的时间,对照查看两类日志。
二、在Lua代码中输出日志
需要检查变量或请求信息时,可以使用ngx.log记录日志。
ngx.log(ngx.ERR, "debug user=", user_id, " uri=", ngx.var.request_uri)
该示例记录用户标识和请求地址,便于结合具体请求定位问题。 调试时应控制日志输出量,避免在高并发接口中持续打印大量错误级别日志。
三、自定义访问日志格式
为了分析接口耗时,可以在访问日志中增加请求处理时间、上游响应时间和请求标识等字段。
log_format main '$remote_addr $request $status $body_bytes_sent $request_time $upstream_response_time $http_x_request_id';
access_log logs/access.log main;
其中,$request_time和$upstream_response_time可用于辅助分析慢请求,$http_x_request_id用于记录请求头中的请求标识,方便关联排查。
四、检查并重载配置
修改配置后,先执行语法检查。
sudo /usr/local/openresty/nginx/sbin/nginx -t
确认检查通过,再重载配置。
sudo /usr/local/openresty/nginx/sbin/nginx -s reload
如果检查失败,应先根据输出中的文件路径和行号修正问题,不要直接继续重载。
五、性能优化建议
1. 为外部调用设置超时
访问Redis、MySQL或HTTP服务时,都应设置合理的超时时间,避免请求长时间等待。
2. 缓存高频访问数据
适合缓存的高频数据,可以放入lua_shared_dict,减少重复查询和外部服务调用。
3. 使用连接复用
访问外部服务后,合理使用keepalive复用连接,减少反复建立连接的开销。
4. 控制日志输出量
高并发接口应避免打印大量错误级别日志。临时调试结束后,及时清理不再需要的日志输出。
5. 保持接入层职责清晰
复杂业务逻辑尽量交给后端服务处理,OpenResty层主要负责接入处理,避免承载过多业务计算。
六、常见问题排查思路
- 请求返回500,先查看
error.log,检查是否存在Lua报错或运行异常。 - 接口响应缓慢,关注访问日志中的
request_time和upstream_response_time,结合错误日志继续排查。 - 配置重载失败,重新执行
nginx -t,根据输出中的文件路径和行号定位问题。 - 磁盘占用增长过快,检查
access.log和error.log的大小,确认是否需要配置日志轮转。