Настройка обратного прокси

LinuxBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы научитесь настраивать Nginx как обратный прокси.

Представьте обратный прокси как секретаря в крупной компании. Когда вы звоните по общему номеру, вы не разговариваете напрямую с генеральным директором или службой поддержки. Вы общаетесь с секретарём, который спрашивает: «Чем я могу вам помочь?», а затем переводит звонок нужному сотруднику.

В этом сценарии:

  • Nginx — секретарь, который принимает соединения на порту 80.
  • Приложение Python — «служба поддержки», которая принимает соединения на порту 8000.
  • Вы — клиент, который обращается в компанию.

Вы настроите Nginx так, чтобы при запросе /app он перенаправлял запрос на сервер Python и возвращал ответ клиенту.

Обратные прокси играют важную роль в современной веб-архитектуре. Они располагаются перед серверами приложений и предоставляют стабильную публичную точку входа. Кроме того, они могут завершать TLS-соединения, распределять нагрузку, кэшировать данные и маршрутизировать запросы.

Таким образом, Nginx не всегда обслуживает файлы самостоятельно. Иногда его основная задача — принимать трафик от клиентов и передавать его другой службе, расположенной за ним.

Запустите серверного приложения

Сначала нам нужно запустить службу, которой будут передаваться запросы. Для этого мы создадим очень простое веб-приложение на Python.

Создадим отдельную папку, из которой приложение будет отдавать файлы.

Создайте папку app в каталоге проекта и поместите в неё простой HTML-файл:

mkdir -p ~/project/app
echo "Hello from the Python Backend." > ~/project/app/index.html

Теперь запустим сервер Python. Эта команда указывает Python работать как веб-сервер и отдавать файлы из текущего каталога на порту 8000.

В нашем примере этот процесс Python является сервером серверной части приложения. Он отвечает за фактическую выдачу содержимого, а Nginx располагается перед ним как публичная точка входа.

Символ & в конце команды запускает процесс в фоновом режиме. Благодаря этому вы сможете продолжать работать в терминале, пока сервер будет работать в фоне.

cd ~/project
python3 -m http.server 8000 &

Проверим, что сервер запустился правильно. Найдём процесс, который прослушивает порт 8000:

netstat -tuln | grep 8000

В выводе должна появиться строка с 0.0.0.0:8000 и состоянием (LISTEN). Это означает, что наше «серверное приложение» готово принимать запросы на порту 8000.

Настройте обратный прокси Nginx

На этом шаге вы измените конфигурационный файл Nginx и укажете в нём наше приложение Python.

Сначала откройте файл конфигурации по умолчанию с помощью sudo и текстового редактора nano.

sudo nano /etc/nginx/sites-enabled/default

Внутри блока server { ... } прокрутите файл вниз. Вы увидите существующий блок location / { ... }. Добавьте под ним новый блок location /app.

Вставьте в файл следующий код. Будьте внимательны при вводе фигурных скобок { } и точки с запятой ;:

    location /app {
        proxy_pass http://127.0.0.1:8000;
    }

Что делает этот код?

  • location /app: указывает Nginx отслеживать запросы, начинающиеся с /app.
  • proxy_pass ...: работает как кнопка перевода звонка. Эта директива говорит Nginx: «Когда поступит запрос к /app, передай его на localhost (127.0.0.1), порт 8000».

Именно эта передача запроса составляет суть обратного прокси. Клиент взаимодействует с Nginx, а Nginx от имени клиента обращается к серверу серверной части.

Структура файла должна выглядеть примерно так:

server {
    listen 80 default_server;
    ...
    location / {
        try_files $uri $uri/ =404;
    }

    location /app {
        proxy_pass http://127.0.0.1:8000;
    }
}

Нажмите Ctrl+O, затем Enter, чтобы сохранить файл, и Ctrl+X, чтобы выйти из nano.

Проверьте конфигурацию и перезапустите настройки

Мы изменили конфигурационный файл, но Nginx по-прежнему использует старые правила. Поэтому нужно перезагрузить службу.

Сначала всегда проверяйте конфигурацию на опечатки перед перезагрузкой. Если перезагрузить повреждённую конфигурацию, веб-сервер может полностью перестать работать.

Выполните команду проверки:

sudo nginx -t

В выводе должны появиться сообщения:

syntax is ok
test is successful

Если проверка завершилась успешно, перезагрузите Nginx, чтобы применить изменения:

sudo service nginx reload

Теперь Nginx обновил свои правила и готов перенаправлять запросы.

На этом этапе Nginx работает как маршрутизатор между URL-адресами и серверными службами, а не только как файловый сервер, читающий файлы с диска.

Проверьте работу прокси

На этом последнем шаге мы убедимся, что наш «секретарь» правильно выполняет свою работу.

Отправим веб-запрос к Nginx на порт 80 и запросим /app/. Nginx должен сразу перенаправить этот запрос серверу Python на порт 8000.

Выполните следующую команду:

curl http://localhost/app/

Вы должны увидеть сообщение от сервера серверной части:

Hello from the Python Backend.

Что произошло?

  1. Вы запросили у Nginx (localhost:80) путь /app/.
  2. Nginx проверил свои правила, сопоставил запрос с /app и выполнил указание proxy_pass.
  3. Nginx обратился к серверу Python на порту 8000.
  4. Сервер Python вернул страницу «Hello...» Nginx.
  5. Nginx вернул страницу «Hello...» вам.

Эту цепочку запросов важно запомнить: она встречается повсюду в современной инфраструктуре:

браузер -> обратный прокси -> сервер приложения -> обратный прокси -> браузер.

Вы успешно создали обратный прокси!

Итоги

В этой лабораторной работе вы успешно настроили Nginx как обратный прокси. Вы научились:

  1. Размещать простое серверное приложение с помощью Python.
  2. Настраивать Nginx с блоком location для маршрутизации.
  3. Перенаправлять трафик с помощью директивы proxy_pass.
  4. Проверять цепочку прокси с помощью curl.

Эта архитектура лежит в основе современных веб-приложений. Она позволяет использовать Nginx для обеспечения безопасности и распределения нагрузки, пока другие приложения обрабатывают логику в фоновом режиме.