Nginx як reverse proxy
nginx як reverse proxy
Кілька Новомосковсктелей блогу webo.in просили мене викласти конфігурацію зв'язки nginx + Apache, на якій працює сервер. Хоча це і не відноситься безпосередньо до теми клієнтською оптимізації. Однак, більшості фахівців, що займаються клієнтської оптимізацією, буде цікаво дізнатися про налаштування декількох хостів для видачі статики і пара інших трюків, пов'язаних з балансуванням запитів.
Конфігурація Apache 2
Gzip для HTML / XML / ICO
З самого початку включаємо gzip для текстових файлів і favicon:
Далі я встановлюю максимальну ступінь стиснення (9) для таких файлів і максимальний розмір вікна (15). Якщо сервер не такий потужний, то рівень стиснення можна виставити в 1, розмір файлів при цьому збільшується приблизно на 20%.
Ми відключаємо стиснення для тих браузерів, у яких проблеми з його розпізнаванням (такі випадки вже досить добре описані і задокументовані):
Gzip для CSS / JS
Тепер ми піклуємося про стиснення для CSS / JS-файлів (ця техніка добре описана у відповідній статті). Для всіх файлів (.css | .js | .xml)
Тут ми виставляємо відповідний MIME-тип для стислих стилів і скриптів:
Якщо серверних ресурсів не так шкода, то можна архівувати CSS / JS файли і стандартним для Apache чином приблизно так:
Далі пара невеликих фіксів для поліпшення роботи з різними локальними проксі-серверами: ми вказуємо на необхідність передачі заголовка User-Agent (бо щодо неї приймається рішення про стиснення) і заголовка Cache-Control (щоб кешування не провадилося на проксі-сервері, а файл передавався повністю користувачеві). Цитата з w3.org:
[Цей заголовок] вказує на те, що все у відповідь повідомлення повністю або його частина призначена для окремого користувача і не повинна бути збережена в якомусь проміжному кеші
Ну і сам самі правила, власне:
кешування
Включаємо кешування для всіх файлів терміном на 10 років:
Якщо ви хочете конкретно для HTML-файлів його вимкнути, то можна поступити наступним чином:
Для кореневої директорії виставляємо ETag і коригуємо кешування в Apache для роботи з SSI (через XBitHack):
Для Особистого кабінету кешування у мене відключено:
В принципі, це все, що нам потрібно від Apache, але у мене була ще одна невелика завдання / проблема на сервері.
«М'яке» серверне кешування
Таким чином, кожна сторінка, якій фізично немає на сервері, але вона заявлена в якихось зовнішніх джерелах, з'являється при першому запиті до неї.
формат логів
Оскільки реальний IP користувача у нас буде в інший змінної оточення (через nginx), нам потрібно змінити формат логів. У мене це зроблено в такий спосіб:
Звідки береться змінна X-Real-IP мова піде трохи нижче.
конфігурація nginx
Reverse proxy
Для початку прокинув всі запити до nginx на Apache:
Apache у нас піднято на порту 8080, туди ми направляємо всі запити до хосту webo.in. які прийняв nginx. Додатково ми виставляємо змінні X-Real-IP (для нормального ведення логів Apache, інакше у нас будуть одні записи типу 127.0.0.1 замість IP користувачів) і Host (так як Apache займається не одним хостом, то знати, на який хост прийшли запити йому теж потрібно).
тепер більш цікава частина. Нам потрібно зробити кілька (у мене це 1) хостів для видачі статики (картинок і ін.) Прямо з nginx (щоб зайвий раз не прокидати її на Apache).
Досвід роботи з nginx підказує
Загалом, це все. На виході ми отримуємо 2 хоста: один чисто під nginx, другий на зв'язці Apache + nginx. Додатково здійснюємо набір дій по клієнтської оптимізації і деякого серверного кешування.