nginx自定义日志获取CDN真实IP,使用简单语句获取日志常用信息

nginx自定义日志获取CDN真实IP,使用简单语句获取日志常用信息

1.使用网宿的CDN

需要获取用户的真实IP,但是$remote_addr使用获取的是CDN的地址。

修改nginx的配置:

log_format  main_zdy  '$request_time - IP:$remote_addr - RealIP:$HTTP_CDN_SRC_IP - [$time_local] $request - $status - $http_user_agent';

在站点配置文件中添加:

access_log /data/logs/www.funet8.com-access.log main_zdy;

生成的文件格式:

0.192 - IP:xxx.xxx.227.107 - RealIP:xxx.xxx.250.173 - [19/Jul/2016:11:02:42 +0800] GET /play/gid/xxx HTTP/1.1 - 200 - Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)

网宿CDN帮助文档:
https://si.chinanetcenter.com/purview/help/FAQ.html?menuCode=other#41

24.使用CDN加速后如何获取最终用户IP?
源站可通过CDN回源请求header的特定字段获取最终用户IP。
CDN支持两种字段获取:
1、 默认配置通过Cdn-Src-Ip字段获取。例:
GET / HTTP/1.1
Host: www.abc.com
User-Agent: testagent
Cdn-Src-Ip:1.1.1.1
2、 可配置通过X-fowarded-for字段获取。例:
GET / HTTP/1.0
Host: www.abc.com
User-Agent: testagent
X-fowarded-for:1.1.1.1
若用我司提供的CDN-SRC-IP方式则可根据贵司网站编写的脚本语言自行选择下列代码(注意:以下代码需要在切换后才能正式生效,如未切换则可能导致获取IP错误)。
Php:
$user_IP = ($_SERVER["HTTP_CDN_SRC_IP"],1);
Asp:
<% Request.ServerVariables("HTTP_Cdn-Src-Ip") %>
Java:
String srcIp = request.getHeader("Cdn-Src-Ip",1);
Asp(用C#):
String srcIp = Request.Headers["Cdn-Src-Ip"];
Asp.net:
如贵司用ServerVariables来获取参数,因为ServerVariables有编码解码的过程,因此应该用HTTP_Cdn_Src_Ip来获取变量,如:
result = HttpContext.Current.Request.ServerVariables["HTTP_Cdn_Src_Ip"];


2.使用的是阿里云CDN

使用$http_x_forwarded_for这个变量获取用户真实IP

log_format  main_aliyun  '$request_time - IP:$remote_addr - RealIP:$http_x_forwarded_for - [$time_local] $request - $status - $http_user_agent';

在站点配置文件中添加:

access_log /data/logs/www.funet8.com-access.log main_aliyun; 

生成的nginx日志文件格式:
0.078 - IP:xxx.xxx.128.65 - RealIP:xxx.xxx.103.185 - [19/Jul/2016:11:18:45 +0800] GET /game?appid=60 HTTP/1.1 - 200 - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586

阿里云CDN帮助文档
https://help.aliyun.com/knowledge_detail/40074.html

3.使用语句获取信息


1.获取真实用户的IP

cat /data/logs/www.funet8.com-access.log |awk '{print $5}'| awk -F":" '{print $NF}' |sort|uniq -c|sort -nr|head -10

2.获取CDN的ip或者绑定hosts的ip

cat /data/logs/www.funet8.com-access.log |awk '{print $3}'| awk -F":" '{print $NF}' |sort|uniq -c|sort -nr|head -10

3.输出404url地址到/root/404page.txt

awk '($9 ~/404/)' /data/wwwroot/log/www.7477.com-error.log | awk '{print $9,$7}' | sort > /root/404page.txt
cat /data/logs/www.funet8.com-error.log |grep 'No such file or directory' | awk '{print $7,$16,$21}' |uniq -c |sort -nr >/root/404url.txt

4.访问次数最多的时间段

awk '{print  $7}' /data/logs/www.funet8.com-access.log|cut -c 14-18|sort|uniq -c|sort -nr|head -n 10

5.查看访问排行前10的url

cat /data/logs/www.funet8.com-access.log | awk '{print $10}' | sort | uniq -c | sort -nr | head -n 10

6.查看某天访问排行前10的url:

cat /data/logs/www.funet8.com-access.log | grep "10/Dec/2010" | awk '{print $10}' | sort | uniq -c | sort -nr | head -n 10

7.查看访问日志执行时间最长的前10条的记录

cat /data/logs/www.funet8.com-access.log | sort -nr | head -n 10

未经允许不得转载:好玩吧 » nginx自定义日志获取CDN真实IP,使用简单语句获取日志常用信息