На какие условия можно положиться для сценария, который определяет, работают ли мои серверы? - PullRequest
4 голосов
/ 30 июля 2010

Я обычно работаю как минимум с двумя десятками серверов в неделю. Я подумал, что было бы неплохо создать скрипт, который будет запрашивать каждый из них и определять, «они» или нет.

  • Серверы работают на Apache2 или IIS7.
  • Хостинг провайдеры различаются
  • На каждом сервере обычно несколько сайтов
  • Настройки противоречивы, при обращении к ip не всегда есть страница apache "hello world" по умолчанию.
  • Все сайты являются виртуальными хостами

Я подумал, будет ли лучший способ определить, работают ли они, просто взять по одному сайту с каждого сервера и сделать запрос HTTP HEAD, чтобы убедиться, что ответ от сервера - 200 OK? Очевидно, это будет склонно к «ложному срабатыванию», если:

  1. Конфигурация / настройка сайта неправильно возвращает 200 OK, когда он должен вернуть код ошибки 4xx
  2. Если конфигурация отдельного сайта (<VirtualHost>) отключена или если сайт перемещен на другой сервер.

Но по большей части запрос HEAD и опора на 200 OK должны быть надежными, не так ли? Помимо проверки того, что запись домена A соответствует тому, что указано в списке при перемещении сайта.

Псевдокод:

import http

list = {
  '72.0.0.0' : 'domain.com',
  '71.0.0.0' : 'blah.com',
}

serverNames = {
  'jetty' : '72.0.0.0',
  'bob'   : '71.0.0.0'
}

for each ( list as server => domain ) { 
    headRequest = http.head( domain )
    if ( headRequest.response == 200 && http.arecord(domain) == server ) { 
       print serverNames[server] + ' is up ';
    } else {
       print 'Server is either down or the site attached to the server lookup has moved.';
    }
}

Я, вероятно, напишу скрипт на Python или PHP, но этот вопрос должен обсуждать только логику.

1 Ответ

3 голосов
/ 03 августа 2010

Логика кажется мне здоровой. Я бы предложил расширить его для использования модуля mod_status на ваших серверах apache. После проверки головы также попробуйте получить / server-status и использовать его для двойной проверки работоспособности вашего сервера. Я думаю что-то вроде этого:

statusRequest = http.get('/server-status')
if(statusRequest == 200) {
 // Make sure you don't have insane load averages, etc
}
else { /* Check something IIS specific, or just be happy the head check worked */ }

Другая техника, которую я использовал в прошлом, - это также проверка того, что, как мне известно, должно дать 404. Таким образом, у вас больше шансов узнать, раздает ли сервер 200-е кому-нибудь, кто спрашивает. (Видел один раз из-за плохого конфига)

...