如何使这组命令(重新启动服务器)变得更容易?

如何使这组命令(重新启动服务器)变得更容易?

我在 Debian Jessie 服务器上运行 Nginx、FCGI 和 Request Tracker。 Request Tracker 由 Nginx 提供服务,但 FCGI 位于它们之间。重要的是 FCGI 服务器有时会出现故障,导致 RT 用户看到 502 错误。修复很简单,但这只是因为我在过去一个月左右的时间里已经完成了无数次。如果我不在并且其他人必须重新启动 FCGI 服务器,他们可能会遇到困难。另外,停止和重新启动服务器很烦人,但您需要这样做才能将更改应用到 RT。

所有这一切都让我想到这一点:如何才能最好地使命令变得更简单?一个脚本?一项服务,所以它存在于/etc/init.d?还有别的事吗?我是 Debian 和 Linux 的新手,所以不太了解我的选择或每个选择的参与程度。以下是您必须发出的命令:

netstat -antp | grep LIST | grep 12345

(这会找到绑定到端口12345的FCGI服务器,因此我可以获得PID。假设我们的PID是8091。)

kill 8091
spawn-fcgi -u someUser -g someGroup -a 127.0.0.1 -p 12345 /opt/rt4/sbin/rt-server.fcgi

这里的一个重要注意事项是该netstat命令不能返回任何内容。如果确实如此,则 FCGI 服务器已无提示地发生故障,因此您可以跳过该kill命令并直接执行该spawn-fcgi命令。否则,请保留该kill命令。

理想情况下,我希望有启动/停止/重新启动选项,例如/etc/init.d/rt-fcgi-server.不过,我不知道如何终止该进程,因为需要先找到 PID。我考虑过使用一个.pid文件,但我不知道如何告诉spawn-fcgi使用一个文件,也不知道如何处理这样的文件,即使我有它。我什至不知道它是否会执行我想要的操作(保留 PID,这样我就可以避免使用该netstat命令)。

我希望这一切都是有道理的。我基本上希望有一个命令或与 相关的命令/etc/init.d来控制命令的结果spawn-fcgi。我希望非 root 用户(他们对 Linux 的了解比我还少)能够登录并运行单个命令,并且我不介意在不使用 的情况下查询此进程的状态netstat,即使我不必获取 PID 来杀死它。这样我就可以使用 Monit 之类的东西在服务器失败时自动重新启动服务器。

答案1

我将从 FreeBSD 的角度来写这个答案,但它应该适用于 Linux 和 Debian ...软件包名称和其他内容可能会改变。

我同样对spawn-fcgi 不满意。在 FreeBSD 上,它有一个 rc.d 脚本,但它不遵守 rc.d 规则(例如,它不能“重新启动”)。

然而,在spawn-fcgi手册的底部,它提到了监督。通过一些搜索,发现了“daemontools”...在 FreeBSD 上,有 daemontools 和 daemontools-encore 的软件包。 -encore看起来比较新,功能也比较多,所以就选择了它。我的daemontools-encore版本是1.10_1。

在 FreeBSD 上,为 svscan 提供了 rc.d 脚本。在 FreeBSD 上,它会扫描 /var/service 中的子目录,并为每个目录运行“监督”。我接受了这个默认配置并放入svscan_enable="YES"/etc/rc.conf。对于 Linux,我不知道 rc 脚本,但它说 /service 是默认目录。

在 /var/service 内部,我创建了 rt-fcgi,并在 rt-fcgi 内部创建了 run。 “运行”包含:

#!/bin/sh

spawn-fcgi -u www -g www -s /tmp/rt.sock -n -- /usr/local/sbin/rt-server.fcgi

显然,在 Linux 上,这需要您正在使用的用户和组以及 rt-server.fcgi 的位置。

svscan 系统似乎会通告进程标题中的最后几行错误。还有其他选择。我的看起来像:

46495  -  IJ   0:00.01 /usr/local/bin/readproctitle service errors: ...tory (/var/run/rt44/data/gpg). GnuPG support has been disabled (/usr/local/lib/perl5/site_perl/RT/Config.pm:790)\n[52465] [Tue Mar  7 21:09:54 2017] [warning]: The requested port (443) does NOT match the configured WebPort (80).  Perhaps you should Set($WebPort, 443); in RT_SiteConfig.pm, otherwise your internal hyperlinks may be broken. (/usr/local/lib/perl5/site_perl/RT/Interface/Web.pm:1328)\n

...这意味着我没有正确配置 gnupg。看起来你可能会在那里查找错误之类的东西,除非你为 svscan 配置日志。

对于一个 fcgi 来说,这是一个相当繁琐的操作,但它是封装的并且可以工作。它处理因任何原因退出的脚本,但它不管理 PID 文件或套接字(除了创建套接字文件)。

我必须说,比起这个乱七八糟的东西,我更喜欢 WSGI 标准。

相关内容