windows 上通过netsh设置端口代理

实例一:   在windows上启动一个8181端口来代理phpor.net的80端口的服务

删除端口代理:

当然,你可能记不住这么长的命令,可以如下方式使用:
>netsh
>?   // 查看可以使用的命令

>interface   // 这里你可以不拼写完,只要不会和其他命令产生歧义就行,如: interf
>?  // 查看可以使用的命令

>portproxy
>?

>set v4tov4 listenport=8181 connectaddress=phpor.net connectport=80
>show all

注意: 目前只支持tcp的端口代理。

这里又意外发现一处windows的错误:

=================================================
netsh还可以完成很多东西,有时间再看

通过ssldump来分析ssl协议过程

ssldump下载: http://www.rtfm.com/ssldump/ssldump-0.9b3.tar.gz
ssldump安装:
./configure  && make && make install

make的时候可能会有错误:
net/bpf.h 找不见 ; 通过 ldconfig -p | grep pcap 发现已经安装了pcap的so文件, 使用rpm查了一下该so文件所属的rpm包,再通过rpm -ql libpcap-0.8.3-12.el4_6.1  发现存在类似头文件: /usr/include/pcap-bpf.h

于是,修改ssldump代码中包含的头文件:
<net/bpf.h> 修改为  <pcap-bpf.h>
于是,编译成功

使用:
./ssldump -i eth0 -k /etc/ssl/crt/private.key  -nn -d  port 443
..

apache 的任务分配模型

我们知道,Apache可以同时接受很多请求,在Apache的pre-fork模型中,有m个Apache的子进程随时等待着处理请求,这时,有n个请求过来了,那么,这n个请求是如何分配到m个进程来处理的呢?

首先,即使是n个请求同时到达,到操作系统层也会串行化后再提交到应用程序的。

情况一:
假设我们的Apache只listen一个IP:port, 则:
第一步:
父进程在fork子进程之前,会:
socket(…) = s;
listen(s,…) = 0;
这样就产生了一个listen指定ip:port 的文件描述符fd(s); Apache父进程在fork子进程时会将该fd(s)遗传给每一个子进程
第二步:
每个子进程都会处于:  accept(s,…) 状态,等待接受请求,这些子进程在s上排队,先到先得,得到请求后,开始处理请求,处理完请求后继续accept(s,…) 等待请求; 这样,如果每个请求的处理时间相同,则,每个子进程能处理的任务基本是平均分配的。

情况二:
假设我们的Apache同时listen了同一个IP上的80和443端口,则:
第一步:
父进程在fork子进程之间,会:
socket(…) = s80;
listen(s89,…) = 0;

socket(…) = s443;
listen(s443,…) = 0;

semget(…) = semaphore;
产生s80, s443 两个fd (如果是epoll模型,则是创建一个epoll)和一个信号量semaphore

第二步:
因为accept不能同时在两个socket上排队,所以直接进入accept状态就不行了,所以就用到了“同步IO多路技术”,一般有三种实现: select、poll、epoll,其中epoll是最为高效的一种,这里已epoll为例说明。因为epoll只能同时accept多个socket,但是没法让多个进程在epoll的多个socket上排队;所以还得引入一个信号量的概念,信号量是解决同步与互斥问题的,常用的一种实现为semop(…); 这样多个Apache的子进程通过semop在父进程产生的信号量semaphore上排队,这样,保证同时只有一个进程处于可以接受请求的状态,接受到请求之后,退出队列,然后由下一个子进程接受请求。基本流程如下:

shell + awk 做日志监控

今天使用shell + awk 写了一个日志监控脚本,主要功能如下:
1. 没10分钟分析1次, 分析前10分钟的日志
2. 分析前10分钟日志中各种错误的数量及占比,来决定是否发送报警短信,很多错误号需要做特殊处理,有些错误号还要忽略

主要温习了下面知识:
1. shell中函数的定义
  参考资料: http://www.cnblogs.com/chengmo/archive/2010/10/17/1853356.html

2. awk按照比较漂亮的格式写在shell文件中,不需要单独写awk脚本,使得一个shell脚本就可以干活了
3. awk中的数组似乎不能明确初始化一个空数组,awk中的数组都是关联数组
4. awk错误调试,这个是最有意义的了,如下图:
  
5. shell中的函数必须在调用前定义,但是我们不喜欢先看到一堆函数后才能看到主流程,办法为:
   第一: 要么将函数定义到其他文件中,然后主流程的文件包含该函数文件
   第二: 要么定义一个main函数,只需把main函数的调用放在文件尾部就行了,main的定义写在文件开始