Archive for 十一月, 2011

首先,需要确保中奖人数不可以超出产品总量,这个可以通过db操作完成:

用户抽奖前,预先计算抽奖结果:

  1. 检查是否有剩余量
  2. 算法,根据概率、中奖人数、抽奖人数,计算是否中奖
  3. 将结果存入数据库
    • 若之前已有抽奖结果,但未确认,则使用之前的抽奖结果
    • 若之前无抽奖结果,则使用该次抽奖结果
      • 若为中奖,则减少剩余量
        • 若失败,则修改抽奖结果,视为未中奖
      • 将抽奖结果存入cache table

用户抽奖时,需要点击确认按钮,才会完成整个抽奖流程,否则一定时间之后,定时任务会将剩余量恢复回去。

抽奖算法:

算法1:特点是,中奖概率随时间推移而增大。

  1. 预先设定一个百分比和结束时间,随机或者设置一个int or long类型的期望区间值expect(比如13)
  2. 抽奖时set prob = pow(curTime/endTime, 2) * prob ,根据时间动态计算一个正态分布的当前概率prob,并且获取到一个区间[0, (int)1/prob)
  3. 获取一个落在该区间的随机值
  4. 根据expect,计算落在该区间的期待值,若与随机值相等,则中奖

算法2:特点是,固定某个时间区间的第N个抽奖用户中奖(适用于,希望持续多久)

  1. 预先设定开始、结束时间,以及时间区间(x秒),N的值
  2. 抽奖时,根据当前时间、开始时间,计算当前时间区间的起始时间,并获取从该起始时间到当前,有多少人抽奖
  3. 若自己为第N个人,则中奖(依赖之前的db操作,可以保障没有多个人同时中奖)

算法3:特点是,实际中奖概率绝对不大于设定概率(适用于,希望多少人抽奖)

  1. 若当前中奖人数/抽奖人数>=中奖率,则该用户不中奖(抽奖人数已含当前用户)
  2. 否则,依中奖率随机出一个lcg_value,若小于中奖率,则中奖
  3. 若不中奖,则根据其他项目(比如积分等),随机出一个结果

当利用负载均衡时,一台负责均衡server后面会挂载多台web server,为了测试某一台服务器时,就可以利用ssh的端口转发功能。

比如,在一台web server上,执行ssh -CfNg -R 19211:127.0.0.1:80 ssh-server-ip,就可以把ssh-server-ip的19211端口映射到该web server的80端口。然后将测试机的hosts配置到ssh-server-ip,就可以测试了。

ps:测试ssh转发是否成功,可以使用tcpdump,在web server上执行:/usr/sbin/tcpdump host ssh-server-ip -vv,查看是否有流量。

这样配置完了之后,最简单的方式就是在ssh-server上进行测试,因为建立的连接,监听的是本地127.0.0.1端口:

tcp        0      0 127.0.0.1:19211             0.0.0.0:*                   LISTEN      –

而对外开放的80端口是:

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      –

这时,也可利用ssh-server作为浏览器的代理服务器,在其他机器上进行测试。

  • 3台机器:ssh-server,web-server,开发机(浏览器)
  • 根据以上的步骤,在web-server和ssh-server间建立了端口转发
  • 将开发机的hosts配置到127.0.0.1,同时利用chrome的proxy switch之类的工具,使用ssh-server作为浏览器代理
  • 在开发机访问:http://hostname:19211/path/,ok

转载1:

zz from: https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/

当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我们带来什么好处吧!

让我们先来了解一下端口转发的概念吧。我们知道,SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。总的来说 SSH 端口转发能够提供两大功能:

  1. 加密 SSH Client 端至 SSH Server 端之间的通讯数据。
  2. 突破防火墙的限制完成一些之前无法建立的 TCP 连接。


SSH 端口转发

如上图所示,使用了端口转发之后,TCP 端口 A 与 B 之间现在并不直接通讯,而是转发到了 SSH 客户端及服务端来通讯,从而自动实现了数据加密并同时绕过了防火墙的限制。


我们先来看第一个例子,在实验室里有一台 LDAP 服务器(LdapServerHost),但是限制了只有本机上部署的应用才能直接连接此 LDAP 服务器。如果我们由于调试或者测试的需要想临时从远程机器(LdapClientHost)直接连接到这个 LDAP 服务器 , 有什么方法能够实现呢?

答案无疑是本地端口转发了,它的命令格式是:

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

在 LdapClientHost 上执行如下命令即可建立一个 SSH 的本地端口转发,例如:

$ ssh -L 7001:localhost:389 LdapServerHost


本地端口转发

这里需要注意的是本例中我们选择了 7001 端口作为本地的监听端口,在选择端口号时要注意非管理员帐号是无权绑定 1-1023 端口的,所以一般是选用一个 1024-65535 之间的并且尚未使用的端口号即可。

然后我们可以将远程机器(LdapClientHost)上的应用直接配置到本机的 7001 端口上(而不是 LDAP 服务器的 389 端口上)。之后的数据流将会是下面这个样子:

  • 我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,
  • 而本机的 SSH Client 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Server 上。
  • SSH Server 会解密收到的数据并将之转发到监听的 LDAP 389 端口上,
  • 最后再将从 LDAP 返回的数据原路返回以完成整个流程。

我们可以看到,这整个流程应用并没有直接连接 LDAP 服务器,而是连接到了本地的一个监听端口,但是 SSH 端口转发完成了剩下的所有事情,加密,转发,解密,通讯。

这里有几个地方需要注意:

  1. SSH 端口转发是通过 SSH 连接建立起来的,我们必须保持这个 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭。
  2. 我们只能在建立 SSH 连接的同时创建端口转发,而不能给一个已经存在的 SSH 连接增加端口转发。
  3. 你可能会疑惑上面命令中的 <remote host> 为什么用 localhost,它指向的是哪台机器呢?在本例中,它指向 LdapServertHost 。我们为什么用 localhost 而不是 IP 地址或者主机名呢?其实这个取决于我们之前是如何限制 LDAP 只有本机才能访问。如果只允许 lookback 接口访问的话,那么自然就只有 localhost 或者 IP 为 127.0.0.1 才能访问了,而不能用真实 IP 或者主机名。
  4. 命令中的 <remote host> 和 <SSH hostname> 必须是同一台机器么?其实是不一定的,它们可以是两台不同的机器。我们在后面的例子里会详细阐述这点。
  5. 好了,我们已经在 LdapClientHost 建立了端口转发,那么这个端口转发可以被其他机器使用么?比如能否新增加一台 LdapClientHost2 来直接连接 LdapClientHost 的 7001 端口?答案是不行的,在主流 SSH 实现中,本地端口转发绑定的是 lookback 接口,这意味着只有 localhost 或者 127.0.0.1 才能使用本机的端口转发 , 其他机器发起的连接只会得到“ connection refused. ”。好在 SSH 同时提供了 GatewayPorts 关键字,我们可以通过指定它与其他机器共享这个本地端口转发。
    ssh -g -L <local port>:<remote host>:<remote port> <SSH hostname>

我们来看第二个例子,这次假设由于网络或防火墙的原因我们不能用 SSH 直接从 LdapClientHost 连接到 LDAP 服务器(LdapServertHost),但是反向连接却是被允许的。那此时我们的选择自然就是远程端口转发了。

它的命令格式是:

ssh -R <local port>:<remote host>:<remote port> <SSH hostname>

例如在 LDAP 服务器(LdapServertHost)端执行如下命令:

$ ssh -R 7001:localhost:389 LdapClientHost


远程端口转发

和本地端口转发相比,这次的图里,SSH Server 和 SSH Client 的位置对调了一下,但是数据流依然是一样的。我们在 LdapClientHost 上的应用将数据发送到本机的 7001 端口上,而本机的 SSH Server 会将 7001 端口收到的数据加密并转发到 LdapServertHost 的 SSH Client 上。 SSH Client 会解密收到的数据并将之转发到监听的 LDAP 389 端口上,最后再将从 LDAP 返回的数据原路返回以完成整个流程。

看到这里,你是不是会有点糊涂了么?为什么叫本地转发,而有时又叫远程转发?这两者有什么区别?

不错,SSH Server,SSH Client,LdapServertHost,LdapClientHost,本地转发,远程转发,这么多的名词的确容易让人糊涂。让我们来分析一下其中的结构吧。首先,SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 。而我们的应用也是有方向的,比如需要连接 LDAP Server 时,LDAP Server 自然就是 Server 端,我们应用连接的方向也是从应用的 Client 端连接到应用的 Server 端。如果这两个连接的方向一致,那我们就说它是本地转发。而如果两个方向不一致,我们就说它是远程转发。

我们可以回忆上面的两个例子来做个对照。

本地转发时:

LdapClientHost 同时是应用的客户端,也是 SSH Client,这两个连接都从它指向 LdapServertHost(既是 LDAP 服务端,也是 SSH Server)。

远程转发时:

LdapClientHost 是应用的客户端,但却是 SSH Server ;而 LdapServertHost 是 LDAP 的服务端,但却是 SSH Client 。这样两个连接的方向刚好相反。

另一个方便记忆的方法是,Server 端的端口都是预定义的固定端口(SSH Server 的端口 22,LDAP 的端口 389),而 Client 端的端口都是动态可供我们选择的端口(如上述例子中选用的 7001 端口)。如果 Server 端的两个端口都在同一台机器,Client 端的两个端口都在另一台机器上,那么这就是本地连接;如果这四个端口交叉分布在两个机器上,每台机器各有一个 Server 端端口,一个 Client 端端口,那就是远程连接。

弄清楚了两者的区别之后,再来看看两者的相同之处。如果你所在的环境下,既允许 LdapClientHost 发起 SSH 连接到 LdapServerHost,也允许 LdapServerHost 发起 SSH 连接到 LdapClientHost 。那么这时我们选择本地转发或远程转发都是可以的,能完成一样的功能。

接着让我们来看个进阶版的端口转发。我们之前涉及到的各种连接 / 转发都只涉及到了两台机器,还记得我们在本地转发中提到的一个问题么?本地转发命令中的 <remote host> 和 <SSH hostname> 可以是不同的机器么?

ssh -L <local port>:<remote host>:<remote port> <SSH hostname>

答案是可以的!让我们来看一个涉及到四台机器 (A,B,C,D) 的例子。


多主机转发应用

在 SSH Client(C) 执行下列命令来建立 SSH 连接以及端口转发:

$ ssh -g -L 7001:<B>:389 <D>

然后在我们的应用客户端(A)上配置连接机器(C )的 7001 端口即可。注意我们在命令中指定了“ -g ”参数以保证机器(A)能够使用机器(C)建立的本地端口转发。而另一个值得注意的地方是,在上述连接中,(A)<-> (C) 以及 (B)<->(D) 之间的连接并不是安全连接,它们之间没有经过 SSH 的加密及解密。如果他们之间的网络并不是值得信赖的网络连接,我们就需要谨慎使用这种连接方式了。


恩,动态转发,听上去很酷。当你看到这里时,有没有想过我们已经讨论过了本地转发,远程转发,但是前提都是要求有一个固定的应用服务端的端口号,例如前面例子中的 LDAP 服务端的 389 端口。那如果没有这个端口号怎么办?等等,什么样的应用会没有这个端口号呢?嗯,比如说用浏览器进行 Web 浏览,比如说 MSN 等等。

当我们在一个不安全的 WiFi 环境下上网,用 SSH 动态转发来保护我们的网页浏览及 MSN 信息无疑是十分必要的。让我们先来看一下动态转发的命令格式:

$ ssh -D <local port> <SSH Server>

例如:

$ ssh -D 7001 <SSH Server>


动态端口转发

似乎很简单,我们依然选择了 7001 作为本地的端口号,其实在这里 SSH 是创建了一个 SOCKS 代理服务。来看看帮助文档中对 -D 参数的描述:

-D port
 This works by allocating a socket to listen to port on the local
 side, and whenever a connection is made to this port, the con-
 nection is forwarded over the secure channel, and the applica-
 tion protocol is then used to determine where to connect to from
 the remote machine.  Currently the SOCKS4 and SOCKS5 protocols
 are supported, and ssh will act as a SOCKS server.  Only root
 can forward privileged ports.  Dynamic port forwardings can also
 be specified in the configuration file.

之后的使用就简单了,我们可以直接使用 localhost:7001 来作为正常的 SOCKS 代理来使用,直接在浏览器或 MSN 上设置即可。在 SSH Client 端无法访问的网站现在也都可以正常浏览。而这里需要值得注意的是,此时 SSH 所包护的范围只包括从浏览器端(SSH Client 端)到 SSH Server 端的连接,并不包含从 SSH Server 端 到目标网站的连接。如果后半截连接的安全不能得到充分的保证的话,这种方式仍不是合适的解决方案。

好了,让我们来看最后一个例子 – X 协议转发。

我们日常工作当中,可能会经常会远程登录到 Linux/Unix/Solaris/HP 等机器上去做一些开发或者维护,也经常需要以 GUI 方式运行一些程序,比如要求图形化界面来安装 DB2/WebSphere 等等。这时候通常有两种选择来实现:VNC 或者 X 窗口,让我们来看看后者。

使用 X 窗口通常需要分别安装:X Client 和 X Server 。在本例中我们的 X Client 就是所访问的远程 Linux/Unix/Solaris/HP,而我们的 X Server 则是发起访问的本地机器(例如你面前正在使用的笔记本或台式机)。把 X Client 端的 X 窗口显示在 X Server 端需要先行在 X Client 端指定 X Server 的位置,命令格式如下:

export DISPLAY=<X Server IP>:<display #>.<virtual #>

例如:

export DISPLAY=myDesktop:1.0

然后直接运行 X 应用即可,X 窗口就会自动在我们的本地端打开。

一切运行正常,但是,这时候 IT 部门突然在远程 Linux/Unix/Solaris/HP 前面加了一道防火墙。非常不幸的是,X 协议并不在允许通过的列表之内。怎么办?只能使用 VNC 了么?不,其实只要使用了 SSH 端口转发即可通过,同时也对 X 通讯数据做了加密,真是一举两得。(当然,使用此方法前最好先咨询相关 IT 部门是否符合相应的安全条例,以免造成违规操作。)

建立命令也很简单,直接从本地机器(X Server 端)发起一个如下的 SSH 连接即可:

$ ssh -X <SSH Server>


X 转发

建立连接之后就可以直接运行远程的 X 应用。注意建立 X 转发之后会自动设置 DISPLAY 环境变量,通常会被设置成localhost:10.0,我们无需也不应该在连接之后再进行修改此环境变量。

一个比较常见的场景是,我们的本地机器是 Windows 操作系统,这时可以选择开源的 XMing 来作为我们的 XServer,而 SSH Client 则可以任意选择了,例如 PuTTY,Cygwin 均可以配置 访问 SSH 的同时建立 X 转发。


至此,我们已经完成了本地端口转发,远程端口转发,动态端口转发以及 X 转发的介绍。回顾起来,总的思路是通过将 TCP 连接转发到 SSH 通道上以解决数据加密以及突破防火墙的种种限制。对一些已知端口号的应用,例如 Telnet/LDAP/SMTP,我们可以使用本地端口转发或者远程端口转发来达到目的。动态端口转发则可以实现 SOCKS 代理从而加密以及突破防火墙对 Web 浏览的限制。对于 X 应用,无疑是 X 转发最为适用了。虽然每一部分我们都只是简单的介绍了一下,但如果能灵活应用这些技巧,相信对我们的日常生活 / 工作也是会有所帮助的。

转载2:

zz from: http://www.cnblogs.com/hexapodsoft/archive/2007/04/24/724826.html

记得第一次做跳板还是高中时代,是台韩国的win2k,装的是Snake的socks代理.
当时还相当紧张,传了一堆工具上去删日志,已经是上世纪末的事了,呵呵.

言归正传,
选择ssh的4个理由:

1、使用方便,功能强大,加密强度高,运行稳定.

2、ssh几乎是*nix系统的标配,不需额外安装.现在的想找台没跑sshd的*nix主机也是件难事.

3、防火墙基本不会对ssh的连接下黑手

4、跨平台,linux BSD UNIX m$ 等不同平台上的ssh都能相互连接.

ssh实现转发,只要用到以下两条命令:

ssh -CfNg -L 6300:127.0.0.1:1080 anyside@192.168.1.119
ssh -CfNg -R 1080:127.0.0.1:6300 anyside@192.168.1.119

不论是做跳板,还是加密隧道,还是加密其他的网络连接也都是这两条命令。
视具体情况而定,有时只要用到其中一条,有时两条都要用到。

条命解释:
-CfNg (照抄即可)
C表示压缩数据传输
f表示后台用户验证,这个选项很有用,没有shell的不可登陆账号也能使用.
N表示不执行脚本或命令
g表示允许远程主机连接转发端口

-L 本地转发

ssh -CfNg -L 6300:127.0.0.1:1080 anyside@192.168.1.119
表示:
1、本机(运行这条命令的主机)和远程主机192.168.1.119建立加密隧道,anyside是远程主机192.168.1.119上的账号。
2、在本机上打开6300端口.用 netstat -an|grep 6300 可看到 127.0.0.1:6300 或 127.0.0.1.6300
3、把本机的6300端口映通过加密隧道射到192.168.1.119的1080端口.

简单说,本机的6300端口就是远程主机192.168.1.119的1080端口。

-R 远程转发

ssh -CfNg -R 1080:127.0.0.1:6300 anyside@192.168.1.119
1、本机(运行这条命令的主机)和远程主机192.168.1.119建立加密隧道,anyside是远程主机192.168.1.119上的账号。
2、在远程主机192.168.1.119上打开1080端口.
3、把本机的6300端口映通过加密隧道射到192.168.1.119的1080端口.

本机的6300端口可直接看作远程主机192.168.1.119的1080端口。

举个实用的例子:
有A、B、C 3台服务器,A,C有公网IP,B是某IDC的服务器无公网IP。
A希望同过B连接C的80端口,A<=>B<=>C

在B上执行如下命令即可:
host-B$ ssh -CfNg -L 6300:127.0.0.1:80 userc@C
host-B$ ssh -CfNg -R 80:127.0.0.1:6300 usera@A

服务器A和服务器C之间,利用跳板服务器B建立了加密隧道。

在A上连接127.0.0.1:80,就等同C上的80端口

需要注意的是:
服务器B上的6300端口的数据没有加密,可被监听,
例:
#tcpdump -s 0 -i lo port 6300

我们是一家创业公司,目前在淘宝、sina、qq、yoka、人人等网站上都运营着自行研发的APP应用,用户过百万,现在正处于业务拓展期,急需web前端开发工程师一名!
职位描述:
web前端开发工程师,负责网站的前端页面开发。
要求如下:
1.熟练使用JavaScript、CSS、HTML语言,若了解前端开发框架(如mootools、jQuery)或浏览器兼容性者加分
2.了解PHP语言,若使用过Linux操作系统者加分
3.聪明、踏实、勤奋
我们能为您提供的:
1.创业的激情,我们正处于高速发展期,加入我们,您会拥有广阔的qian景
2.丰富的学习机会,我们的业务涉及淘宝、sina等各大网站,您将会了解到目前火热的web APP开发技巧
3.web开发从前端到后端(甚至OPS知识),只要您愿意学,我们都会为您实战的机会

今天在火丁笔记上看到介绍了Linux运维利器之ClusterShell,试用了一次,正好符合我上线代码的需求!

我们的环境如下:2台db server,4台web server,全部得通过跳板机登录,且跳板机不转发ssh命令(至少我目前没发现怎样操作),之前仅有2台web server的时候,我都是通过上线脚本,操控svn进行代码的更新。但是现在增长到4台之后,就显得麻烦了!

利用clustershell正好可以解决这个问题!在其中一台server上(我选择了一台web server),安装clustershell(它依赖于python),并且建立conf文件,在/etc/clustershell/groups中配置db和web服务器组:

[admin@v080027 clustershell-1.5.1]$ cat /etc/clustershell/groups
db: 192.168.80.103 192.168.80.104
web: 192.168.80.105 192.168.80.106 192.168.80.27 192.168.80.49
并且建立该server到其他机器的免密码ssh登录方式。

这样,就可以方便的管理其他服务器了!

交互的问题:因为上线前,都是要先比对新旧代码,确定无误后,输入“yes”,才正式merge代码的!由于上线脚本是自己写的,会read stdin的yes or no,所以只需要echo “yes” | ./push.sh 即可。当然,在这之前,需要先进入某一台服务器,查看push.sh的diff输出,确定无误!

虽然简陋,但是暂时可以满足我的需求。所以不再进一步学习了

关于clusterShell 请查阅官网 http://sourceforge.net/apps/trac/clustershell

tar zxvf clustershell-1.5.1.tar.gz

cd clustershell-1.5.1

python setup.py install

mkdir /etc/clustershell

cp conf/* /etc/clustershell

如果遇到 ImportError: No module named setuptools

需要安装setuptools这个扩展

如果不能 yum install python-setuptools(我的机器没有注册就不能yum)

就下载安装下

1. 下载 http://peak.telecommunity.com/dist/ez_setup.py

2. 运行 $ python ez_setup.py


/usr/local/python/bin/nodeset -h

zz from: http://blog.csdn.net/vaal_water/article/details/6967805


在同一次http请求里,如果多次使用mysql_connect连接同一台数据库server(可以是不同的database),那么使用的其实是同一个连接。

当想连接到同一台db server的不同databases时,可能会造成一些误会。

$db1 = mysql_connect('localhost', 'mysql', 'sdPx#&4iov%');
mysql_select_db('tshare', $db1);
$sql = sprintf('select * from shopdesc limit 1');
$ret = mysql_query($sql, $db1);
var_dump($ret, mysql_error());
#var_dump(mysql_thread_id($db1));
var_dump($db1);

$db2 = mysql_connect('localhost', 'mysql', 'sdPx#&4iov%');
mysql_select_db('happy_try', $db2);
$sql = sprintf("select * from product limit 1");
$ret = mysql_query($sql, $db1);
var_dump($ret, mysql_error());
#var_dump(mysql_thread_id($db2));
var_dump($db2);

$sql = sprintf('select * from shopdesc limit 1');
$ret = mysql_query($sql, $db1);
var_dump($ret, mysql_error());
exit;

第二次的connect实际上并不会创建一个新连接,而是使用第一次的连接,所以mysql_select_db也会影响到$db1,导致第三次的query失败。

当这段代码混淆在一个略大的项目里时,可能会比较难发现问题,这时可以利用debug_print_backtrace打印调用堆栈,找出问题。

我们有4台web server了,一个月之内都会apache与nginx并存。

所以需要把分散在各台服务器上的log集中起来,以便于分析。这种需求是非实时性的,所以直接使用定时任务,获取前一天的access log即可。(记得原来MySpace,由于做了一个统一的log管理系统,会基本实时的从log中分析出错误,所以是使用apache的module插入钩子函数,将error log实时同步到log服务器的。)

收集log

选用目前硬盘最大的一台web server作为log server。因为没有单独的机器可用。

log目录分布如下:

192.168.80.105/  192.168.80.106/  192.168.80.27/  192.168.80.49/  sync.sh*

[admin@v080027 weblog]$ cat sync.sh
#! /bin/bash

apachehosts="192.168.80.27 192.168.80.49"
apachelogdir="/home/admin/apps/apache/logs/cronolog"

nginxhosts="192.168.80.105 192.168.80.106"
nginxlogdir="/home/admin/apps/nginx/logs/rotated"

if [ -z "$1" ];then
        yesterday=$(date "+%Y-%m-%d" -d '-1 days')
else
        yesterday=$(date "+%Y-%m-%d" -d "$1")
fi
year=$(date "+%Y" -d "$yesterday")
month=$(date "+%m" -d "$yesterday")

for h in $apachehosts;do
        scp $h:$apachelogdir/$year/$month/$yesterday-taobao-access_log $h/
done

for h in $nginxhosts;do
        scp $h:$nginxlogdir/$year/$month/access_$yesterday.log $h/
done

清除旧log

每台server上,仅保留30天之内的log,并在确保已经被同步到log server的前提下,删除31天前的log。

当log server硬盘使用大于80%的时候,将旧log同步到本地硬盘留存。

数据分析准备

由于每个礼拜都需要出一些统计数据,目前已经积累下一些脚本,但是之前都是手工运行,输出到stdout的。现在准备将每天的数据存储到数据库中。

休息一下哈。

中午与一位师兄聊了下慈善。他们加入慈济有一段时间了,今天问到,我为什么不跟他们一起去做?这个正好是我最近也在思考的问题。

上周末,去凤凰岭的龙泉寺,看到很多义工在辛勤劳作,有很多人甚至抛弃了工作住在寺院里,加班赶点,比世俗间的工作还辛苦。同行的朋友就很感慨和羡慕。而我,当时的想法是,这样会不会耽误了读经修慧呢,有没有适合我的办法可以福慧双修?

很怕自己落入小乘,作个自了汉。

佛陀成道的过程是,先抛弃王位,坐禅,修苦行,再坐禅,开悟,而后讲经说法。上课的时候,法师也说,有些大德高僧,先入深林修行,而后入世度人。我不敢与他们相比,但是希望可以追随他们的脚步。

我现在的处境是,钱不多,力气不足,义理不明。做慈善,捐钱当然可以。而除此之外呢?体力活?做仿事?放粮发粥?如果遇到,而且不耽误工作和研修班的学习,当然可以做!但是,我觉得目前阶段更重要的是,我先多闻了义开智慧。而为了避免偏空,我得多念诵《慈愿的观修法》。待到研修班结束,再合理的安排修福的时间,大致应该是与修慧均等的。

也从佛法的角度,思考了慈善的意义。

慈善,可以使:发未发慈悲之心,增长已发慈悲之心;在实践中检验自己能否做到布施、忍辱、平等、精进、持戒;与师父和同修们共同做事情,可以大众熏修。对于被帮助的人而言,一方面是在物质上的帮助,更重要的是,使之与佛结缘,使之产生向善之心,但这种影响必须是循序渐进的,不可强迫。这些是从俗谛而言,因缘不空。

但金刚经里也说了,不住色声香味触法布施,并且比较了各种布施的功德。我的理解是,从初级阶段而言,财布施不如法布施,因为财布施仅解决一时的问题,还是未能使之脱离六道,而法布施种下菩提种子,能上求佛道才是真殊胜!再进而言之,在证道者的角度来说,财布施、法布施、声香味触布施,都是最殊胜、无高下的。因为他不再去比较功德的高下、也不求功德,看一切皆空,于是随缘遇到,随缘解救,甚至于同体大慈,无缘大悲,他的慈悲便于一切。

有两台新web server,安装了nginx。

针对一个使用了cake框架的php页面进行测试,QPS一般:

[admin@v080106 ~]$ http_load -rate 150 -fetches 1000 url.txt
1001 fetches, 42 max parallel, 3.05168e+07 bytes, in 6.19799 seconds
30486.3 mean bytes/connection
161.504 fetches/sec, 4.92366e+06 bytes/sec
msecs/connect: 0.792364 mean, 2.938 max, 0.464 min
msecs/first-response: 193.135 mean, 335.771 max, 65.338 min
165 bad byte counts
HTTP response codes:
code 200 -- 1001

针对简单dispatch、无数据库访问、无缓存访问的简单php页面进行测试,结果如下:
[admin@v080106 ~]$ http_load -rate 300 -fetches 1000 url.txt
1000 fetches, 7 max parallel, 9.18e+06 bytes, in 3.01104 seconds
9180 mean bytes/connection
332.111 fetches/sec, 3.04878e+06 bytes/sec
msecs/connect: 0.674325 mean, 1.473 max, 0.608 min
msecs/first-response: 7.91767 mean, 21.442 max, 3.811 min
HTTP response codes:
code 200 — 1000
[admin@v080106 ~]$ http_load -rate 500 -fetches 2000 url.txt
2000 fetches, 23 max parallel, 1.836e+07 bytes, in 4.01347 seconds
9180 mean bytes/connection
498.322 fetches/sec, 4.5746e+06 bytes/sec
msecs/connect: 0.637268 mean, 1.545 max, 0.44 min
msecs/first-response: 11.1222 mean, 90.108 max, 3.837 min
HTTP response codes:
code 200 — 2000
[admin@v080106 ~]$ http_load -rate 1000 -fetches 2000 url.txt
2001 fetches, 103 max parallel, 1.83692e+07 bytes, in 2.06406 seconds
9180 mean bytes/connection
969.446 fetches/sec, 8.89952e+06 bytes/sec
msecs/connect: 0.645176 mean, 3.22 max, 0.447 min
msecs/first-response: 68.083 mean, 389.825 max, 7.071 min
HTTP response codes:
code 200 — 2001

没有再增大压力了,QPS达到1000,我们已经足够了~

准备新增两台web server,除了代码,还依赖其他的一些配置和软件,记录如下。

/etc/hosts

数据库、缓存、cabinet使用hostname的形式,这样更改起来比较方便,不用在代码里面找了。

另外,应该是由于VIP配置的原因,如果在server上访问我们的外网域名,会无响应,所以将其全部配置到127.0.0.1。

192.168.80.103 database1.try8.info # online: happy_try, tshare
192.168.80.104 database2.try8.info # online: tryapp_*, captcha
192.168.80.105 memcache1.try8.info
192.168.80.106 memcache2.try8.info
192.168.80.27 cabinet1.try8.info
192.168.80.49 cabinet2.try8.info
127.0.0.1 itry.try8.info
127.0.0.1 i.try8.info
127.0.0.1 qq.try8.info
127.0.0.1 sina.try8.info
127.0.0.1 renren.try8.info
127.0.0.1 yoka.try8.info

php.ini配置

由于几个旧项目用了session存储用户信息。

session.save_handler = memcache
session.save_path = “tcp://memcache2.try8.info:11211″

log目录

另外,一些log地址需要修改,使指向/tmp/[product].log。 (touch /tmp/taobao.log /tmp/tshare.log /tmp/admin_core.log 建立文件,以避免:SAFE MODE Restriction in effect.  The script whose uid is 500 is not allowed to access /tmp owned by uid 0)
调用taobao接口的log地址记录在/tmp/taobao/logs下面。
调用taobao接口的缓存地址/tmp/LtStoreFile/。
nginx日志记录在/home/admin/apps/nginx/logs下面。
php的error_log 记录在 /home/admin/apps/nginx/logs/php.err.log里。

nginx的rotate log脚本

[admin@v080105 sbin]$ cat cut_log.sh

#!/bin/bash

# This script run at 00:00

#0 0 * * * cd /home/admin/apps/nginx/sbin; ./cut_log.sh

# The Nginx logs path

cur_path=”/home/admin/apps/nginx/logs/”

logs_path=”/home/admin/apps/nginx/logs/rotated/”

pid_file=”/home/admin/apps/nginx/logs/nginx.pid”

mkdir -p ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/

mv ${cur_path}access.log ${logs_path}$(date -d “yesterday” +”%Y”)/$(date -d “yesterday” +”%m”)/access_$(date -d “yesterday” +”%Y%m%d”).log

kill -USR1 `cat $pid_file`  # not restart, just ask nginx to reopen log file

NFS

由于涉及到图片上传,我选用的是NFS,所以需要建立新服务器到NFS server的连接。

以及本地的图片缓存目录: /tmp/stry_img_cache/。

代码

两个项目,由于新的nginx服务器和老的apache服务器将并存一段时间,所以依然部署在apache的htdocs下,这样也不用修改push脚本了。需要部署项目代码和push脚本。

系统自动启动任务

#/etc/init.d/mysqld start

#/home/admin/tools/ttserver_start.sh

/home/admin/apps/memcached/bin/memcached -d -p -m 512 -u root -p 11211 -c 1024 -P /home/admin/memcached/pid/mem.pid

#/home/admin/apps/apache/bin/apachectl -k start

/home/admin/apps/phpcgi/sbin/php-fpm start

/home/admin/apps/nginx/sbin/nginx

service vsftpd start

mount -t nfs 192.168.80.49:/tmp/stry/ /tmp/stry/

CRONTAB

0 0 * * * cd /home/admin/apps/nginx/sbin; ./cut_log.sh