以Matomo-Cloud为例用Nginx反向代理解决IOS系统打开Let’s Encrypt证书慢问题

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

原文为英文,以上为Chrome的机翻……还过得去

改写以上的配置文件:

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

更新后,后台显示的地址就正确啦!

ip地址隐藏后两位是隐私政策的问题跟采集无关,可后台配置

性能问题:
Nginx做反代性能非常高。2核4G的服务器上千并发毫无压力。

题外

根据以往经验,谷歌家的GTM/GA在部分地区也有类似遭遇,为增强稳定性也可以考虑参考此方式解决。后续有时间继续研究。

尊重作者劳动,转载请注明出处:札记-Qianrong's Blog » 以Matomo-Cloud为例用Nginx反向代理解决IOS系统打开Let’s Encrypt证书慢问题

赞 (112)

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 王光卫博客居然还有这种操作,学习了回复