YOLO813

Cloudflare(2) - 一些使用说明

    使用了cloudflare之后,由于我之前使用goaccess统计nginx日志,会有些问题,先看下我设置的nginx默认日志格式log_format如下:

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


    再来看下我的goaccess.conf配置文件中对nginx日志提取的内容,大约在65行左右的位置,我添加了如下log-format

log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u" ~h

大部分的字段含义我当时都在利用GoAccess实现nginx日志可视化一文中作了注释,除了最后的~h,~h在官网中的说明其实就是对应nginx日志中的$http_x_forwarded_for字段

The host (the client IP address, either IPv4 or IPv6) in a X-Forwarded-For (XFF) field.


    重新来捋一下现在的网站用户访问过程,当我配置了cloudflare时,用户点击网站名,cloudflare会将请求分发到距离用户最近的缓存服务器上,如果(用户)访问的该页面在该缓存服务器上不存在,则该服务器会去请求(我的)源服务器内容;如果存在内容,则直接返回给用户,压根不会经过源服务器(因为源服务器没有产生日志,但响应代码为302的似乎还是会回源?),此时nginx的日志中的$remote_addr记录的不再是用户真实的访问IP,而是CF缓存服务器的IP,用户的真实IP其实存到了$http_x_forwarded_for字段(这个可以自行测试)。

    在goaccess配置文件中,我原本是想将%h直接放到最后或者省略掉,如下

log-format %^ %^[%d:%t %^] "%r" %s %b "%R" "%u" ~h
log-format %^ %^[%d:%t %^] "%r" %s %b "%R" "%u" %h


    但是首先goaccess在解析nginx日志时,必须得配置%h,这就否决了第一种格式,又由于有些日志为回源访问,即nginx日志中remote_addr记录的是用户真实的IP,而http_x_forwarded_for记录的不存在内容,因此这两种方案均不可行,最后配置格式

log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u" ~h

    但是这个导致了一些问题,在goaccess的统计报告“访客主机名和IP地址”栏目下,会出现很多CF的代理IP。

    此外,使用CF之后,goaccess的统计报告由于缓存的原因,会出现无法实时更新页面的问题,因此需要在规则中增加该页面的“缓存绕过”规则,由于免费版本的CF只有三个规则可用,因此建议和后台的路径合二为一,省去一个规则。

    另外还有一个失误,就是我在使用CF的速度测试时,发现其一直提示“**.com 返回了状态 503。请尝试以下选项来解决此问题。”最后找到原因,我的服务器只开启了https的服务,但并没有开启443端口,防火墙打开端口即可。

    需要注意的是,假如制作了后台系统,一定要记得把自己的后台系统的缓存绕过,否则所有后台系统的页面都会被缓存下来,尽管外界用户实际操作不了这些后台的页面(仅仅是可以看到),但是暴露出来终究是不安全,例如我的后台系统是domain.com/admin/xyz...,

    配置规则如下:

*domain.com/*admin*
缓存级别: 绕过

 


参考:

https://goaccess.io/man