Nginx 전단 매 립 점 데이터 수집

29170 단어 Nginx
참조 링크http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html
준비 작업 1.openresty 다운로드 경로:http://openresty.org/cn/download.html
openresty 설치http://openresty.org/cn/installation.html
실험 과정 에서 데 이 터 를 수집 해 야 하 는 페이지 코드
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="jquery-3.4.1.js"></script>
    <title>start  </title>
    <script type="text/javascript">
        var _maq = _maq || [];
        _maq.push(['_setAccount','u-z1234']);
        (function() {
            var ma = document.createElement('script');
            ma.type = 'text/javascript';
            ma.async = true;
            ma.src = 'https://[   ip]/ma.js';
            var s = document.getElementsByTagName('script')[0];
            s.parentNode.insertBefore(ma, s);
        })();
    </script>
</head>
<body>
     <h1><a href="/end">    end  </a></h1>
</body>
</html>

서버 에 요청 ma.js ma.js 를 보 내 서 페이지 에서 수집 해 야 할 데 이 터 를 통합 한 다음 encodeURIComponent 방법 으로 문자열 을 URI 구성 요소 로 인 코딩 하고 image 대상 이 파 라 메 터 를 가지 고 서버 에 요청 을 보 냅 니 다.ma.js 파일 은 Nginx 루트 디 렉 터 리 의 HTML 폴 더 에 두 면 됩 니 다.
(function () {     
var params = {};     
//Document         
if(document) {
    params.domain = document.domain || '';          
    params.url = document.URL || '';          
    params.title = document.title || '';  
    params.referrer = document.referrer || '';  
    }    
//Window     
if(window && window.screen) { 
    params.sh = window.screen.height || 0;         
    params.sw = window.screen.width || 0; 
    params.cd = window.screen.colorDepth || 0; 
}    

//navigator    

if(navigator) { 
        params.lang = navigator.language || '';  
}        

//  _maq       
if(_maq) { 
    for(var i in _maq) { 
        switch(_maq[i][0]) {                 
            case '_setAccount': 
                      params.account = _maq[i][1]; 
                      break;                 
            default:                   
                break; 
            }    
        }    
    }    

//      
var args = '';      
for(var i in params) {         
    if(args != '') { 
            args += '||'; 
        }    
        args += i + '=' + encodeURIComponent(params[i]); 
}    
   
//  Image         
var img = new Image(1, 1);  
img.src = 'https://[   ip  ]/log.gif?' + args; })();

Nginx.conf 설정 Nginx 는 HTTPS 를 지원 하기 때문에 SSL 설정 이 있 습 니 다.직접 실험 을 하면 HTTPSserver 에 있 는 코드 를 httpserver 로 옮 길 수 있 습 니 다.페이지 에서 요청 한 ma.js 는 마지막 으로 image 대상 으로 파 라 메 터 를 가지 고 서버 에 요청 을 보 냈 습 니 다.요청/log.gif,nginx 는 location/log.gif 에 일치 하고 쿠키 를 처리 한 다음 내부 의/i-log 를 요청 하 였 습 니 다.그리고 location/i-log 처리 매개 변수 args,logformat 의 형식 을 지정 한 디 렉 터 리 에 출력 한 다음 빈 문자열 을 되 돌려 줍 니 다.그러면 필요 한 데 이 터 를 수집 할 수 있 습 니 다.

#user  nobody;
worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

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

    log_format tick escape=json  
    "$msec||$remote_addr||$status||$body_bytes_sent||$u_domain||$u_url||$u_title||$u_referrer||$u_sh||$u_sw||$u_cd||$u_lang||$http_user_agent||$u_account"; 
    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    # HTTP server
    server {
        listen       80;
        server_name  localhost;
        #   
        rewrite ^(.*)$ https://$host$1 permanent;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
	}    
    
    # HTTPS server
    server {
        listen       443 ssl;
        server_name  localhost;
        root html;
        index  index.html index.thm;
	
        #ssl     
        ssl_certificate      /usr/local/openresty/nginx/cert/xxx.crt;
        ssl_certificate_key  /usr/local/openresty/nginx/cert/xxx.key;

        ssl_session_timeout  5m;

        ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers  on;

	

        location /log.gif { 
		#   gif   
		default_type image/gif;     
		#    access_log,  subrequest  log     
		access_log off; 
		access_by_lua "
        --     cookie  __utrace
        local uid = ngx.var.cookie___utrace        
        if not uid then
            --            cookie,   md5(   +IP+     )
            uid = ngx.md5(ngx.now() .. ngx.var.remote_addr .. ngx.var.http_user_agent)
        end 
        ngx.header['Set-Cookie'] = {'__utrace=' .. uid .. '; path=/'}
        if ngx.var.arg_domain then
        --   subrequest /i-log    ,        cookie   
            ngx.location.capture('/i-log?' .. ngx.var.args .. '&utrace=' .. uid)
        end 
        ";    
	   
		#           
		add_header Expires "Fri, 01 Jan 1980 00:00:00 GMT";     
		add_header Pragma "no-cache"; 
		add_header Cache-Control "no-cache, max-age=0, mustrevalidate"; 
		#    1×1  gif   
		empty_gif; 
        }
        
        location /i-log { 
        #  location,              
        internal; 
       
        #    ,    unescape,  ngx_set_misc   
        set_unescape_uri $u_domain $arg_domain;
        set_unescape_uri $u_url $arg_url;
        set_unescape_uri $u_title $arg_title;
        set_unescape_uri $u_referrer $arg_referrer;
        set_unescape_uri $u_sh $arg_sh;
        set_unescape_uri $u_sw $arg_sw;
        set_unescape_uri $u_cd $arg_cd;
        set_unescape_uri $u_lang $arg_lang;
        set_unescape_uri $u_account $arg_account;
        #      
        log_subrequest on; 
        #     ma.log    tick 
        access_log /usr/local/openresty/nginx/nginx_logs/ma.log tick; 
       
        #       
        echo ''; 
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}


시간 당 로그 분할 스 크 립 트
#!/bin/bash 
#         
log_path='/usr/local/openresty/nginx/nginx_logs/ma.log'
#         
new_log_path='/usr/local/openresty/nginx/nginx_logs_byhour'

#       
curr_time=`date -d "1 hour ago" +"%Y%m%d_%H%M%S"`

#           ,         
mv $log_path $new_log_path/$curr_time.log

kill -USR1 `cat /usr/local/openresty/nginx/logs/nginx.pid`

정시 임무
0 * * * * /root/nginx_cplog.sh

좋은 웹페이지 즐겨찾기