awk实时统计PV

今天有人问我怎么实时统计一下访问量的大小。其实在公司是有专门的监控系统做这些基本的访问量,服务调用,业务数据的完整分析。
不过就简单根据apache或者nginx的日志来看看PV的话,可以直接tail日志给awk处理。


#pv.f
#假设第4列的格式是:[31/May/2013:13:46:31 +0800]
#第6列是GET 或者POST 表示访问的方式
function pt(a)
    {
        for (i in a)
        {
            printf("%s -- %d\n",i,a[i]);
        }
    }
{
    t=substr($4,9,13);  #per second
    if ( per == 1) {
        t=substr($4,9,10); #per minute
    }
    if( k != t  ) {
        if( length(k)>2) {
            pt(af);
         }
         delete af;
         k=t;
    } else if( k == t) {
        FLAG=t;
        if ($6 ~ "GET" || $6 ~ "POST" ) {
            af[FLAG]++;
        }
    }
}

pv530

发表在 linux shell | 留下评论

nginx+uwsgi+django配置

这几天有点时间开始学习了一下django。昨天是直接用自带的manage.py启动的。今天简单查了几下几种模式,后来选了uwsgi模式开跑django,主要是nginx自带了这个模块,比较方便。
1.nginx的配置
nginx的配置比较简单的,写个upstream然后写一下uwsgi_pass就OK。


server {
    ...........
    location / {                                                                                                                                
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
#       try_files $uri $uri/ /index.html;
        # Uncomment to enable naxsi on this location
        # include /etc/nginx/naxsi.rules
        include uwsgi_params;
        uwsgi_pass django;
        uwsgi_buffer_size 8k;
        uwsgi_intercept_errors on;
    }  
}
upstream django {
    server 127.0.0.1:9000;
    keepalive 1;
}
  1. 配置uwsgi

#/etc/uwsgi/apps-available/django.ini
[uwsgi]
socket = 127.0.0.1:9000
chdir = /home/pm/study/django/pystudy
daemonize=/home/pm/study/django/pystudy/pystudy.log
pidfile= /tmp/uwsgi.pid
module=pystudy.wsgi:application
master=True
uid=pm
gid=pm
plugin = python
processes = 2
threads = 4
stats = 127.0.0.1:9001

在apps-enabled建立链接到apps-available/django.ini 的软链接。
启动直接sudo /etc/init.d/uwsgi start即可
不过这个uwsgi的启动脚本貌似有问题,明明启动好了显示失败,而且uwsgi stop也没有把进程给停掉。

发表在 django | 留下评论

nginx设置根据参数进行跳转

线上有个老系统要下线,发现有个老的接口还有人在用。其实之前这个接口也只是根据URL中的target参数进行一个跳转。这个直接在nginx里面做也是比较简单的,直接从$arg_target里把匹配的目标地址(包括参数)都提取出来,然后放到rewrite里面就OK。因为对应的参数实际已经被匹配下来了(只有GET请求,没有POST的),所以rewrite语句里面加了一个‘?“避免自动把之前的$args加到后面。


location =/redir.do {
root /home/nginx/webpages/;
       set $to_url 'www.xxx.net';
       if ( $arg_target ~* 'https?://(.*)' ) {
             set $to_url $1;
       }
       if ( $arg_target ~* 'https?%2F(.*)' ) {
             set $to_url $1;
     }
     rewrite ^ http://$to_url? break;
}
发表在 nginx | 留下评论

BitTorrent Sync试用

今天想着把去年海淘的T530拿出来打理一下,就直接sftp把工作笔记本的文件拖到了新电脑。其实一直想试试网盘的,现在多个电脑切来切去的经常发现某个文件在另外的一个电脑上,非常不方便。考虑到数据安全就同步到内部网盘上了。下午正好无聊发现有个BitTorrent Sync是专门做局域网内部的文件同步的,Linux下也可以很方便地使用。就简单试了下。
使用还是比较简单的,看一下http://labs.bittorrent.com/experiments/sync/get-started.html#getting-started的介绍一目了然。
本是准备在测试环境搞台服务器和我自己电脑上的进行同步。不过可能是因为我电脑是挂在自己的一个路由器下亦或是测试环境访问不了办公网络的原因,所以同步没有成功。为了测试一下功能就直接搞了2个测试服务器上玩,试了下是可以同步的。
下载http://btsync.s3-website-us-east-1.amazonaws.com/btsync_x64.tar.gz
解压后直接运行btsync后会看到有一个后台进程,默认的管理端口是8888,可以登陆操作。
1. 如果是主动要分享文件的话就之间点一下获取安全码,再选择一下要分享的目录即可。可以设置为只读同步,或者允许对方更新后本地也进行更新。
2. 如果是要同步其他机器分享的文件,就输入其他机器对应目录的安全码,再选择后同步的目标目录。

btsync
2个机器直接的同步后,可以在另外的机器上修改删除文件,这样原来的源服务器上的文件也会进行更新。不过这样就会有点问题,万一某个机器的数据被误删除了,所有机器的文件都没有了。不过好在可以设置“Delete files to Sync Trash”把删除的文件放在回收站。

发表在 soft | 留下评论

nginx同时listen ipv4和ipv6端口

其实根据nginx的wiki的表述,在linux下一般默认的监听ipv6的一个端口会同时把ipv4的端口相应地监听起来。除非自己手动设置了/proc/sys/net/ipv6/bindv6only为1。今天重新编译了nginx后发现在ipv4环境下blog不能访问了,但是ipv6环境下是可以正常访问的。就单独搞了一下
原来的配置是
[text]
listen [::]:443 ssl so_keepalive=on;
listen [::]:80 so_keepalive=on;
[/text]
今天用了新版本的nginx后,配置上其实只是增加了spdy
[text]
listen [::]:443 ssl so_keepalive=on spdy;
listen [::]:80 so_keepalive=on;
[/text]
现在改成对ipv6和ipv4分别listen
[text]
listen [::]:443 ssl so_keepalive=on ipv6only=on spdy;
listen 443 ssl so_keepalive=on spdy;
listen [::]:80 so_keepalive=on ipv6only=on;
listen 80 so_keepalive=on;

[/text]
不知道这个问题是不是新版的nginx存在的bug。。

发表在 nginx | 留下评论

nginx开启pagespeed和sdpy

nginx 1.4.0已经增加了sdpy协议的支持。所以只需要简单的编译即可。另外这段时间炒的很热的google pagespeed模块也出了一个beta版本。pagespeed编译后实在是比之前大了太多,表示有点难以接受。
1.编译安装新版的openssl,因为debian stable带的openssl版本太老不支持NPN
wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz && tar zxvf openssl-1.0.1e.tar.gz
cd openssl-1.0.1e && ./Configure –prefix=/opt/openssl
再修改一下Makefile:INSTALL_PREFIX=/opt/openssl
make && make install
1.下载好nginx
[bash]
wget http://nginx.org/download/nginx-1.4.0.tar.gz && tar zxvf nginx-1.4.0.tar.gz
[/bash]
2.下载pagespeed包
[bash]
wget https://github.com/pagespeed/ngx_pagespeed/archive/release-1.5.27.2-beta.zip && unzip release-1.5.27.2-beta.zip
cd ngx_pagespeed-release-1.5.27.2-beta/
wget https://dl.google.com/dl/page-speed/psol/1.5.27.2.tar.gz && tar -xzvf 1.5.27.2.tar.gz
[/bash]
3.编译nginx
[bash]
./configure –prefix=/usr/share/nginx1.4 –conf-path=/etc/nginx/nginx.conf –error-log-path=/var/log/nginx/error.log –http-client-body-temp-path=/var/lib/nginx/body –http-fastcgi-temp-path=/var/lib/nginx/fastcgi –http-log-path=/var/log/nginx/access.log –http-proxy-temp-path=/var/lib/nginx/proxy –http-scgi-temp-path=/var/lib/nginx/scgi –http-uwsgi-temp-path=/var/lib/nginx/uwsgi –lock-path=/var/lock/nginx.lock –pid-path=/var/run/nginx.pid –with-pcre-jit –with-debug –with-file-aio –with-http_addition_module –with-http_dav_module –with-http_gzip_static_module –with-http_secure_link_module –with-http_stub_status_module –with-http_ssl_module –with-http_sub_module –with-http_xslt_module –with-ipv6 –with-openssl=/opt/openssl/usr/local/ssl/ –add-module=/root/soft/ngx_pagespeed-release-1.5.27.2-beta –with-http_spdy_module
需要注意得修改一下objs/Makefile里的东西,把.openssl都删除掉
[/bash]

4.配置nginx
主要是参考
http://nginx.org/en/docs/http/ngx_http_spdy_module.html 配置spdy
https://github.com/pagespeed/ngx_pagespeed 配置pagespeed

====
编译了pagespeed模块的nginx会接近100M,表示不可接受我就把这个模块去掉了。。只单独编译了一个支持sdpy模块的nginx。

发表在 nginx | 留下评论

nginx下使用$upstream_cache_status来标记缓存命中状态

之前把blog改成前端nginx直接缓存一下页面时,没有注意有$upstream_cache_status这个变量可以直接获取到命中的状态。所有就用了另外的一点小方法来判断是否命中缓存。
[text]
map $upstream_addr $hitstatus {
default ‘cache’ ;
~unix ‘nocache’;
}
[/text]
基本的思路就是看$upstream_addr是否为空,如果是空的肯定是命中了缓存的,如果是匹配unix(我使用的是unix socket的形式)就是没有命中被转发到了后端php-fpm的。今天记得是有这个$upstream_cache_status变量了的就把配置文件修改了一下,直接使用$upstream_cache_status更简单和方便。
[text]
add_header Cache-status $upstream_cache_status;

[/text]

发表在 nginx | 留下评论

tomcat的keepalive时间设置问题

前几天进行线上的压测,发现应用的性能比之前还降低了就进行了一些分析。应用的结构是基础的apache+mod_jk+jboss的模式。主要的原因是之前的很多默认参数设置不合理,比如jk的配置
[text]
worker.list=local
worker.local.type=ajp13
worker.local.host=localhost
worker.local.port=8001
worker.local.lbfactor=50
worker.local.cachesize=100 #当前配置大于每个进程的最多线程数50,需要减小
worker.local.cache_timeout=600 #闲置连接的清理时间
worker.local.socket_keepalive=1
worker.local.recycle_timeout=300 # #作用和cachesize类似但是在non-cache 的时候也能用
[/text]
tomcat的配置
[text]
<Connector port="7001" address="${jboss.bind.address}"
emptySessionPath="false" enableLookups="false" redirectPort="8443"
watchModeLimit="1200" maxParameterCount="1200" protocol="AJP/1.3" strategy="ms" acceptCount="300" bufferSize="16384" maxPostSize="2097152" connectionTimeout="300000" useBodyEncodingForURI="true" maxThreads="200" minSpareThreads="40" maxSpareThreads="75"/>
[/text]
当上层的apache进程比较多的时候,很容易把java的线程都占用掉,造成不能接受新请求,OS上可以看到很多SYN_RECV状态的连接。然后我就尝试修改参数能使得闲置的ajp链接被apache主动释放掉。因为cache_timeout和recycle_timeout的2个的作用都是指定闲置连接的回收时间,所以想试试到底是哪个先生效。然后就抓包做了下测试
结果无论是把cache_timeout还是把recycle_timeout的时间改小,ajp连接的回收时间都是300s。
[text]
11:17:02.983554 IP (tos 0x0, ttl 64, id 26914, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.47060 > 127.0.0.1.7001: S [tcp sum ok] 3713142601:3713142601(0) win 32767 <mss 16396,sackOK,timestamp 283338347 0,nop,wscale 2>
11:17:02.983570 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.7001 > 127.0.0.1.47060: S [tcp sum ok] 3721181851:3721181851(0) ack 3713142602 win 32767 <mss 16396,sackOK,timestamp 283338347 283338347,nop,wscale 2>

11:21:57.521848 IP (tos 0x0, ttl 64, id 22127, offset 0, flags [DF], proto 6, length: 52) 127.0.0.1.7001 > 127.0.0.1.47059: F [tcp sum ok] 1642:1642(0) ack 467 win 8192 <nop,nop,timestamp 283367801 283337800>
11:22:03.234846 IP (tos 0x0, ttl 64, id 56573, offset 0, flags [DF], proto 6, length: 52) 127.0.0.1.7001 > 127.0.0.1.47060: F [tcp sum ok] 1642:1642(0) ack 467 win 8192 <nop,nop,timestamp 283368372 283338371>
[/text]
后来继续搜索了一下发现有类似的讨论,主要是直接在tomcat配置文件里面的加keepAliveTimeout=10000。不过单独修改这个配置发现还是没有像预想的那样工作。后来仔细看了那个链接里的讨论,说是在tomcat 5.5里KeepAliveTimeout是没有用的,然后就直接把connectionTimeout改成了32000,重要正常工作了。
[text]
13:05:37.104641 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.7001 > 127.0.0.1.47265: S [tcp sum ok] 2010311520:2010311520(0) ack 2018476636 win 32767 <mss 16396,sackOK,timestamp 283989747 283989747,nop,wscale 2>
13:05:45.476963 IP (tos 0x0, ttl 64, id 17630, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.47280 > 127.0.0.1.7001: S [tcp sum ok] 2021138150:2021138150(0) win 32767 <mss 16396,sackOK,timestamp 283990584 0,nop,wscale 2>
13:05:45.476981 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto 6, length: 60) 127.0.0.1.7001 > 127.0.0.1.47280: S [tcp sum ok] 2016571274:2016571274(0) ack 2021138151 win 32767 <mss 16396,sackOK,timestamp 283990584 283990584,nop,wscale 2>
13:06:11.061661 IP (tos 0x0, ttl 64, id 48536, offset 0, flags [DF], proto 6, length: 52) 127.0.0.1.7001 > 127.0.0.1.47265: F [tcp sum ok] 1642:1642(0) ack 467 win 8192 <nop,nop,timestamp 283993143 283989941>
13:06:17.641781 IP (tos 0x0, ttl 64, id 13753, offset 0, flags [DF], proto 6, length: 52) 127.0.0.1.7001 > 127.0.0.1.47280: F [tcp sum ok] 1642:1642(0) ack 467 win 8192 <nop,nop,timestamp 283993801 283990600>
[/text]
另外tomcat的配置优化tips可以参考下面的介绍:

http://blog.monitis.com/index.php/2011/08/06/18-java-tomcat-application-optimization-tips/

发表在 Web server | 留下评论

nginx alias配置小问题

之前单独做了一个健康检查的页面。配置是如下
[text]
location ~* HEALTH_CHECK {
alias /home/app/HEALTH_CHECK ;
try_files /lbck =410;
}

[/text]
之前之所以这样写是因为考虑到访问的时候可以不分大小写。然后今天看着这个配置觉得有点蛋疼,因为我想在这个目录下放点其他的东西。所以修改了一下下

[text]
location ~* /HEALTH_CHECK/ {
alias /home/app/HEALTH_CHECK ;
access_log off;
}
[/text]
但是这个时候发现访问的时候存心了循环重定向。简单地把alisa修改成root后是可以正常工作。

[text]
location ~* /HEALTH_CHECK/ {
root /home/app/ ;
access_log off;
}
[/text]

后来尝试了最简单的配置方式可以正常工作。
[text]
location /HEALTH_CHECK/ {
alias /home/app/HEALTH_CHECK/ ;
access_log off;
}

[/text]

咨询了一下开发同学。主要是alias实现上方式的问题。不过总的来说,用这些东西还是多做好测试。

发表在 nginx | 留下评论

升级debian testing的svn到1.7

公司使用的svn都是1.7版本的,然后在debian testing源里的版本还是1.6的,这个就造成了平时在linux下完全不能用svn。晚上升级了一下,终于可以用了。
直接加一下源:
deb http://opensource.wandisco.com/debian/ squeeze svn17
添加一下key
[bash]
wget http://opensource.wandisco.com/wandisco-debian.gpg
sudo apt-key add wandisco-debian.gpg
[/bash]
直接升级一下包就OK。

发表在 OS | 留下评论