408 - Підступний Chrome

Хорошою практикою є періодичний перегляд журналів на серверах, там можна знайти багато цікавого (симптоми виходу з ладу обладнання, хакерські потуги, помилки конфігурації, тощо).

Віднедавна я почав помічати на кількох web-серверах (apache2) помилку 408 "Request timeout". Причому кількість помилок поступово зростала. "Фізичний зміст" помилки - браузер встановив з'єднання з сервером, але не надіслав запит протягом відведеного на це часу, тоді сервер закриває з'єднання з помилкою 408.

Перші пояснення, які мені вдалося знайти на форумах, зводилися до (D)DoS атак або злих хробаків. Обидві гіпотези майже зразу спростувалися: сервіси глибоко внутрішні - DDoS-у взятись нема звідки; майже половина машин, які засвітилися з такою помилкою - це робочі станції локальної мережі з ОС Ununtu, які обслуговуються кваліфікованими адміністраторами.

Але другий підхід до цієї проблеми (лишити її так я не міг, Logwatch щодня про неї нагадував) навів мене на справжнього винуватця, ним виявився браузер Chrome від "корпорації добра". Для зменшення часу відкривання сторінок, ця зараза має "фічу" speculative pre-connect, тобто про всяк випадок відкриває з'єднання заздалегідь, сподіваючись що від сервера ще щось знадобиться і тоді треба буде тільки послати запит. На цю "фічу" завели "баг репорт" :)

На цьому місці я зміг посміхнутись і вирішити залишити все як є, навантаження на сервери не велике, Chrome-ів мало. Але для серверів з більшим навантаженням може знадобитись зменшити значення Timeout у конфігурації Apache, щоб зменшити імовірність вичерпання максимальної кількості одночасно підключених клієнтів (MaxClients).

Дуже сподіваюся, що скоро вони таки «improve the accuracy of our preconnect target»


PostgreSQL schema diff

Я з 2008-го року мріяв про інструмент який шукає різниці між схемами БД, а виявляється є такий. Зустрічайте - Another PostgreSQL Diff Tool (apgdiff)!

apgdiff є в репозиторіях Ubuntu. Дуже дивно як я його раніше не знайшов.


Іменування таблиць у базах даних

Стандартні рекомендації щодо іменування об'єктів БД застерігають від використання іменників у множині (наприклад, contracts замість contract). Але у вітчизняних (це я так завуальовано написав про "легасі" частину нашої БС) продуктах іноді зустрічаються назви у множині та ще й транслітеровані з української (наприклад, ugody замість contract). З такими назвами був цікавий казус: один з новачків з круглими від здивування очима спитав мене - що це за поле "угадано", хоча мався на увазі номер угоди "ugodano".

До чого я все це веду, ніколи не називайте об'єкти БД словами у множині і із застосуванням транслітерації, подивіться у словник і виберіть англійський відповідник слова, а якщо об'єкт і має якусь локальну специфіку, опишіть це в документації.