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»


Перенаправлення запитів з HTTP на HTTPS

Часто виникала необхідність зробити автоматичне перенаправлення всіх запитів з http на https, а головне зробити це максимально простим способом і не влазячи в код програми.

А робиться це наступним чином, в потрібному (найчастіше webroot) каталозі розмішується .htaccess з наступним вмістом:

RewriteEngine OnRewriteCond %{HTTPS} offRewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}