Filed under: t

Nginx模块中调用ngx_localtime()可能死锁

March 19th, 2010

如果设定了timer_resolution并在自己的模块中调用了ngx_localtime()nginx极有可能失去响应。

原因看来是localtime_r(3)信号不安全。nginx内部会用ngx_time这个变量中存下当前的时间,默认是在每次event循环中更新这个变量,减少gettimeofday(2)的调用次数。设置timer_resolution参数会导致nginx使用SIGALRM信号来定时更新,作者认为这样会有更好的精度。触发信号处理函数ngx_timer_signal_handler()后,里面调用ngx_localtime(),最后落实到glibclocaltime_r(3)。由于localtime_r(3)信号不安全,这样自己的模块代码中也进行了ngx_localtime()调用的话,两者很容易冲突而死锁(不知道我说清楚了吗)。

这个问题看起来也没什么好修正的,不要在自己的模块里面用ngx_localtime()就好了。如果不需要设定timer_resolution,可以假装一切都很正常。我现在使用ngx_timeofday()/ngx_gmtime()来格式化时间,目前情绪稳定。

Update: nginx 0.7.66 已经修正了此问题。

参考:

ps: 为了这篇post,山寨了个在Windows Live Writer里面给选定文字加<code>标签的插件,有需要的同学吗……

Tags: , , , , ,
Posted in t | 1 Comment »

当前窗口最小化的快捷键

January 4th, 2010

Windows 下面有最小化所有窗口的快捷键, 但默认没有最小化当前窗口的快捷键. 解决方法(之一)是使用仅16.5k的神器 HoeKey.

安装运行 HoeKey 后, 按Win+Q呼出配置界面, 选择编辑配置文件, 加入一条:

~0=Msg||274|61472

这样就可以用快捷键 Win+0 来最小化当前窗口了.

同理可以写 ~9=Msg||274|61488 来用 Win+9 最大化当前窗口.

更多自定义触发快捷键以及 HoeKey 功能, 见帮助文档以及MSDN.

Tags: , , , , ,
Posted in t | 4 Comments »

Lighttpd覆盖设置http头

December 6th, 2009

lighty 1.4 的 setenv 模块是可以操作 http 头的, 但它提供的三个指令实际只是把给定的值附加进去, 如果处理的请求本来有同名的头, 会变成这样:
Host: foo.com, bar.com

X_FORWARD_FOR 这样的头可以如此处理, 但 Host 之类就不是希望的结果了.比如作为代理时, 伺服的主机名和后端伺服的不同, 需要覆盖掉 Host 头.

lighty 1.5 和 nginx 都提供了对应的指令, 1.4 下面得自助. 这里我添加了一个 set-request-header 指令, 顾名思义(set vs add), 会用给定值覆盖设置请求头的值. 响应头的因为我用不到所以没实现, 需要的同学自己折腾吧.

patch 放在 lighty 的论坛上, 但几个月了没人理, 是没人需要鹰语太烂还是要开 issue 才行?

Tags: , , , , , , , ,
Posted in t | 2 Comments »

Fiddler中显示当前连接的主机地址

November 9th, 2009

我(曾经)觉得 HttpWatch 比 Fiddler 强的一处是,可以显示当前 http 会话中对话主机地址。其实 Fiddler 也早就可以了,而且更强大。方法是点菜单的Rules > Customize Rules,找到并修改文件中的Main()部份:

static function Main()
{
    FiddlerObject.UI.lvSessions.AddBoundColumn("HostIP", 50, "x-
hostIP");
}

Fiddler 的订制能力挺强,参考它的文档可以加入很多元素。它的作者人很好,论坛里面帖子回复很及时。

另外,由于 .NET 中DNS.Resolve()不会进行缓存,所以在 Fiddler 代理时对 hosts 文件的修改可以即时生效。

Tags: , ,
Posted in t | 6 Comments »

Nginx模块开发小记

September 4th, 2009

前阵子在折腾Nginx的模块, 很有趣.

为了方便使用调试器, 可以单进程非daemon方式启动, 使用参数:

daemon off;
master_process  off;

因为Nginx是事件驱动, 在读request body时, 第一个数据包一般发送不全, 需要异步读取余下的.

当在主handler部分调用ngx_http_read_client_request_body时, 需要注册一个回调的handler, 然后主handler直接返回NGX_DONE, 告诉Nginx留下这个请求的事件注册, 继续接收数据包.

经过若干次循环最终读完request body后, Nginx会去回调被注册的handler, 在此函数中产生响应, 最后调用ngx_http_finalize_request结束整个请求. 大概流程是:

ngx_http_foo_handler(){
    ngx_http_read_client_request_body(r, ngx_http_foo_post_handler);
    return NGX_DONE; // 主handler结束
}
ngx_http_foo_post_handler(){
    // 请求全部读完后从这里入口, 可以产生响应
    ngx_http_finalize_request(r, NGX_HTTP_OK);
}

一般的模块都是同步方式的, 我开始就没搞明白这异步读到底怎么搞, 走了不少弯路. 代码上可以简单参考dav模块, 复杂点还有upload模块.

Nginx可能会把request body放到两个buffer里面, 太大的话也可能存入文件中. 如果要在模块中读取request body进行处理, 自然不希望搞太麻烦,可以:

r->request_body_in_single_buf = 1;

使body存在一个buffer里面, 配置里面要留够需要的大小.

如果没有特殊的要求, 这类模块也可以拿 embedded perl 来写. 响应产生, sendfile都支持. Perl的开发效率自然很高, 维护也方便. 作者说此功能还是"experimental",  但实测了下没出啥问题.

我本着先写原型的目的试验了下, 结果发现性能还不错, 在双路5130机器上, perl版本的可以达到15k req/s (使用ab测试), 非常够用了.

Tags: , , , , ,
Posted in t | 4 Comments »

通过ssh使用svn

October 18th, 2008

通过ssh来存取svn仓库自然是很方便的,不用架设webdav服务,不用多侦听一个端口等等。一般这样就可以工作了:

svn co svn+ssh://host/path/to/svn/repos

如果ssh不工作在默认的22端口上,如2222,有两个办法解决:

# 设置SVN_SSH变量:

export SVN_SSH="ssh -p 2222"

# 也可以编辑~/.subversion/config,其中有tunnel一节,加入:

proa = ssh -p 2222

然后就可以这样用了:

svn svn+proa://host/path/to/svn/repos

如果遇到错误"bash: svnserve: command not found",是因为svn调用ssh后得到是非交互shellPATH环境变量有些不同,无法直接找到svnserve。可以试着在放置svn仓库的主机上加入相关路径到.bashrc,或者给svnserve/usr/bin下面加个符号链接,确保非登陆shell可以找到svnserve。也可以搞的很复杂:

生成一组新的ssh密钥对,用下面的格式把公钥放到svn主机上

command="/full/path/to/svnserve -t" TYPE KEY COMMENT

客户机用类似前面指定端口的方法指定的私钥

export SVN_SSH="ssh -p 2222 -i /home/dude/.ssh/id_svn_only"

这样svn在通过ssh隧道连接时就可以启动svnserve了。

Posted in t | No Comments »

SSH登陆,用XShell

August 25th, 2008

我觉得XShell是Windows上目前最好的终端模拟器,但似乎大家只看到SecureCRT,很少人提XShell。

XShell vs. SecureCRT

  • screen下的会话不会闪屏,而且可以回滚,这个功能太赞了
  • Script的执行顺序可以调整,SecureCRT的这个部份实在太呆
  • 可以同时发送指令到多个session,这个也不错
  • 键盘映射的兼容性要好一些,不用去自己改
  • 可以展现tunnel等的情况
  • 支持布局切换,像gnome-terminal
  • 缺憾是对Unicode制表符支持不够好,内置的sftp不怎么好使(该公司有另外的xftp)
  • 许可相对便宜,对个人、教育用户免费

XShell vs. Putty & Pietty

  • 支持ZModem协议,putty虽有leputty据说可以实现,但我一直没成功 :(
  • Session保存在文件中而非注册表,管理方便
  • 支持tab、自定义脚本、保存密码、多机管理…

当然putty是自由软件,和商用的XShell比较不是很合适。putty也有很多插件可以实现部分有缺憾的功能,用起来会麻烦一些就是了。我个人平常还是以putty为主,功能够用,速度飞快。登陆大量机器还是XShell合适。

注意,XShell在商业环境使用下是需要买许可的。

 

update:

SecureCRT 使用screen时屏幕闪烁,关闭 visual bell 就好了,putty 也是如此:

$ cat >> ~/.screenrc
# turn visual bell off
vbell off

Tags: ,
Posted in t | 9 Comments »

Launchy的转换时间戳插件

August 9th, 2008

看开幕式,入场式时段很无聊,决定冒充一下程序员,给 Launchy 写个小插件,让它能转换时间戳。

搞阿搞,终于搞出来鸟,个中艰险,按下不表。

Launchy是我必用的工具,转换时间戳也老要干,呃,还是很有用的。如图:

2008-08-09_222104

我用的是比较老的Launchy 1.25,我也推荐用这个版本的,2.0为移植用了QT,大了不少。

下载: LaunchyTimestampPlugin.7z

Tags: , ,
Posted in t | 1 Comment »

Next page Previous page