Як використовувати apache як зворотний проксі за допомогою mod_proxy на ubuntu

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

Тому ви можете використовувати зворотний проксі-сервер для того, щоб попередити можливість користувачам отримати прямий доступ до основних серверів додатків. Також використання зворотного проксі-сервера допоможе вам перерозподілити навантаження від вступників запитів на кілька інших серверів додатків. Завдяки цьому покращиться продуктивність і збільшиться відмовостійкість.

З цієї статті ви дізнаєтеся про те, як налаштувати Apache для використання в якості зворотного проксі-сервера за допомогою mod_proxy - модуля Apache для перенаправлення з'єднань на один або кілька бекенд-серверів в цій же мережі. У цьому керівництві використовується простий бекенд, написаний з використанням фреймворку Flask, але ви можете використовувати будь-який бекенд на ваш розсуд.

вимоги

Для того, щоб виконати необхідні дії, вам знадобиться:

  • сервер з встановленою ОС Ubuntu 16.04 і користувачем, який може виконувати команди sudo;
  • встановлений на вашому сервері Apache.

Крок 1: включення необхідних модулів Apache

Існує безліч модулів Apache, які йдуть в комплекті і доступні для використання, але не активовані після установки. Тому необхідно включити ті модулі, які будуть використовуватися в цьому керівництві.

Потрібний нам модуль - це mod_proxy, а також кілька доповнень, які розширюють його функціонал і дозволяють підтримувати різні мережеві протоколи. Якщо перераховувати більш конкретно, то знадобляться:

  • mod_proxy - головний модуль Apache для перенаправлення з'єднань; завдяки йому Apache може виступати в якості шлюзу для основних серверів додатків;
  • mod_proxy_http - дозволить використовувати проксі для HTTP;
  • mod_proxy_balancer і mod_lbmethod_byrequests - додають функції балансування навантаження для бекенд-серверів.

Для того, щоб активувати модулі, виконайте команди нижче у відповідному порядку:

А після перезапуску Apache для того, щоб зміни вступили в силу.

Тепер Apache буде виступати в якості зворотного проксі-сервера для HTTP-запитів. Наступний крок не є обов'язковим, але він допоможе протестувати роботу Apache і переконатися, що все працює так, як потрібно. Для цього необхідно створити два базових бекенд-сервера, однак якщо у вас вони вже є в наявності, то ви можете відразу перейти до кроку 3.

Крок 2: створення тестових бекенд-серверів

Запуск декількох базових бекенд-серверів - відмінна можливість протестувати, чи коректно працює Apache. Тому необхідно створити два сервера, які будуть відповідати на HTTP-запити, друкуючи рядок тексту. Один буде відповідати "Hello world!", Інший "Hello Timeweb!".

Примітка. Якщо говорити не про тестовий запуск, то зазвичай бекенд-сервери віддають однаковий тип контенту. Однак для тестування буде зручніше, якщо це буде два сервера з різними повідомленнями, тому що так буде простіше відстежити, що балансування навантаження працює коректно.

Flask - це мікрофреймворк Python, який використовується для створення веб-додатків. У цьому керівництві ми будемо використовувати Flask, так як для написання базового програми потрібно всього кілька рядків. Вам необов'язково знати Python для того, щоб виконати подальші дії.

Для початку треба оновити доступних пакетів:

Тепер встановіть Pip, рекомендована система управління пакетами Python.

І вже за допомогою Pip встановіть Flask:

Тепер, коли всі необхідні компоненти встановлені, можна перейти до створення файлу, в якому буде знаходитися необхідний для першого бекенд-сервера код.

Скопіюйте в файл текст, який наведено нижче, а потім збережіть і закрийте файл.

Перші два рядки ініціалізують фреймворк Flask. Єдина функція home () буде віддавати рядок тексту ( "Hello world!"). А за те, щоб цей текст з'являвся у відповідь на HTTP-запити, відповідає @ app.route ( '/').

Другий бекенд-сервер буде точно таким же, як і перший, крім єдиного відмінності в тексті.

Тому для початку необхідно скопіювати перший файл:

Тепер відкрийте новий скопійований файл:

І в останньому рядку замість "Hello world!" Напишіть, наприклад, "Hello Timeweb!":

Команда нижче запустить перший бекенд-сервер, його порт 8080.

Другий сервер теж необхідно запустити, його порт 8081:

Тепер протестуємо роботу обох серверів.

У відповідь ви повинні отримати "Hello world!".

В цьому випадку ви побачите в терміналі напис "Hello Timeweb!".

Примітка. Для того, щоб закрити обидва тестових сервера (наприклад, після виконання всіх дій в цьому керівництві), ви можете просто виконати наступну команду: killall flask.

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

Крок 3: зміна початкових установок для включення проксі

У цій частині необхідно внести зміни для того, щоб початковий віртуальний хост Apache виконував роль зворотного проксі-сервера для одного або декількох бекенд-серверів.

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

1 приклад: зворотне проксі для одного бекенд-сервера

Скопіюйте текст нижче замість всього тексту, розташованого в блоці VirtualHost, тобто щоб в результаті блок виглядав ось так:

У блоці використовується три директиви:

Після внесення змін Apache необхідно перезапустити:

2 приклад: балансування навантаження між декількома бекенд-серверами

Якщо у вас є кілька бекенд-серверів, буде гарною ідеєю при використанні проксі розподілити трафік між ними; зробити це можна за допомогою функції балансування навантаження утиліти mod_proxy.

Як і в першому прикладі, тут вам теж необхідно замінити текст в блоці VirtualHost на наступний:

Директиви ProxyPass і ProxyPassReverse використовують пул балансування навантаження під назвою mycluster замість конкретного сервера.

Для того, щоб зміни вступили в силу, перезавантажте Apache:

висновок

Тепер ви знаєте, як налаштувати Apache в якості зворотного проксі-сервера для одного або декількох внутрішніх серверів. mod_proxy можна ефективно використовуватися для того, щоб налаштовувати зворотний проксі для серверів з додатками, написаних на різних мовах програмування і технологіях, таких як Python, Django або Ruby і Ruby on Rails. Також mod_proxy можна використовувати для балансування навантаження між декількома бекенд-серверами для сайтів з великим навантаженням, щоб забезпечити високу доступність таких ресурсів.

mod_proxy і mod_proxy_http найпопулярніша комбінація модулів, проте є кілька інших, які підтримують інші мережеві протоколи. Хоча в цьому керівництві вони не використовувалися, їх теж можна виділити окремим списком:

  • mod_proxy_ftp для FTP;
  • mod_proxy_connect для SSL-тунелю;
  • mod_proxy_ajp для протоколу AJP (Apache JServ Protocol);
  • mod_proxy_wstunnel для веб-сокетів.

Як використовувати apache як зворотний проксі за допомогою mod_proxy на ubuntu