我想设置 monit 来监控乘客,但到目前为止我发现的所有内容基本上都说只是使用 monit 监控您的网站。如果可能的话,我想直接监控乘客,这样我就可以更好地控制它。
正如杰罗姆所说,
您还需要添加一个流程管理器;例如监视器或主管。这是因为 Docker 将监视一个进程。如果需要多个进程,则需要在顶层添加一个来处理其他进程。换句话说,您正在将一个精益简单的容器变成更复杂的东西。
我并不完全清楚为什么您需要在容器内使用进程管理器。
那么有人可以向我解释一下,在容器内安装进程管理器有什么好处?让 systemd 或 upstart 处理进程而不是向容器添加额外的服务不是更好吗?
我运行 Monit 来检查 Debian 服务器上的进程。它对所有其他服务(Apache SSL、Postfix、SSH 等)正常工作,但 Monit 对 Dovecot 的检查反复失败。我认为这可能是在安装一些软件包更新后开始的,但我不确定何时开始。
由于电子邮件仍在工作,Dovecot 为客户端连接正常工作。我已经尝试过使用 open_ssl s_client 进行测试,并且对于 SSLv3、TLS1.1 和 TLS1.2 似乎也很好。
/etc/monit/monitrc 中的 Dovecot 部分:
check process dovecot with pidfile /run/dovecot/master.pid
start program = "/usr/sbin/service dovecot start"
stop program = "/usr/sbin/service dovecot stop"
if failed port 993 type tcpssl sslauto protocol imap then unmonitor
当我启用对 Dovecot 的监控时,我在 /var/log/monit 中收到此消息:
'dovecot' failed protocol test [IMAP] at INET[localhost:993] via TCPSSL -- IMAP: error receiving data -- Success
我认为它可能是这样的https://secure.kitserve.org.uk/content/ssl-tls-version-conflict-zarafa-monit但我已经尝试用所有这些选项依次替换“sslauto”,但没有运气:SSLV2|SSLV3|TLSV1|TLSV11|TLSV12
我一直在指的 Monit 文档在这里: …
我的网络服务器使用 php5-fpm 运行 nginx。如果出现一些问题,通常是php5-fpm挂了,导致“bad gateway”服务器错误。当然,我永远不知道 nginx 是否会在某一天崩溃。
当发生某些事情时,这两个进程(广告它们的线程)通常都存在并且需要重新启动。我对当前问题的原因不太感兴趣,但想重新启动两个进程。为此,我创建了两个 bash 脚本 /etc/monit/webserver.start.sh 和 /etc/monit/webserver.stop.sh。
这是我的 monit 配置文件(在 conf.d 中):
check process webserver with pidfile /var/run/nginx.pid
start program = "/etc/monit/webserver.start.sh"
stop program = "/etc/monit/webserver.stop.sh"
if failed (url https://www.myserver.com/example/ and content == 'test string' and timeout 20 seconds)
then alert
if failed (url https://www.myserver.com/example/ and content == 'test string' and timeout 20 seconds)
for 2 cycles
then restart
if failed (url https://www.myserver.com/example/ and content == 'test string' and timeout 20 seconds)
for 4 …Run Code Online (Sandbox Code Playgroud) 我有这样的规则:
if memory usage > 85% for 10 cycles then alert
Run Code Online (Sandbox Code Playgroud)
我不仅想通过电子邮件通知,还想通过 slack 通知。所以我可以像这样添加第二行:
if memory usage > 85% for 10 cycles then exec /path/to/slack.rb
Run Code Online (Sandbox Code Playgroud)
当您有多个规则并且必须复制每一行时,这很烦人。可以一起使用alert和exec吗?像这样的东西:
if memory usage > 85% for 10 cycles then alert and exec /path/to/slack.rb
Run Code Online (Sandbox Code Playgroud) Monit 配置为在 localhost 的端口 3306 上监视 MySQL。
check process mysqld with pidfile /var/lib/mysql/li175-241.pid
start program = "/etc/init.d/mysql start"
stop program = "/etc/init.d/mysql stop"
if failed port 3306 protocol mysql then restart
if 5 restarts within 5 cycles then timeout
Run Code Online (Sandbox Code Playgroud)
我的应用程序配置为通过 localhost:3306 连接到 MySQL,运行良好并且可以访问数据库。我什至可以使用 MySQL Query Browser 通过端口 3306 远程连接到数据库。该端口是完全开放的,可以连接。因此,我非常确定它正在运行。
但是,运行monit -v显示 Monit 无法在该端口上检测到 MySQL。
'mysqld' failed, cannot open a connection to INET[localhost:3306] via TCP
Run Code Online (Sandbox Code Playgroud)
这种情况一直发生,直到 Monit 决定不再按照配置跟踪 MySQL。
如何开始解决此问题?
sudo netstat -lnp | grep mysql 返回以下内容:
tcp 0 …Run Code Online (Sandbox Code Playgroud) 安装 monit 后,当我执行 monit status myproc 时,我收到“连接到 monit 守护程序时出错”
我在某处读到
如果 monit 在没有 http 支持的情况下运行 indaemon 模式,则 status 命令将不起作用 - 在这种情况下,命令“monit status”会尝试通过 http/tcp 从守护程序获取状态。要启动 http 接口,您需要在配置中添加“set httpd ...”语句。
那还是正确的吗?那个帖子是2005年的
我想配置的monit通过Office365发送电子邮件。以下是相关配置:
set mailserver smtp.office365.com port 587
username "username" password "password"
using tlsv1
with timeout 30 seconds
不幸的是,它不起作用。这是来自的相关错误/var/log/monit.log:
[PST Feb 27 06:40:48] error : Sendmail error: 534-5.7.9 Please log in with your web browser and then try again. Learn more at
(是的,错误被截断了。)
凭据正确 - 我已成功使用它们登录到 Office 365/Outlook。我还使用此帐户通过 Rails 应用程序发送邮件,因此我假设配置问题是 Monit 的问题,而不是 Microsoft 的问题。
似乎有人在这里遇到了类似的障碍。虽然我找不到任何确认 Monit 支持 TLS v1.1 的文档,但如果它不支持我会感到惊讶(该规范现在已有 8 年历史)。
有什么我想念的吗?
我正在寻找一种方法,让 monit 仅在特定进程出现故障时发出警报。例如:
check process apache
with pidfile /var/run/httpd.pid
group www
start program = "/usr/sbin/apachectl start"
stop program = "/usr/sbin/apachectl stop"
alert operations@example.com with reminder 5
Run Code Online (Sandbox Code Playgroud)
使用该配置,apache 将随着进程消失而重新启动。而不是发生这种情况,我想保持低调,直到有人可以手动干预。
对于那些好奇为什么的人:
我们的生产环境使用 monit 来控制应用程序。我们的非生产环境没有。这导致了一个问题,因为我们的开发人员更改了特定应用程序的启动方法。在它进入生产环境之前,它一直通过我们的非生产环境,monit 最终导致应用程序关闭,因为它没有在预生产中被捕获。
我想在非生产环境中设置 monit,这样我们就可以捕捉到这样的故障,但由于它不是关键任务,我们不需要自动重启服务。
我有一个通用的 VPS,并且正在对它的应用程序进行 Dockerising。上面将有大约 5-6 个容器,其他很少,因此可以根据需要对盒子进行简单的重建。
对于每个应用程序,我都有一个启动脚本。WordPress 容器如下所示:
#!/bin/bash
# Get the host IP address
export DOCKER_HOSTIP=`ifconfig docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`
echo "Connecting to database on Docker host ${DOCKER_HOSTIP}"
docker run \
--add-host=docker:${DOCKER_HOSTIP} \
--network dockernet \
--network-alias jonblog \
--detach \
--restart always \
--rm \
jonblog
Run Code Online (Sandbox Code Playgroud)
但是,这会返回错误:
冲突选项:--restart 和--rm
有几张 Docker 票说这是明智的,但我不明白。我想我的意思很明确:如果一个容器没有运行(例如在启动时),那么我想启动它。如果它死了,那么我希望容器被删除,并从基础映像创建一个新的容器。无论如何,容器应该是不可变的——我希望保留的任何状态,如媒体文件和日志,都将被写入卷。
所以,我想我应该放弃这个--restart标志,然后使用进程管理器来停止和启动 Docker 容器。我可以在这里使用Monit吗?我希望能够做这样的事情:
CHECK PROCESS jonblog MATCHING jonblog
START PROGRAM = …Run Code Online (Sandbox Code Playgroud) monit ×10
linux ×3
monitoring ×3
docker ×2
debian ×1
dovecot ×1
mysql ×1
outlook ×1
smtp ×1
ssl ×1
supervisord ×1
tls ×1
web-server ×1