
Цель урока: Понять, что такое обратный прокси (reverse proxy), зачем он нужен, и научиться настраивать Nginx для выполнения этой роли. Мы создадим простое внутреннее приложение и "спрячем" его за Nginx, сделав его доступным для внешнего мира через стандартные порты, при этом повысив его безопасность и гибкость.
Часть 1: Теория. Прямой и Обратный прокси - в чем разница?
Вы наверняка слышали слово "прокси". Чаще всего под ним понимают прямой прокси (forward proxy).
-
Прямой прокси:
-
Аналогия: Переводчик, который сидит рядом с вами в другой стране.
-
Как работает: Он работает от вашего имени. Вы говорите ему "сходи на сайт google.com", он идет туда, забирает страницу и приносит ее вам. Для google.com посетителем был прокси-сервер, а не вы.
-
Цель: Скрыть ваш IP-адрес, обойти блокировки, кэшировать данные внутри вашей локальной сети. Он работает в интересах клиента.
-
-
Обратный прокси (Reverse Proxy):
-
Аналогия: Секретарь-ресепшионист в большом офисном здании.
-
Как работает: Все посетители приходят только к нему на ресепшн (порт 80/443). Посетитель говорит: "Мне нужен отдел маркетинга". Секретарь знает, что отдел маркетинга сидит в кабинете №305 (на порту 3000), и перенаправляет туда запрос. Для посетителя он общался только с секретарем, он даже не знает, в каком именно кабинете сидит нужный ему отдел.
-
Цель: Скрыть внутреннюю архитектуру серверов, распределить нагрузку, обеспечить SSL-шифрование, кэшировать ответы. Он работает в интересах сервера.
-
Nginx - это идеальный "секретарь-ресепшионист".
Часть 2: Зачем нужен обратный прокси? Ключевые преимущества
-
"Единое окно": У вас может быть множество разных приложений на сервере: сайт на Node.js работает на порту 3000, чат на Python - на порту 5000, панель аналитики - на порту 8080. Вместо того чтобы открывать все эти порты в файерволе, вы открываете только 80 и 443. Nginx принимает все запросы и, в зависимости от доменного имени или пути, "проксирует" (перенаправляет) их на нужный внутренний порт.
-
SSL-терминирование: Ваши внутренние приложения (на Node.js, Python, Java) могут быть сложны в настройке HTTPS. Гораздо проще настроить HTTPS один раз на Nginx, а Nginx будет общаться с вашими приложениями по обычному, незашифрованному HTTP внутри сервера. Всю тяжелую работу по шифрованию берет на себя Nginx.
-
Балансировка нагрузки (Load Balancing): Если ваш сайт стал очень популярным и одного сервера-приложения не хватает, вы можете запустить три одинаковых копии на портах 3000, 3001, 3002. Nginx будет распределять входящие запросы между ними, чтобы ни один не был перегружен.
-
Кэширование: Nginx может кэшировать "тяжелые" ответы от ваших приложений и отдавать их посетителям мгновенно, не беспокоя приложение каждый раз.
Часть 3: Практика. Настраиваем обратный прокси
Наш сценарий:
-
Мы создадим простейшее "приложение" - веб-сервер на Python, который будет работать на внутреннем порту 9000.
-
Мы настроим Nginx так, чтобы при обращении к домену proxy.local он перенаправлял запросы на это приложение.
Шаг 1: Создание и запуск внутреннего приложения (на сервере)
Python 3 обычно предустановлен. Он имеет встроенный простенький веб-сервер, идеальный для наших тестов.
-
Создадим каталог и файл для нашего приложения:
mkdir -p /var/www/my-app cd /var/www/my-app # Создаем простую HTML-страницу для нашего приложения cat > index.html <<EOF <h1>Привет от внутреннего Python-сервера!</h1> <p>Вы попали сюда через обратный прокси Nginx.</p> EOF -
Запустим веб-сервер на порту 9000.
# python3 -m http.server [порт] python3 -m http.server 9000Ваш терминал "зависнет" - это нормально. Веб-сервер запущен и работает в этом окне. Не закрывайте его! Для дальнейших шагов откройте новое SSH-соединение с вашим сервером в новом окне терминала.
-
Проверка (во втором окне терминала): Убедимся, что сервер работает, обратившись к нему "изнутри".
# curl - это "браузер" для командной строки curl http://localhost:9000В ответ вы должны получить HTML-код нашей страницы.

Шаг 2: Настройка Nginx (во втором окне терминала)
-
Настроим hosts-файл на вашем локальном компьютере, как мы делали в прошлом уроке (вернитесь к нему, если не помните). Добавьте строку:
ВАШ_IP_АДРЕС_СЕРВЕРА proxy.local -
Создадим конфигурационный файл для 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).
-
-
Включаем наш новый сайт:
ln -s /etc/nginx/sites-available/proxy.local /etc/nginx/sites-enabled/ -
Проверяем и перезагружаем 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

