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"';

解决办法
启用SSl支持
# 不同版本(nginx -v查看)的Nginx启用ssl的配置不一样!! # 版本1.15.0及以下 listen 443; ssl on; # 版本1.15.0以上 listen 443 ssl;
listen 9898 ssl;
server_name sp.chinaetek.com;
ssl_certificate ssl/chinaetek.com.crt;
ssl_certificate_key ssl/chinaetek.com.key;
ssl_session_timeout 30m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
分析
对比一下http、https访问连接服务器过程:
http: TCP三次握手——发送请求数据——后台处理——返回结果
https: TCP三次握手——客户端发起https认证请求(第一步由client发送hello报文并带上相关信息)...

结论
在Nginx没有开启SSL支持的情况下,Nginx将https连接建立过程中的客户端hello报文当作http报文处理,暴力的截取了报文中指定位置的十六进制字符串当作了$request的http请求方法、URL和版本号,所以access日志中会出现十六进制字符串。
备注:
那为什么access日志中4个请求的$request开头部分是一致的,后面部分又不一致了呢?分析hello报文格式就知道了!
本文来自博客园, 作者:Star-Hitian, 转载请注明原文链接:https://www.cnblogs.com/Star-Haitian/p/14981070.html

浙公网安备 33010602011771号