Google Analytics如同其它Google旗下的产品一样,在市面上同类产品中属于非常出色的一个。不过由于众所周知的原因,Google相关服务的流畅性并不理想。虽然流传很多说法表示Google Analytics的域名在国内并没有被墙,在实际优化速度过程中还是有很大影响。用Nginx来进行异步处理Google Analytics请求是一个比较完美的解决方案,下面记录一下供参考。
1 配置及环境说明
- 搬瓦工洛杉矶CN2 512M
- Nginx 1.6.2以上*
- Debian 8.10 64bit
- WordPress系统
- LNMP环境 via LNMP一键脚本
2 生成用户信息
## Begin of user info for nginx google analytics userid on; userid_name cid; userid_domain w61.gubo.org; userid_path /; userid_expires max; if ($http_accept_language ~* '^(.+?),') { set $first_language $1; } ## End
这部分的作用主要是生成用户信息,用以传递给Google Analytics统计。具体用法请参考Module ngx_http_userid_module
2.1 获取客户端语言
if ($http_accept_language ~* '^(.+?),') { set $first_language $1; }
此部分代码获取客户端的语言,是浏览器设置的偏好语言(Preferred Lanagues)而不是浏览器安装时所选择的语言。
2.2 定义cookies域
userid_domain w61.gubo.org;
需要注意的是 userid_domain w61.gubo.org; 当中的域名,起到定义cookies的作用,如果设置不当会导致刷新一次页面产生一个新的session(对话),统计数据不准。
3 Tracker Location转发到Google Analytics
location @tracker { resolver 202.45.84.58 ipv6=off; internal; proxy_method GET; proxy_pass https://www.google-analytics.com/collect?v=1&tid=UA-xxxxxxxx-x&$uid_set$uid_got&t=pageview&dh=$host&dp=$request_uri&uip=$remote_addr&dr=$http_referer&ul=$first_language&z=$msec; proxy_set_header User-Agent $http_user_agent; proxy_pass_request_headers off; proxy_pass_request_body off; }
这部分代码的通过proxy_pass请求Google Analytics的API从而传递统计数据,各种参数在“2.1 生成用户信息”部分已经定义。
3.1 resolver 指定dns服务器地址
resolver 8.8.8.8 ipv6=off;
- 如果不加入这行会导致无法解析到Google Analytics域名而不能正确发送数据, 后台也就看不到统计信息
- 在没有ipv6的机器上需要用 ipv6=off 关闭ipv6的解析,否则Nginx发送数据到ipv6地址不成功,后台也会统计不到数据
- 某些dns解析到延迟较高的Google Analytics服务器会拖慢Nginx整体速度。调试过程中解析到一个ping延迟400多ms的服务器,页面延迟感觉非常明显,更换resolver后解决。可以使用 dig @8.8.8.8 www.google-analytics.com 来获取解析地址,然后ping对应地址测试延迟。
3.2 特定版本报错"header already sent"
2018/02/06 08:20:07 [alert] 16197#0: *36 header already sent while reading response header from upstream
通过 post_action 转发过来的信息是不会再读取返回信息的,也不会拖慢网页反应速度。但是在Nginx 1.6.2版本(Debian 8默认版本)中会报错,具体错误信息如上。这个报错信息其实是一个bug,网上信息非常少,在初期调试的时候造成很大干扰。只需编译或者用其他方式升级到新版Nginx即可解决。
4 WordPress 统计页面请求
如果不启用生成静态文件的Cache插件,Wordpress所有请求的页面文件实际上都是交给index.php进行处理,所以触发统计的规则要写在 location ~ \.php$ 规则里,否则不能有效触发 @tracker 部分的配置
location ~ \.php$ { ... ## 省略正常配置 ## Google analytics nginx set $flag "0"; if ($request_uri !~* "^/wp-|/feed/$|\.pagespeed\.|robots\.txt|favicon\.ico|replytocom") { set $flag "${flag}1"; } if ($http_user_agent !~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|YiSou Spider") { set $flag "${flag}2"; } if ($http_dnt != 1) { set $flag "${flag}3"; } if ($flag = "0123") { post_action @tracker; } ## End of Google analytics nginx } ... ## 省略正常配置 }
5 完整的Nginx文件
下面就是完整的针对Wordpress进行后端异步处理Google Analytics的Nginx配置。如果启用了Wp Super Cache等缓存插件生成了静态文件或者Nginx进行反代,触发@tracker部分所需的代码则添加的位置会有所不同。
6 调试方法
如果需要调试,请参照Nginx 内配置 Google Analytics 指南中的调试部分,使用netcat进行调试。不知是netcat版本差异还是其它原因,使用该文中命令不能成功监听目标端口,需要使用如下命令
nc -k -l -p 9999 127.0.0.1
然后使用如下命令查看端口情况可看到9999端口已经打开,发送数据可正常接收
netstat -nlt
16 thoughts on “Nginx 异步处理Google Analytics”
博主可以交换友链吗?
我的博客 https://blog.haitianhome.com
已经添加上!
已经添加 感谢~
最后可以了。但你这篇代码 最后wordpress使用的完整代码 flag应该是判断等于0123
确实是的,我去修改过来
server
{
listen 80;
#listen [::]:80;
server_name blog.haitianhome.com;
return 301 https://$server_name$request_uri;
index index.html index.htm index.php default.html default.htm default.php;
root /home/www/blog/;
include rewrite/wordpress.conf;
#error_page 404 /404.html;
location ~ [^/]\.php(/|$)
{
# comment try_files $uri =404; to enable pathinfo
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
#include pathinfo.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
access_log /home/logs/blog.log;
}
server
{
listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name blog.haitianhome.com ;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
index index.html index.htm index.php default.html default.htm default.php;
root /home/www/blog;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/blog.haitianhome.com/bloghaitianhomecom.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/blog.haitianhome.com/bloghaitianhomecom.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_session_cache builtin:1000 shared:SSL:10m;
# openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;
include rewrite/wordpress.conf;
#error_page 404 /404.html;
# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all }
include enable-php.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log /home/www/logs/blog.log;
}
include rewrite/wordpress.conf;
include enable-php.conf;
应该和这两个文件相关, WordPress所有路径默认其实都是经过index.php处理的, 所以从这方面着手就好
的确是enable-php.conf;文件
但是按照文章里的方法添加后 google analytica里并不显示
改为只留下post_action @tracker;
可以显示实时数据
但是发现 所有访问内容只显示为index.php的
请求的网址是这个:
https://www.google-analytics.com/collect?v=1&tid=UA-1203xxxx-2&$uid_set$uid_got&t=pageview&dh=$host&dp=$request_uri&uip=$remote_addr&dr=$http_referer&ul=$first_language&z=$msec;
其中$request_uri就应该是访问的网址… 研究一下这个地方
80端口(http)的配置文件里有这行, 可以考虑加在这里
location ~ [^/]\.php(/|$)
但我现在用的都是 ssl 443了 加在80里的 还有用吗
那应该就考虑443配置里的, 看一下这两个文件:
include rewrite/wordpress.conf;
include enable-php.conf;
其他添加进去都没问题 但是开启ssl后 443端口的
没有
location ~ \.php$ {
}
只有
location ~ /\.
{
deny all;
}
我添加一个location ~ \.php$ {} 会报错
直接写在
location ~ /\.
{
deny all;
后面又没反应……
求助……谢谢
贴出你的完整站点的Nginx看看