Tominysun

前言

当我们的Nginx使用了CDN以后,获取到的IP就不再是真实访客IP了,这是原始的访问日志记录就会出现问题.
此时就需要设置替换,根据cdn提供的HTTP请求头里的内容重写到日志中即可.

Apache

emmm...目前我主要使用nginx,等用到以后再补充教程吧!

Nginx

宝塔面板用户可跳过,直接跳到 宝塔面板 这一小节.

方法一

修改 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf 文件,添加在 http 字段中:

log_format access '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" ';

然后再修改当前站点/usr/local/nginx/conf/vhost/你的站点配置.conf 日志记录后加上 access

access_log /www/wwwlogs/你的站点配置.log access;

重启 Nginx,OK

service nginx reload

这个方法兼容性不好,下面的方法二可以兼容套CDN和没套CDN一起使用。

方法二

修改 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf 文件,添加在 http 字段中:

map $HTTP_CF_CONNECTING_IP  $clientRealIp {
    ""    $remote_addr;
    ~^(?P<firstAddr>[0-9.]+),?.*$    $firstAddr;
}
log_format  access  '$clientRealIp [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '$http_user_agent $remote_addr $request_time';

主要是为了通用性,如果关闭了CDN,可以不需要修改获取IP的方式,所以才这么修改,不然直接用$HTTP_CF_CONNECTING_IP就行了(这个时候就不需要在日志格式里使用$clientRealIp

然后在网站记录的日志定义使用access这个日志格式

比如

access_log /home/wwwlogs/abc.com.log main;

重启 Nginx,OK

service nginx reload

补充

上述代码均不兼容IPv6!
兼容代码如下:

map $HTTP_CF_CONNECTING_IP $clientRealIp {
        ""  $remote_addr;
        ~^(?P<firstAddr>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+:[0-9A-Fa-f]+),?.*$ $firstAddr;
    }

宝塔面板

直接启用 nginx免费防火墙 - cdn - 打开即可.(无需上述一切操作!)
据反馈,貌似不兼容IPv6.仍有待改进.


2023-01-31更新

set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;

nginx配置的http {...}中添加上述内容即可。

鸣谢

添加新评论