用 SYSOP 风格的方法研究 spawn-fcgi

不怕大家笑话,以前我一直不明白为啥会有 spawn-fcgi 这个东西。因为以前都是用 PHP 啊,PHP 本身就是可以并发处理多个请求的 fastcgi server 啊,要 spawn-fcgi 干啥用呢?更有意思的是有人用 spawn-fcgi 启动多个 php-cgi ,然后这个 php-cgi 再启动多个子进程,不知道有什么好处。

前几天,我读了一下代码,还是没太明白这个东西存在的必要性,于是就用我们 SYSOP 的方法研究了一下 spawn-fcgi:

fakefcgi.sh脚本文件
#!/bin/sh
ls -l /proc/self/fd/ >/var/log/$$.txt
sleep 600s

执行
spawn-fcgi -p 3333 -F 5 -- ./fakefcgi.sh
得到结果
spawn-fcgi: child spawned successfully: PID: 16868
spawn-fcgi: child spawned successfully: PID: 16871
spawn-fcgi: child spawned successfully: PID: 16872
spawn-fcgi: child spawned successfully: PID: 16873
spawn-fcgi: child spawned successfully: PID: 16874

执行pstree发现spawn-fcgi没在运行,各个fakefcgi.sh都直接隶属于init。看来是个daemonizer。

再看日志文件:
# cat *.txt
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16868.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16869/fd
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16871.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16875/fd
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16872.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16877/fd
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16873.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16876/fd
总用量 0
lrwx------ 1 root root 64 10月 22 14:07 0 -> socket:[281459]
l-wx------ 1 root root 64 10月 22 14:07 1 -> /var/log/16874.txt
lrwx------ 1 root root 64 10月 22 14:07 2 -> /dev/null
lr-x------ 1 root root 64 10月 22 14:07 3 -> /proc/16878/fd

执行
# netstat -ane|grep 281459
其中 281459 是前面的 socket 号码。得到的结果是:
tcp        0      0 0.0.0.0:3333            0.0.0.0:*               LISTEN    0          281459
现在明白了,原来spawn-fcgi只是让多个单循环的 fastcgi server 监听在同一socket上而已。直接调用 libfcgi 库,主程序里只有一个 fastcgi 处理循环,这样开发出来的 fastcgi server 就需要 spawn-fcgi 配合,要不然就无法处理并发的请求。

Posted in 默认分类 | Tagged , , | 1 Comment

nginx 的 if 语法好严格呀!

今天被机房通知删网站内容,我发转给相应的同事了。然后我自己就在 nginx 里折腾看能不能先把那个网址改成 403。试了半天,发现 nginx.conf 里用 if 指令判断 querystring 里的内容的时候,等号前后都得有空格,像这样:
if ( $arg_uid = 877363 ) { return 403;}
如果没有空格就不行,看着像是 nginx 不知道那个变量名和操作符号有多长,需要用空格来分隔的意思。

Posted in 默认分类 | Tagged | Leave a comment

在小饭馆看到的 HTTP 502 错误实例

周五拉着 wincss  去蓟门里的螺蛳粉先生吃饭,期间见到了一个场景,颇像当年 5D6D 网站遭遇的 502 错误。

我和 wincss 到饭馆的时候,屋里已经没有座位了。但是既然来了也不能轻易放弃啊,于是要求店家在外面支了桌子。其实瓶颈主要在于厨房(数据库),厨房做饭太慢,外面的客户只好先排着。在客人数量(请求数量)没有超出饭馆桌椅数量( fastcgi server 的进程和 backlog 上限)的情况下,系统 load 迅速增大,但还没崩溃,此时所有的吃饭请求都挂着,处于 I/O blocked 状态。

过了一会,饭还没做好。有些人等不及就撤了,于是发生了 HTTP 504 Gateway Timeout 错误。而不断前来的客人开始怨声载道(因为他们站在饭店门口的路上,所以载道),此时就发生了 HTTP 502 Bad Gateway 错误。

502、504 错误的根本原因在于系统搭配不均衡,后端的单点瓶颈和前端负载能力过于强大的搭配是不合适的。唯一值得庆幸的是,即使厨房很慢,我们索要辣椒调料的请求还是得到了满足,类似于 fastcgi 请求无法满足的时候,静态文件请求仍能满足的情况。

Posted in 默认分类 | Tagged , | 3 Comments

买了个相机

自从上次妈妈来京参加合唱比赛,让我负责摄影,第一次接触了单反和变焦镜头,就迷上了影像凝固的乐趣和快门的声音。

经过两个星期的背景知识学习、品牌认知、商业情报调查,今天终于在位于五棵松北的北京摄影器材城买了一台 Nikon D90 套机,花费 7100 元。另购有 8G 容量 Class4 速度的 SD 卡和用于保护镜头的所谓 UV 镜(当然,大家都知道这个价格的 UV 镜是防不了紫外线的)

出了器材城,在公交车站看到一位漂亮小 mm,但是我脸皮太薄,没好意思拍之,实在是可惜,可惜!

晚上到家,换上 bugs 给的 90周年纪念版背带,感觉确实比原装的好一些。

本次采购,鸣谢bugs、Jackos、谢珮英同学等。

Posted in 默认分类 | Tagged , , , | Leave a comment

高温步行

没注意,昨天竟然是最高温的一天,恰恰在这天,我突发奇想要去看广场降旗。

下班后,顺着建国路、建国门内大街、长安街疾行了54分钟,到广场。GPS记录显示:平均10分28秒就能走一公里。广场上,两个便衣士兵陪军装士兵聊天,要不然我觉得那个军装士兵可能也会像游客一样晕倒。降旗之后我觉得自己的脚底板都发烫。刚刚降旗完毕,就清场了,广播、警察和武警把游客送出了广场。我从地下通道出广场的时候突然感觉有点眩晕,可能是天太热了,出汗太多了。想买瓶水,却发现附近只有游商。唉,还是不放心啊。无奈,接着走吧。走到电报大楼对面,终于有了一条小街道,拐进去果然有商店,旁边还有个厕所呢!长安街还是太政治了,连摆摊都不让,真是的!喝了水,感觉好多了。不过因为出汗太多,那个厕所我也没用得上。

接着走,到新文化街视察了一下《功夫梦》的拍摄地鲁迅中学。不过当时已经很晚了,用手机拍照几乎无法成像。步行走回西单,地铁回家去也。

今天中午在 Google Earth 量了一下,昨天步行的里程约8.5km。

Posted in 默认分类 | Tagged , , , | 1 Comment

RHEL6 作为 xen domU 虚拟机,启用 hvc0 的方法

今天在 xen  虚拟机里安装了 RHEL6 beta,发现因为 sysvinit 被换成 upstart 之后,竟然不知道在哪里启用 hvc0 上的 getty 了。尝试改变 /etc/sysconfig/init 把 hvc0加到 ACTIVE_CONSOLES 里,但是开机时提示 hvc0 permission denied 之类的提示信息。

最后还是在内核上加 console= 参数了。不过注意:必须写成 console=tty console=hvc0 这样,其中 tty 那一项可以用 console=tty 也可以用 console=tty1。

  • 如果只加console=hvc0 则用VNC查看虚拟机的时候看不到开机时的 dmesg 和服务脚本启动信息
  • 如果顺序反了,最后不会启动 agetty 在 hvc0 上,该行为在 /etc/init/serial.conf 提到了

RHEL6 在启动脚本中自动检测内核参数中最后一个 console 参数是否为串口,如果是串口就在上面运行一个 agetty 。不知道其它使用 upstart 代替 sysvinit 的发行版是否也有类似行为。

Posted in 默认分类 | Tagged , , , | 4 Comments

因为迪卡侬没有剪掉防盗标签,害我进了一次物美超市的小黑屋

在迪卡侬运动超市买过裤子之后,他们既没有给我剪掉防盗标签,也没有提醒我自己剪掉,我一直以为里面装的是备用扣子呢。结果今天因为这个被扣在物美超市保安室了。人生何其圆满!

Posted in 默认分类 | Tagged , , | 2 Comments

bind + mydns 大容量智能 DNS 的方案简述

大体上就是 bind 上启用 view 功能,然后把请求转发给后端的多个 mydns。不过遇到的问题是,如果用 zone {type “forward”;} 的话,会导致  bind 给出的解析结果里缺少 AA 标志位,而且还会带上 ADDITIONAL SECTION,而这个 ADDITIONAL SECTION 指向的恰恰是 bind 自己,于是有时会造成循环。

怎么让 bind 认同自己事实上的权威地位,成了方案的关键。想了几个小时,终于明白了只有 master 和 slave 才能给出带 AA 标志位的应答。master试过了肯定是不行的,因为必须有 file 参数。后来试了试 slave,竟然只需要 masters 参数即可。

最终方案是两横两纵的:

1 一个域有两个 NS 服务器

2 每个 NS 服务器里有两个 DNS 软件:前端带 view 功能的 bind,和后端带数据库访问功能的 mydns。后端 mysql 存储做成 replication 形式

3 bind 作为 mydns 的 slave,所以 mydns 必须开启 AXFR 和 TCP

4 更新域名时,需要在 master mysql 上做修改。记住必须修改 SOA 记录中的序列号。考虑到在这个架构中,我们并没有计划在两台 bind 之间做域传送,为了使修改快速生效,建议缩短 SOA 中指定的刷新时间,以快速激发 bind 从 mydns 获取域数据

Posted in 默认分类 | Tagged , , , , , | 2 Comments

很不幸,又遇到bug了——MySQL replication故障

我就说 RedHat 的软件质量不好,还总有人不信。这次又找到证据了。

RHEL5.4/5.5 里带的 mysql-server 包

# rpm -qi mysql-server
Name        : mysql-server                 Relocations: (not relocatable)
Version     : 5.0.77                            Vendor: Red Hat, Inc.
Release     : 4.el5_4.2                     Build Date: Sat 30 Jan 2010 03:11:47 AM CST

存在 replication 时,slave 跟不上 master 的问题,但 show slave status\G 显示正常,俩线程都在运行且没有 Error 发生。在 slave 上执行 stop slave;start slave; 就能跟上了。问题是我不能一直手工去重启动 slave 线程吧?幸亏是给 mydns 做存储用的,否则就恶心死了。

报了bug,等升级!

Posted in 默认分类 | Tagged , , , | Leave a comment

港澳游第四天

4月6日是我第一次出境旅游的第四天,任务列表:

  1. 水瑞士军刀一把
  2. 水充电电池十六颗
  3. 视察香港科技大学
  4. 回墙内

早晨起床,跟旅馆说要回大陆了,倒也不用办啥手续。热情的老板看到我手里的空水瓶,还让我装了一瓶水。其实我原来不知道那个小旅馆还有一个公共小房间,类似于写字楼的茶水间的。

出门,步行走到海港城的港威商场。这里的商场没写中文名字,只写了THE GATEWAY,我觉得发音大概就是,进去问了果然就是。游荡了一圈找到瑞士军刀的店,没上班。于是地铁坐了两站去电池店,也没上班。原来他们都是11点才上班的。于是返回瑞士军刀店,看店员盘点货物打扫卫生,到11点整,店员翻过来CLOSED牌子,我才进去。一边给同学打电话详细问买啥型号,一边跟店员沟通。这个店是用远程桌面登录到中心服务器上,运行ERP软件的,可以查到香港各店的存货量,不过他们主要是以“片号”作为依据,所以我又打开网站查了商品名和片号的对应,成功买下。
此时再去电池店,买了十六颗充电电池。

然后坐地铁去彩虹站。下车后走错方向了,没看到公交车站,又问了乡市政大厦的保安,他又不会说普通话。我拿出手机打字,终于得到了指点,在地铁另一侧找到公交车站。九巴的车是有显示屏报站的。没几站,车就进山了,雾蒙蒙的,似乎路过了一座监狱。到大学门口,哥哥在车站接我,于是和哥、嫂、婴儿侄子、哥哥的丈母娘一起在学校餐厅吃饭。饭后,哥哥带着我在学校转了一圈。科技大学并不算很小,大概是因为在远郊区的缘故吧?足球场、自助烧烤在海边;实验室在中间;图书馆、餐厅、健身房在高处。据说射雕英雄传以前在这里拍摄的,后来被政府征地建了大学,邵氏很不高兴,所以从来没给该校捐资。该校的图书馆就是卖六合彩的香港赛马会捐建的。

参观完学校,去黄大仙看了看,一个很小的祠庙,有佛道儒三教的成分。祠旁边又是flg标语。因为很小,很快参观完毕,就开始回大陆了。

坐地铁到九龙塘站,换乘,原来东铁线是在地面上的,类似于北京13号线;正感叹,发现一列DF11牵引的广州东-九龙列车开过去,更加感叹!用游客全日通坐到上水站,出站换票,20元,自动售票机找零很多硬币,唉。

罗湖站下车,出站、过关。在中立区有中国检验检疫的流行病健康申报,需要填写最近去过哪里,是否接触过流行病人,如何联系等等。进入深圳之后,发现原来深圳火车站就挨着罗湖口岸!!果然是用笔画了一个圈的城市!邮局旁边坐机场2线小巴去机场。不知道为什么我的航班不能网上办理也不能自助机办理,最后还是去了柜台。然后把电脑从背包掏出来,给背包打包捆扎,补托运。结果安检报警,而安检员又等了很久才来,看了录像之后问我带了啥电池,我说是镍氢的,他又问给啥设备用的,我说收音机。于是没开包检查就放行了。安检时我抢了一个篮子先放东西,比我前面那位还先过去。很奇怪今天金属腰带扣没有被安检门报警。安检之后迅速跑过去,19点37分。按说19点30就开始登机了,但一直等到40多分才开始。飞机门口写着本飞机由中国国际航空公司租用。等了不少时间才推出,路上空姐才广播机长和乘务长姓名。几位空姐和空哥挺活泼的。好不容易熬到北京,下飞机一看,原来是澳门航空公司的飞机。那大概空服和飞行员也是澳门航空的吧?来回两次飞行都没看到飞机铭牌,不知道是不是改位置了

Posted in 默认分类 | Tagged , , , , | Leave a comment