项目

概况

个人资料

操作

Lighty + Runit --> (几乎)不中断的服务 :)

过去我遇到过lighty的稳定性问题,因此最终使用了一个用shell编写的简单监控程序。
很久以来我都不太需要它,但我认为runit会比shell脚本+cron提供一个更优雅和健壮的解决方案。

以下是我在Debian SID上进行快速测试并使其工作的方法

  1. 安装所需组件
wajig install lighttpd
wajig install runit
这负责两种软件的基本配置。
  1. 创建服务目录和服务脚本
#!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

  1. 设置日志目录
#!ShellExample
# mkdir -p /var/log/SV
# chown nobody /var/log/SV
  1. 通知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
  1. 检查状态
#!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

由匿名用户更新 近13年前 · 8次修订