Nginx 日志打印十六进制 \x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03P\xBB

问题描述

nginx 日志"$request"字段以后,打印全是十六进制输出

    log_format  main  $remote_addr - $remote_user [$time_local] "$request" 
                      $status $body_bytes_sent "$http_referer" 
                      "$http_user_agent" "$http_x_forwarded_for";

Nginx 日志打印十六进制 \x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03P\xBB

 

 

解决办法

启用SSl支持

 

# 不同版本(nginx -v查看)的Nginx启用ssl的配置不一样!!
# 版本1.15.0及以下
listen 443;
ssl on;
 
# 版本1.15.0以上
listen 443 ssl;

分析

对比一下http、https访问连接服务器过程:

http:  TCP三次握手——发送请求数据——后台处理——返回结果

https: TCP三次握手——客户端发起https认证请求(第一步由client发送hello报文并带上相关信息)...

Nginx 日志打印十六进制 \x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03P\xBB

 

 

结论

在Nginx没有开启SSL支持的情况下,Nginx将https连接建立过程中的客户端hello报文当作http报文处理,暴力的截取了报文中指定位置的十六进制字符串当作了$request的http请求方法、URL和版本号,所以access日志中会出现十六进制字符串。

 

备注:

那为什么access日志中4个请求的$request开头部分是一致的,后面部分又不一致了呢?分析hello报文格式就知道了!

 

Nginx 日志打印十六进制 \x16\x03\x01\x02\x00\x01\x00\x01\xFC\x03\x03P\xBB

上一篇:避免回调地狱


下一篇:变量和结构赋值