在自建的NAS上搭建了Wordpress网站,把CNZZ站点访问统计的代码添加到了页面,结果发现cnzz的链接被屏蔽了。
然后试了试友盟、百度统计同样也是当成广告给屏蔽了。
关于如何屏蔽广告可参考 NAS上搭建DNS服务,统一屏蔽家庭网络上的所有广告
打开 anti-ad.net 网站,下载一份广告屏蔽地址,查询了下果真被屏蔽了。
所以还是在服务端自己统计吧,虽然结果不太准确,但能有个大概就好。
在Wordpress 上安装 WP Statistics 统计插件后,结果发现客户端地址都是127.0.0.1,也就是说经过NPS穿透后,源地址是无法传递的。
从Nginx文档上了解到,使用 proxy_protocol stream 的方式可以额外添加这个信息,原理如下:
可惜目前Nginx默认集成了 http的方式。 如果使用https 则需要tcp的方式携带源地址信息, Nginx默认没有集成,需要临时编译,这样后期自动升级有些麻烦。
所以公网服务器,选择了Haproxy作为网关 ,整个结构运行原理如下:
客户端 -----> Haproxy (携带客户端IP) -----> NPS (TCP隧道透传,公网机器) ----> NPC(TCP隧道透传,内网NAS机器) -----> Nginx (内网NAS机器,设置header 传给PHP程序)--> PHP
Haproxy 增加配置如下:
listen web
bind 0.0.0.0:443
mode tcp
option forwardfor
server web1 127.0.0.1:1443 send-proxy check inter 3000 fall 3 rise 5
NPS、NPC 均不用配置,使用TCP穿透即可。 1433 <---> 1433
内网NAS上的Nginx 增加配置如下:
server {
listen 1443 ssl http2 default_server proxy_protocol; # 这里添加 proxy_protocol 协议
listen [::]:1443 ssl http2 default_server proxy_protocol; # 这里添加 proxy_protocol 协议
# 其他信息略...
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param REMOTE_ADDR $proxy_protocol_addr; # 这里把客户端源地址,设置到REMOTE_ADDR里,方便 WP Statistics 接收
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
这样客户端与内网NAS通信时全程https,并且wordpress 里WP Statistics 统计插件还能够接收到客户端的源IP,效果如下: