Цель урока: Понять, что такое обратный прокси (reverse proxy), зачем он нужен, и научиться настраивать Nginx для выполнения этой роли. Мы создадим простое внутреннее приложение и "спрячем" его за Nginx, сделав его доступным для внешнего мира через стандартные порты, при этом повысив его безопасность и гибкость.

Часть 1: Теория. Прямой и Обратный прокси - в чем разница?

Вы наверняка слышали слово "прокси". Чаще всего под ним понимают прямой прокси (forward proxy).

  • Прямой прокси:

    • Аналогия: Переводчик, который сидит рядом с вами в другой стране.

    • Как работает: Он работает от вашего имени. Вы говорите ему "сходи на сайт google.com", он идет туда, забирает страницу и приносит ее вам. Для google.com посетителем был прокси-сервер, а не вы.

    • Цель: Скрыть ваш IP-адрес, обойти блокировки, кэшировать данные внутри вашей локальной сети. Он работает в интересах клиента.

  • Обратный прокси (Reverse Proxy):

    • Аналогия: Секретарь-ресепшионист в большом офисном здании.

    • Как работает: Все посетители приходят только к нему на ресепшн (порт 80/443). Посетитель говорит: "Мне нужен отдел маркетинга". Секретарь знает, что отдел маркетинга сидит в кабинете №305 (на порту 3000), и перенаправляет туда запрос. Для посетителя он общался только с секретарем, он даже не знает, в каком именно кабинете сидит нужный ему отдел.

    • Цель: Скрыть внутреннюю архитектуру серверов, распределить нагрузку, обеспечить SSL-шифрование, кэшировать ответы. Он работает в интересах сервера.

Nginx - это идеальный "секретарь-ресепшионист".

Часть 2: Зачем нужен обратный прокси? Ключевые преимущества

  1. "Единое окно": У вас может быть множество разных приложений на сервере: сайт на Node.js работает на порту 3000, чат на Python - на порту 5000, панель аналитики - на порту 8080. Вместо того чтобы открывать все эти порты в файерволе, вы открываете только 80 и 443. Nginx принимает все запросы и, в зависимости от доменного имени или пути, "проксирует" (перенаправляет) их на нужный внутренний порт.

  2. SSL-терминирование: Ваши внутренние приложения (на Node.js, Python, Java) могут быть сложны в настройке HTTPS. Гораздо проще настроить HTTPS один раз на Nginx, а Nginx будет общаться с вашими приложениями по обычному, незашифрованному HTTP внутри сервера. Всю тяжелую работу по шифрованию берет на себя Nginx.

  3. Балансировка нагрузки (Load Balancing): Если ваш сайт стал очень популярным и одного сервера-приложения не хватает, вы можете запустить три одинаковых копии на портах 3000, 3001, 3002. Nginx будет распределять входящие запросы между ними, чтобы ни один не был перегружен.

  4. Кэширование: Nginx может кэшировать "тяжелые" ответы от ваших приложений и отдавать их посетителям мгновенно, не беспокоя приложение каждый раз.

Часть 3: Практика. Настраиваем обратный прокси

Наш сценарий:

  1. Мы создадим простейшее "приложение" - веб-сервер на Python, который будет работать на внутреннем порту 9000.

  2. Мы настроим Nginx так, чтобы при обращении к домену proxy.local он перенаправлял запросы на это приложение.

Шаг 1: Создание и запуск внутреннего приложения (на сервере)
Python 3 обычно предустановлен. Он имеет встроенный простенький веб-сервер, идеальный для наших тестов.

  1. Создадим каталог и файл для нашего приложения:

    mkdir -p /var/www/my-app
    cd /var/www/my-app
    # Создаем простую HTML-страницу для нашего приложения
    cat > index.html <<EOF
    <h1>Привет от внутреннего Python-сервера!</h1>
    <p>Вы попали сюда через обратный прокси Nginx.</p>
    EOF
  2. Запустим веб-сервер на порту 9000.

    # python3 -m http.server [порт]
    python3 -m http.server 9000

    Ваш терминал "зависнет" - это нормально. Веб-сервер запущен и работает в этом окне. Не закрывайте его! Для дальнейших шагов откройте новое SSH-соединение с вашим сервером в новом окне терминала.

  3. Проверка (во втором окне терминала): Убедимся, что сервер работает, обратившись к нему "изнутри".

    # curl - это "браузер" для командной строки
    curl http://localhost:9000

    В ответ вы должны получить HTML-код нашей страницы.

Шаг 2: Настройка Nginx (во втором окне терминала)

  1. Настроим hosts-файл на вашем локальном компьютере, как мы делали в прошлом уроке (вернитесь к нему, если не помните). Добавьте строку:
    ВАШ_IP_АДРЕС_СЕРВЕРА proxy.local

  2. Создадим конфигурационный файл для proxy.local на сервере:

    nano /etc/nginx/sites-available/proxy.local

    Вставьте в него следующий код:

    server {
        listen 80;
        server_name proxy.local;
    
        location / {
            proxy_pass http://localhost:9000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

Разбор магии - блока location:

  • proxy_pass http://localhost:9000;Это сердце обратного прокси. Эта директива говорит: "Когда приходит запрос, который попадает в этот location, перенаправь его по адресу http://localhost:9000".

  • proxy_set_header ...: Это очень важные строки. Когда Nginx перенаправляет запрос, он как бы создает новый запрос от своего имени. Эти директивы добавляют в новый запрос оригинальные заголовки, чтобы внутреннее приложение знало, от какого реального клиента пришел запрос.

    • Host: Оригинальный домен.

    • X-Real-IP: IP-адрес клиента.

    • X-Forwarded-For: Цепочка IP-адресов, если прокси было несколько.

    • X-Forwarded-Proto: Протокол (http или https).

  1. Включаем наш новый сайт:

    ln -s /etc/nginx/sites-available/proxy.local /etc/nginx/sites-enabled/
  2. Проверяем и перезагружаем Nginx:

    nginx -t
    systemctl reload nginx

Шаг 3: Финальная проверка
Откройте браузер на вашем локальном компьютере и перейдите по адресу http://proxy.local.

Вы должны увидеть страницу с текстом "Привет от внутреннего Python-сервера!". Вы обратились к Nginx на стандартный 80-й порт, а он незаметно для вас "сходил" к Python-серверу на 9000-й порт и отдал вам результат.

Теперь вы можете остановить Python-сервер, нажав Ctrl+C в первом окне терминала.

Часть 4: Заключение

Сегодня вы освоили одну из самых мощных и фундаментальных концепций современного веба - обратное проксирование. Вы научились:

  • Понимать разницу между прямым и обратным прокси.

  • Осознавать ключевые преимущества обратного прокси: "единое окно", SSL-терминирование, балансировка нагрузки.

  • Запускать простые внутренние приложения, недоступные извне.

  • Настраивать Nginx с помощью директивы proxy_pass для перенаправления запросов на эти внутренние приложения.

  • Правильно передавать заголовки, чтобы бэкенд-приложение получало корректную информацию о клиенте.

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

На следующем, 44-м уроке, мы познакомимся со вторым "гигантом" мира веб-серверов - Apache. Мы установим его, сравним его конфигурацию с Nginx и поймем, в каких ситуациях он может быть предпочтительнее.

Перейти к просмотру - УРОК №44.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи нашли это полезным (0 голосов)