开启tomcat状态页面

1、用户设置
先进入Tomcat/conf/tomcat-users.xml 创建一个新的角色,如:

  1. <role rolename="jkb"/>

并创建一个用户,把刚才创建的角色分配给此用户,如

  1. <user username="jkb" password="jkb” roles="jkb"/>

2、安全设置
然后进入tomcat/webapps/manager/WEB-INF/web.xml为刚才新建角色添加权限(仅具有访问状态页的权限),如:

  1. <security-constraint>
  2. <web-resource-collection>
  3. <web-resource-name>Status interface</web-resource-name>
  4. <url-pattern>/status/*</url-pattern>
  5. </web-resource-collection>
  6. <auth-constraint>
  7. <role-name>jkb</role-name>
  8. <role-name>manager-gui</role-name>
  9. <role-name>manager-script</role-name>
  10. <role-name>manager-jmx</role-name>
  11. <role-name>manager-status</role-name>
  12. </auth-constraint>
  13. </security-constraint>

然后重启Tomcat。访问状态页校验是否生效。
提示:此步的web.xml,如果是ubutnu系统,则在/usr/share/tomcat-admin/manager/WEB_INF/web.xml。

python tkinter 窗口居中对齐

tkinter没有现成的窗口居中的功能,只能间接地算出来。

  1. from Tkinter import *
  2. def center_window(w=300, h=200):
  3.     # get screen width and height
  4.     ws = root.winfo_screenwidth()
  5.     hs = root.winfo_screenheight()
  6.     # calculate position x, y
  7.     x = (ws/2) – (w/2)   
  8.     y = (hs/2) – (h/2)
  9.     root.geometry(‘%dx%d+%d+%d’ % (w, h, x, y))
  10. root = Tk()
  11. center_window(500, 300)
  12. root.mainloop()

使用pyinstaller打包python为exe文件

最近用python的tkinter写了个windows界面的工具,用来对软件版本发布的自动化,之前发布版本是由PHP的同事完成,又是手动上传文件到ftp,又是修改数据库,php代码等这么多繁琐的步骤。所以决定用python写了个windows的应用,因为版本发布可能会交给运营的同事完成,所以用tkinter写了个界面,顺便转换成exe的文件,之前是用py2exe,觉得不好用,搜索到了pyinstaller,还不错,使用简单,且打包成exe兼容性好,下面记录方法。
1、下载pyinstaller
目前pyinstaller支持的python版本为2.3-2.7,可以到http://www.pyinstaller.org/官网下载。
2、安装
下载完成后,解压即可。
3、使用方法
使用也非常的简单,cmd下进入解压出来的目录,执行如下命令。

  1. python pyinstaller.py [opts] yourprogram.py

主要选项包括:
-F, –onefile 打包成一个exe文件。
-D, –onedir 创建一个目录,包含exe文件,但会依赖很多文件(默认选项)。
-c, –console, –nowindowed 使用控制台,无界面(默认)
-w, –windowed, –noconsole 使用窗口,无控制台

更详细的使用方法请参考下载包里的doc目录下的Manual.html文件。

I/O监视器-iotop

iotop 是一个用来监视磁盘 I/O 使用状况的 top 类工具。如下图所示,Iotop 具有与 top 相似的 UI,其中包括 PID、用户、I/O、进程等相关信息。
1、安装

  1. ubuntu:apt-get install iotop
  2. centos:yum install iotop

2、使用方法
iotop [OPTIONS]

主要选项有:
-o :只显示有io操作的进程
-b :批量显示,无交互。主要用作记录到文件。
-n NUM:显示NUM次,主要用于非交互式模式。
-d SEC:间隔SEC秒显示一次。
-p PID:监控的进程pid
-u USER:监控的进程用户。

系统管理

批量kill mysql线程

如果大批量的操作能够通过一系列的select语句产生,那么理论上就能对这些结果批量处理。
但是mysql并没用提供eval这样的对结果集进行分析操作的功能。所以只能现将select结果保存到临时文件中,然后再执行临时文件中的指令。
具体过程如下:

  1. mysql> SELECT concat(‘KILL ‘,id,’;’) FROM information_schema.processlist WHERE user=’root’;

+————————+
| concat(‘KILL ‘,id,’;’)
+————————+
| KILL 3101;
| KILL 2946;
+————————+
2 rows IN SET (0.00 sec)

  1. mysql> SELECT concat(‘KILL ‘,id,’;’) FROM information_schema.processlist WHERE user=’root’ INTO OUTFILE ‘/tmp/a.txt’;

Query OK, 2 rows affected (0.00 sec)

  1. mysql> source /tmp/a.txt;

Query OK, 0 rows affected (0.00 sec)
转自:http://blog.chinaunix.net/uid-20639775-id-154587.html

自动重启服务shell脚本

比如我们想重启php-fpm。

  1. #!/bin/bash
  2.  
  3. #变量初始化
  4. process="php-fpm" #进程名
  5. startCmd="/etc/init.d/php-fpm start" #启动命令
  6. down=0
  7.  
  8. while true
  9. do
  10.     #取得http状态码
  11.     code=$(curl -H "Host:devops.webres.wang" -m 5 -L -s -w %{http_code} http://127.0.0.1 -o /dev/null)
  12.     #当状态码返回000或者大于等于500时,计数故障到down变量
  13.     if [ $code -eq 000 -o $code -ge 500 ];then
  14.         ((down++))
  15.     else
  16. break
  17.     fi
  18.     #稍等5s
  19.     sleep 5
  20.     #判断是否连续检测三次都为故障.
  21.     if [ $down -ge 3 ];then
  22. if [ "$(find /tmp/${process}_restart -mmin -3)" == "" ];then
  23.                 #取得进程名对应的所有pid
  24. pids=$(ps aux | grep ${process} | grep -v "grep" | awk ‘{print $2}’)
  25.                 #依次对所有pid执行kill命令
  26. for i in $pids;do
  27. kill -9 $i
  28. kill -9 $i
  29. done
  30.                 #kill完pid后,启动服务
  31. $startCmd
  32. echo "$(date) Return code $code,${process} had been restarted" >> /tmp/${process}_restart
  33. else
  34. echo "$(date) ${process} not yet recovery.As it had been restarted in 2 minutes.so this time ignore." >> /tmp/${process}_not_restart
  35. fi
  36.  
  37. break
  38.     fi
  39. done

OpenResty(nginx扩展)实现防cc攻击

防cc攻击,推荐使用HttpGuard

 

本文介绍使用openresty来实现防cc攻击的功能。openresty官网http://openresty.org/cn/index.html。下面是防cc攻击的流程图。
根据流程图,我们知道防cc攻击主要包括两部分,一是限制请求速度,二是给用户发送js跳转代码进行验证请求是否合法。
Nginx

一、安装依赖

centos:

  1. yum install readline-devel pcre-devel openssl-devel

ubuntu:

  1. apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl

二、luajit安装

  1. cd /tmp/
  2. git clone http://luajit.org/git/luajit-2.0.git
  3. cd luajit-2.0/
  4. make &amp;&amp; make install
  5. ln -sf luajit-2.0.0-beta10 /usr/local/bin/luajit
  6. ln -sf /usr/local/lib/libluajit-5.1.so.2 /usr/lib/

三、openresty安装

  1. cd /tmp
  2. wget http://agentzh.org/misc/nginx/ngx_openresty-1.2.4.13.tar.gz
  3. tar xzf ngx_openresty-1.2.4.13.tar.gz
  4. cd ngx_openresty-1.2.4.13/
  5. ./configure –prefix=/usr/local/openresty –with-luajit
  6. make &amp;&amp; make install

四、nginx配置

nginx.conf:

  1. http{
  2. [……]
  3. lua_shared_dict limit 10m;
  4. lua_shared_dict jsjump 10m;
  5.  
  6. <pre><code>server {
  7.     #lua_code_cache off;
  8.     listen       80;
  9.     server_name  devops.webres.wang;
  10.  
  11.     location / {
  12.         default_type  text/html;
  13.         content_by_lua_file "/usr/local/openresty/nginx/conf/lua";
  14.     }
  15.     location @cc {
  16.         internal;
  17.         root   html;
  18.         index  index.html index.htm;
  19.     }
  20. }
  21. </code></pre>
  22.  
  23. }

/usr/local/openresty/nginx/conf/lua文件:

  1. local ip = ngx.var.binary_remote_addr
  2. local limit = ngx.shared.limit
  3. local req,_=limit:get(ip)
  4. if req then
  5.         if req > 20 then
  6.                 ngx.exit(503)
  7.         else
  8.                 limit:incr(ip,1)
  9.         end
  10. else
  11.         limit:set(ip,1,10)
  12. end
  13.  
  14. local jsjump = ngx.shared.jsjump
  15. local uri = ngx.var.request_uri
  16. local jspara,flags=jsjump:get(ip)
  17. local args = ngx.req.get_uri_args()
  18. if jspara then
  19.     if flags then
  20.         ngx.exec("@cc")
  21.     else
  22.                 local p_jskey=”
  23.                 if args["jskey"] and type(args["jskey"])==’table’ then
  24.                          p_jskey=args["jskey"][table.getn(args["jskey"])]
  25.                 else
  26.                          p_jskey=args["jskey"]
  27.                 end
  28.         if p_jskey and p_jskey==tostring(jspara) then
  29.                         jsjump:set(ip,jspara,3600,1)
  30.                         ngx.exec("@cc")
  31.         else
  32.                         local url=”
  33.                         if ngx.var.args then
  34.                                 url=ngx.var.scheme.."://"..ngx.var.host..uri.."&amp;jskey="..jspara
  35.                         else
  36.                                 url=ngx.var.scheme.."://"..ngx.var.host..uri.."?jskey="..jspara
  37.                         end
  38.                         local jscode="<script>window.location.href=’"..url.."’;</script>"
  39.                         ngx.say(jscode)
  40.         end
  41.     end
  42. else
  43.     math.randomseed( os.time() );
  44.     local random=math.random(100000,999999)
  45.     jsjump:set(ip,random,60)
  46.     local url=”
  47.     if ngx.var.args then
  48.         url=ngx.var.scheme.."://"..ngx.var.host..uri.."&amp;jskey="..random
  49.     else
  50.         url=ngx.var.scheme.."://"..ngx.var.host..uri.."?jskey="..random
  51.     end
  52.     local jscode="<script>window.location.href=’"..url.."’;</script>"
  53.     ngx.say(jscode)
  54. end

lua代码部分解释:
1、1-12行是限速功能实现,第5和第10行表示10秒钟内容最多只能请求20次。
2、14-48行是验证部分,24行中的3600表示验证通过后,白名单时间为3600秒,即1小时。

update: 2013.5.26
1、修复JS无限跳转bug
2、增加随机种子