30 окт. 2012 г.

Сам себе dyn-dns через bash и pdd.yandex.ru

Задача

Сделать статическое доменное имя для своего домешнего сервера с динамическим IP-адресом

Исходные данные

У меня есть домен rekby.ru, делегированный на DNS-сервера yandex, домашний сервер на ubuntu-сервер, интернет-провайдер билайн с l2tp-соединением.

Варианты

  1. dyndns.org им подобные
  2. Работа через Яндекс-API
Вариант 1 раньше был хорошо и удобен, потом интерфейс, регистрации и т.п. так замудрили, что стало сложно разобраться как там добраться до бесплатной DNS-записи, так что он не подошел.

Настройка автообновления IP на DNS-серверах yandex

Для начала создайте A-запись с нужным поддоменом и любым IP-адресом в интерфейсе pdd.yandex.ru

Потом нужно получить токен для доступа к API: 
https://pddimp.yandex.ru/get_token.xml?domain_name=ВашДомен 
там нужно авторизоваться своей учеткой яндекса, в ответ будет выдан xml из которого нужен только token, он там виден.

Затем нужно перейти на страницу 
https://pddimp.yandex.ru/nsapi/get_domain_records.xml?token=ТокенСПрошлогоШана&domain=ВашДомен
Тут нужно посмотреть record_id вашего поддомена.
Скрипт bash для обновления IP-Адреса:
#!/bin/bash
TOKEN=ВашТокен
RECORD_ID=ВашRecordID
DOMAIN=ВашДомен
SUBDOMAIN=ВашПоддомен
LINE=`ifconfig ppp | grep --color=never "inet addr"`
# extract IP from line: inet addr:2.93.172.129  P-t-P:85.21.208.191  Mask:255.255.255.255
LINE=( $LINE )
IPADDR=${LINE[1]}
IPADDR=${IPADDR:5}
wget -O /dev/null "https://pddimp.yandex.ru/nsapi/edit_a_record.xml?token=$TOKEN&domain=$DOMAIN&subdomain=$SUBDOMAIN&record_id=7136651&content=$IPADDR&ttl=900" 2>/dev/null
Дайте скрипту права выполнения и поставьте на выполнение после сразу после поднятия соединения или просто поставьте в CRON раз в 5 минут. Чаще смысла не имеет, т.к. TTL=900 секунд, т.е. 15 минут, меньше яндекс поставить не дает.

27 окт. 2012 г.

Отрицательный опыт стабильности GAE


Для старта проекта решил выбрать GAE как простую неадминистрируемую платформу. Проект еще не запущен, но для статистики ping-admin проверяет работу ресурса раз с интервалами от раз в 5 минут до раз в час в течение последних 2 месяцев (58 дней).

Мониторинг заметил два сбоя. В первый раз это было значительное увелиение времени отдачи страницы (с 0.5 секунд до 30 с лишним секунд без изменения кода и накопления данных - проект еще не запущен).

Второй раз сегодня, в GAE случилась общая проблема, которую они поправили и разбираются, сайт фактически был недоступен больше 3 часов, на большенство запросов отдавал 500-ю ошибку, но могу случайно выдать и обычную страницу (1 из 10-15 раз).

Итого по мониторингу даунтайм за последние 2 месяца составил 1 час, на самом деле минимум 4 часа (особенности настройки мониторинга могут значительно занижать даунтайм).

При этом сегодняшняя проблема была общая для платнформы и даже премиум-аккаунты не могли обратиться за поддержкой, т.к. сайт appengine и все его формы тоже не работали.

Для себя принял решение - что этот проект всё же запущу на GAE, чтобы готовую вещь не переделывать и в момент когда станет понятно что проект начинает зарабатывать деньги слезать с GAE и переходить на собственные сервера или на Amazon.

Дальнейшие проекты уже сразу виртуальном хостинге, VDS или своих серверах, чтобы в момент проблемы можно было что-то сделать для поднятия системы (например быстро переехать в другое место).

24 окт. 2012 г.

Прошивка D-Link DIR-300 B3

Задача

Прошить в D-Link DIR-300 версия B3 прошивку DD-WRT. На сайте есть прошивки для версии A1 и B1.

Решение

Обычным образом через стандартный интерфейс маршрутизатора  по обновлению прошивки загружается DD-WRT от версии B1, видимо они вполне совместимы.

DNS локальной сети средствами DD-WRT

Задача

Есть локальная сеть, роутер D-Link DIR-300 (прошит DD-WRT), сервер. Нужно обращаться к серверу по доменным именам без изменения файлов/настроек на клиентских компьютерах.

Решение

В DD-WRT уже установлен DNS-сервер DNSMasq (включается на вкладке Services), он умеет раздавать IP-адреса, прописаные в /etc/hosts маршрутизатора.
Поскольку у маршрутизатора файловая система только на чтение - написан скрипт expect для ежеминутного прописывания новых настроек. После обновления файла DNSMasq нужно отправить сигнал для обновления настроек.

Скрипт:
#!/usr/bin/expect
spawn telnet 192.168.3.1
expect "login:"
send "root\n"
expect "Password:"
send "ROUTER_PASSWORD\n"
expect "DD-WRT:~#"
send "echo \"127.0.0.1 localhost\n192.168.1.1 DD-WRT\n192.168.1.2 torrents.local\n\" > /etc/hosts\n" # желаемое содержимое /ets/hosts маршрутизатора
send "killall -HUP dnsmasq\n" # сигнал на обновление настроек
send "exit\n"
expect eof
Чтобы не путаться с форматированием первой слово каждой новой строки помечено жирным шрифтом.

20 окт. 2012 г.

osCommerce 500 ошибка после переноса

Описание проблемы

После переноса сайта на osCommerce между серверами для всех страниц стала выдаваться ошибка 500, при этом сайт выглядел нормально. Т.е. в заголовке возвращается код 500 и потом нормальное содержание страницы и браузер всё показывает правильно. Обнаружился баг в тот момент, когда ajax-скрипт отказался принять ответ сервера с кодом 500 и работать не стал.

В процессе поисков минимальное изменение которое нужно было внести для исправления ошибки:

Файл
includes/functions/html_output.php
строка 36
if (SEO_ENABLED == 'true')

дописал в неё "FALSE &&"
и стало 
if (FALSE && SEO_ENABLED == 'true')

Через несколько часов заметили, что все ссылки на сайте изменились, так что включил SEO обратно - для отладки.
После включения ошибка 500 не вернулась, стал отдаваться обычный код 200.

Причина

Точная причина осталась непонятной. Предполагаю, что в файле seo.class.php происходит обращение к самому сайту по доменному имени, при этом пока dns-кэш не обновился - запросы уходили на старый сервер, где сайт уже был выключен.

Решение

В данном случае всё решилось просто путем ожидания.

Быстрый экстенсивный метод решения тормозов

У одного из клиентов случилась авария - процессоры VDS (4 ядра) стал нагружаться на 100% сервером БД, сайт при этом лежит ка кмёртвый. Узкое место нашел, описал разработчику. Теперь разработчику нужно время, чтобы это место оптимизировать. Получение денег клиентом зависит напрямую от сайта.

Было решено на 1 день взять самый мощный амазоновский сервер (Cluster Compute Eight Extra Large Instance) - 2 процессора по 8 ядер с Hyper Threading (итого 32 логических процессора). Нагрузку сервер выдержал успешно, тормозов не наблюдалось.

Стоимость решения - примерно 100 рублей/час работы сервера, около 800 рублей за день.

На короткие промежутки времени, когда стоимость простоя сервера высока решение принято как оптимальное.