操作
Lighty + Runit --> (几乎)不中断的服务 :)¶
过去我遇到过lighty的稳定性问题,因此最终使用了一个用shell编写的简单监控程序。
很久以来我都不太需要它,但我认为runit会比shell脚本+cron提供一个更优雅和健壮的解决方案。
以下是我在Debian SID上进行快速测试并使其工作的方法
- 安装所需组件
wajig install lighttpd wajig install runit这负责两种软件的基本配置。
- 创建服务目录和服务脚本
#!ShellExample # mkdir -p /etc/sv/lighttpd/log/ # cat <<EOF >/etc/sv/lighttpd/run #!/bin/bash exec lighttpd -D -f /etc/lighttpd/lighttpd.conf 2>&1 EOF # # cat <<EOF >/etc/sv/lighttpd/log/run #!/bin/bash exec chpst -u nobody svlogd -tt /var/log/SV/ EOF # # chmod +x /etc/sv/lighttpd/run /etc/sv/lighttpd/log/run
- 设置日志目录
#!ShellExample # mkdir -p /var/log/SV # chown nobody /var/log/SV
- 通知runit新服务并将其从init的控制中移除
#!ShellExample # ln -s /etc/sv/lighttpd/ /var/service/ # update-rc.d -f lighttpd remove Removing any system startup links for /etc/init.d/lighttpd ... /etc/rc0.d/K20lighttpd /etc/rc1.d/K20lighttpd /etc/rc2.d/S20lighttpd /etc/rc3.d/S20lighttpd /etc/rc4.d/S20lighttpd /etc/rc5.d/S20lighttpd /etc/rc6.d/K20lighttpd
- 检查状态
#!ShellExample # sv status lighttpd run: lighttpd: (pid 4979) 19s; run: log: (pid 4606) 18s #
注意:这种方式对于单个服务来说日志记录没问题,但如果你有多个进程记录到同一个目录,可能会出现问题。
我没试过,所以不知道 :)
如果能让它通过syslog记录lighty启动的问题会很好,但我没能让它工作。
下面这行本应该可以处理它,但对我来说没有按预期工作。结果可能因人而异(YMMV)。
#!ShellExample $ echo "U127.0.0.1" > /var/log/SV/config
记录到文件和启动错误到syslog¶
另一种处理日志的方式是配置lighty将错误记录到文件(error.log),并将启动错误(stderr)重定向到syslog。
#!ShellExample # cat <<EOF >/etc/sv/lighttpd/log/run #!/bin/sh exec >/dev/null exec 2>&1 exec chpst \ -unobody \ \ logger -d -p daemon.err -t lighttpd EOF
如果我们希望error.log由svlogd进程处理,我们可以从lighty启动它,只要它支持该功能即可。;)
(参见 #822)
使用runit进行优雅重启¶
借助一个微小的(信号)包装器,这成为可能,它
- 转发SIGINT(并立即退出以进行快速重启,lighttpd会分离并在后台完成)
- 将SIGTERM转换为SIGINT(并等待优雅关机)
注意:每个lighttpd进程的fastcgi套接字必须唯一命名,否则旧的(正在优雅完成的)和新的(正在启动以处理新请求的)lighty将争用套接字。只需在套接字名称中插入var.PID即可。(这要求fastcgi进程由lighttpd启动。)
(这项优雅重启的要求并非runit独有。)
编译
#!ShellExample $ gcc -o sigintwrap sigintwrap.c
使用
#!ShellExample # cat <<EOF >/etc/sv/lighttpd/run #!/bin/sh exec sigintwrap lighttpd -D -f /etc/lighttpd/lighttpd.conf 2>&1 EOF