Matomo是一款基于PHP+MYSQL的开源网站监测及行为分析系统,主程序开源免费但可以通过付费插件拓展一些高级功能(如热力图、会话录像、视频分析、多渠道归因等)。高级功能可以申请cloud版试用3周。
试用过程中业务反馈IOS设备页面打开很慢,检查时间线发现是Matomo cloud的资源 加载很慢 https://*.matomo.cloud,排查后发现是因其服务器证书为Let’s Encrypt,其某个状态检查的服务器被DNS污染导致打开延迟。
网上关于此错误的解释为:
https://easy.zhetao.com/easy-https-lets-encrypt-content-233
主要原因为LE证书的吊销状态检查域名(ocsp.int-x3.letsencrypt.org以及相关CName或Alias)在大陆受到劫持引起。苹果系统的浏览器打开SSL网站时将对证书的状态进行验证,当在验证证书状态时,请求了被劫持的Let’s Encrypt证书状态检查(OCSP)的服务器,而该服务器为不可使用状态或有很长延时,从而导致打开网站延时。
由于证书状态检查由苹果的浏览器(UIWebView, WKWebView、Safari)发起,而Chrome在访问SSL网站时并不进行这一项检查,所以大部分用户在Chrome中访问正常,只有在苹果系统中访问出现延时。
……额,我国特色导致的小众技术问题,只能说G-F-W牛逼
如果是自己服务器的资源还比较好解决,按以上链接方法修改或彻底点改为其他商用证书一般就可以解决了。
但Matomo-Cloud是国外公司的,只能由他们在服务器改,Let’s Encrypt证书状态检查服务器被DNS劫持这种我国特色的小众问题他们肯定没怎么遇见过,因太小众估计提issue也不会理会。但总得自己找个解决办法,后来想到可以用服务器转发的方法,研究了一下,找到一个用Nginx服务器做方向代理来解决该问题。
为操作方便,以下设置是在宝塔Linux面板实现的
1.新增站点及设置证书:
新建一个站点,绑定自己的域名,假设域名为 matomo.demo.com,申请并部署证书。主流云服务商都可以申请免费的证书。也可使用公司的商用证书
2.设置反向代理
系统默认生成的配置文件如下
#PROXY-START/
location ~* \.(php|jsp|cgi|asp|aspx)$
{
proxy_pass http://demo.matomo.cloud;
proxy_set_header Host demo.matomo.cloud;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
}
location /
{
proxy_pass http://demo.matomo.cloud;
proxy_set_header Host demo.matomo.cloud;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
#Set Nginx Cache
add_header Cache-Control no-cache;
expires 12h;
}
#PROXY-END/
3.代码替换域名:
网页上matomo初始化代码的域名替换为该站点的域名,即可采集数据,而且此时客户端请求的是自己的中转服务器证书什么都没问题,IOS打开慢的问题也解决了。
另外,因为matomo cloud服务器在国外,国内访问延迟是比较高的,此时如果中转服务器线路选择得当,选了一个优化过的线路,中转一次可能比客户端请求原服务器更快。笔者实际使用时用了一个韩国机房CN2线路,测试了下延迟就比直接访问原服务器小。
新的问题
进后台一看数据是有正常采集,不过显示国家是韩国……
也容易理解,matomo这类网站监测工具发送的字段中默认并无ip字段,是基于底层网络协议获取户端ip(猜测是用于增加虚假刷的难度,毕竟客户端ip伪装有一定难度,伪装ip也要通过代理),此时直接与matomo cloud服务器建立连接的是这个中转服务器,获取的也是其ip,因服务器在韩国所以显示了韩国。
IP地址覆盖
查找文档,matomo有强制覆盖ip的字段,但必须加上可写客户的token才生效(还是为了避免ip伪装)。
文档地址(HTTP-API): https://developer.matomo.org/api-reference/tracking-api
改写以上的配置文件:
1.限制请求路径为 ^/matomo,这样该站点还可以正常放置其他路程不冲突的内容并正常展示
2.增加参数改写:参数增加cip和token
3.另外,部分高级插件如热力图、会话录像启用监测任务后会增加请求/plugins文件夹,也需加上
详细如下:
#PROXY-START/
location ~ ^/matomo
{
proxy_set_header Host demo.matomo.cloud;
set $args $args&cip=$remote_addr&token_auth=***********;
proxy_method POST;
proxy_pass https://demo.matomo.cloud;
add_header X-Cache $upstream_cache_status;
#Set Nginx Cache
proxy_ignore_headers Set-Cookie Cache-Control expires;
add_header Cache-Control no-cache;
expires 12h;
}
location ~ ^/plugins
{
proxy_set_header Host demo.matomo.cloud;
proxy_pass https://demo.matomo.cloud;
add_header X-Cache $upstream_cache_status;
#Set Nginx Cache
proxy_ignore_headers Set-Cookie Cache-Control expires;
add_header Cache-Control no-cache;
expires 12h;
}
#PROXY-END/
以上***替换为您的token_auth,建议新建一个用户专用于写入授权,后台可查到其token_auth
更新后,后台显示的地址就正确啦!
性能问题:
Nginx做反代性能非常高。2核4G的服务器上千并发毫无压力。
题外
根据以往经验,谷歌家的GTM/GA在部分地区也有类似遭遇,为增强稳定性也可以考虑参考此方式解决。后续有时间继续研究。
尊重作者劳动,转载请注明出处:札记-Qianrong's Blog » 以Matomo-Cloud为例用Nginx反向代理解决IOS系统打开Let’s Encrypt证书慢问题