В продакшене мы будем использовать что-то вроде Monit, а для Dev – решил написать маленькую утилиту, которая проверяет доступность NGINX и отправляет письмо при проблемах.
Программа содержит две рабочие функции – socket_get()
, которая с помощью connect()
пытается подключиться к порту NGINX (AF_INET
сокету), и send_alarm()
, которая с помощью system()
выполняет mailx
для отправки сообщений.
Отправку можно было бы реализовать через libcurl
, пример тут>>>.
Код:
#include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <unistd.h> #include <string.h> // удобнее было бы вынести адрес и порт в аргументы main() #define HOST_ADDR "127.0.0.1" #define HOST_PORT 80 int socket_get(int i_addr, int i_port) { int socket_desc; struct sockaddr_in server; socket_desc = socket(AF_INET , SOCK_STREAM , 0); if (socket_desc == -1) { return 1; } server.sin_addr.s_addr = inet_addr(HOST_ADDR); server.sin_family = AF_INET; server.sin_port = htons(HOST_PORT); // пробуем подключиться к HOST_ADDR:HOST_PORT, переданных через структуру server if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0) { return -1; } return 0; } void send_alarm() { char cmd[100]; char to[20] = "[email protected]"; char hostname[1024], from_host[24]; gethostname(hostname, 1024); // у нас два сервера с NGINX, определяем $HOSTNAME и задаём имя if (strcmp(hostname, "hostname1") ==0) { strncpy(from_host, "Master", 24); } else if (strcmp(hostname, "hostname2") ==0) { strncpy(from_host, "Secondary", 24); } else { exit(1); } // конкатенируем всю команду в одну строку sprintf(cmd, "echo NGINX is in DOWN state on the host %s! | /usr/bin/mailx -s \"ALARM from %s\" %s", from_host, from_host, to); // и передаём её system() system(cmd); } int main(int argc , char *argv[]) { if (socket_get(atoi(HOST_ADDR), HOST_PORT) != 0) { printf("Can't connect to local NGINX service!\n"); send_alarm(); } }
Собираем:
[simterm]
# gcc monit.c -o monit
[/simterm]
Добавляем в крон:
[simterm]
# crontab -l * * * * * /root/scripts/monit
[/simterm]
Выполняется каждую минуту, и в случае проблем с подключением к NGINX – отправляет уведомление на почту:
[simterm]
# cat /var/log/mail.log Aug 7 15:11:39 hostname1 postfix/pickup[7503]: 898CBFCA55: uid=0 from=<root@hostname1.asgaqmzoya1ebbq1oirk0uw30g.ax.internal.cloudapp.net> Aug 7 15:11:39 hostname1 postfix/cleanup[11752]: 898CBFCA55: message-id=<20170807151139.898CBFCA55@hostname1.asgaqmzoya1ebbq1oirk0uw30g.ax.internal.cloudapp.net> Aug 7 15:11:39 hostname1 postfix/qmgr[1561]: 898CBFCA55: from=<root@hostname1.asgaqmzoya1ebbq1oirk0uw30g.ax.internal.cloudapp.net>, size=562, nrcpt=1 (queue active) Aug 7 15:11:40 hostname1 postfix/smtp[11755]: 898CBFCA55: to=<[email protected]>, relay=mail.domain.kiev.ua[77.***.***.20]:25, delay=0.54, delays=0.04/0.01/0.16/0.33, dsn=2.0.0, status=sent (250 OK id=1dejgx-0006gE-QF) Aug 7 15:11:40 hostname1 postfix/qmgr[1561]: 898CBFCA55: removed
[/simterm]
Готово.