Nginx — это веб-сервер с асинхронным фреймворком, который также можно использовать в качестве обратного прокси, балансировщика нагрузки и HTTP-кэша.Сегодня мы поговорим об обратном прокси.
Что такое обратный прокси?
Обратный прокси-сервер означает, что прокси-сервер принимает запросы на подключение в Интернете, затем перенаправляет запрос на сервер во внутренней сети и возвращает результат, полученный от сервера, клиенту, запрашивающему подключение в Интернете. сервер действует как обратный прокси-сервер для внешнего мира.
Мы понимаем это по-другому, то есть когда внешняя сеть не может получить прямой доступ к внутреннему сетевому устройству, доступ к нему возможен только через прокси-сервер, а внешняя сеть видит только прокси-сервер, и обратная связь также возвращается прокси-сервер.Специфика прямого подключения сервера к внутренней сети не видна.
В чем разница между прямым прокси и обратным прокси?
Прямой прокси — это сервер, который находится между клиентом и исходным сервером.Чтобы получить контент с исходного сервера, клиент отправляет запрос прокси-серверу с указанием цели (исходного сервера), а прокси-сервер пересылает запрос на исходный сервер. исходный сервер и перенаправляет его на исходный сервер, возвращая полученный контент клиенту. Клиент может использовать прямой прокси.
Здесь есть одно из самых существенных отличий: (вы можете увидеть схему ниже, чтобы почувствовать это)
- Прямой прокси-сервер означает, что клиент знает, где находится целевой сервер, а затем использует прокси-сервер для доступа к целевому серверу, к которому клиент не может получить прямой доступ, а целевой сервер не знает, через что клиент получает доступ. которыйПрямой прокси-прокси-сервер — это клиент.
- В обратном прокси внешняя сеть невидима для конкретной ситуации внутренней сети, а прокси-сервер проксирует внутреннюю сеть для возврата требуемых данных (конечно, статические файлы можно размещать в Nginx, а статическое и динамическое разделение будет обсуждаться позже), и сервер знает источник запроса и данныеОбратный прокси-сервер — это сервер.
Преимущества обратного прокси
- Реальный веб-сервер защищен, веб-сервер невидим для внешнего мира, а внешняя сеть может видеть только обратный прокси-сервер, а на обратном прокси-сервере нет реальных данных, поэтому безопасность ресурсов веб-сервера гарантировано.
- На основе обратного прокси генерируется метод разделения динамических и статических ресурсов и балансировки нагрузки, что снижает нагрузку на веб-сервер и ускоряет скорость доступа к сайту (разделение динамических и статических ресурсов и балансировка нагрузки будут обсудим позже)
- Это экономит ограниченные ресурсы IP-адресов.Все веб-сайты на предприятии имеют общий IP-адрес, зарегистрированный в Интернете.Эти серверы выделяют частные адреса и используют виртуальные хосты для предоставления услуг внешнему миру;
Простая настройка обратного прокси в Nginx.conf
server {
listen 8182;
server_name localhost;
...
location / {
proxy_pass http://localhost:8082;
...
}
}
Блок сервера можно понимать как виртуальный хост.В настоящее время, если мы вызовем http://localhost:8182, запрос будет переадресован на http://localhost:8082, поэтому фактическая обработка этого запроса — http: // локальный: 8082. локальный: 8082
Как веб-сервер получает реальный IP-адрес пользователя после использования Nginx
проблема:
При использовании Nginx request.getRemoteAddr() на веб-сервере получает IP-адрес Nginx, а не IP-адрес реального пользователя.
решение:
Добавьте несколько операций присваивания в расположение в nginx.conf.
server {
...
location / {
...
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Затем веб-сервер может получить реальный IP-адрес пользователя через request.getHeader("X-Forwarded-For");
Введение в знания:
- proxy_set_header X-real-ip $remote_addr;
X-real-ip здесь — произвольное имя, имя произвольное, эффект в том, что ip можно поместить в переменную X-real-ip, которую можно получить через request.getHeader("X-real-ip ") Текущее значение и X-Forwarded-For, поясняемые ниже - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Прежде всего нам нужно знать, что такое X-Forwarded-For?
X-Forwarded-For: называется заголовком XFF, представляет клиента, то есть реальный IP-адрес отправителя запроса HTTP. Этот элемент будет добавлен только при передаче прокси-сервера HTTP или сервера балансировки нагрузки. Стандарт, не относящийся к RFC, для определения адреса клиента, подключающегося к веб-серверу через прокси-сервер HTTP или исходный IP-адрес балансировщика нагрузки.
Когда Nginx имеет настройки X-Forwarded-For, он будет записывать каждый раз, когда он пересылается прокси-сервером в формате client1, proxy1, proxy2, и каждый адрес разделен запятыми, и, поскольку это не стандарт RFC, он не по умолчанию Принудительно добавляется, когда ретранслируется через прокси, удаленный IP-адрес, видимый внутренним сервером, является IP-адресом прокси-сервера, то есть, если IP-адрес пользователя не может быть получен напрямую с помощью request.getHeader("X -Forwarded-For"), то мы Как настроить получение ip пользователя?
На этом этапе вам нужно добавить в блок местоположения конфигурации nginx
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
Обратите внимание, что здесь имеется в виду добавление к X-Forwarded-For, а не перезапись, а добавленный формат — это «client1, proxy1....", упомянутый ранее. По умолчанию X-Forwarded-For пуст, если есть если два nginx настроены с помощью вышеуказанной команды, request.getHeader("X-Forwarded-For") веб-сервера получит "ip-адрес пользователя, ip-адрес первого nginx", соответствующий предыдущему формату соответственно.
proxy_add_forwarded_for содержит два формата, первая часть — это X-Forwarded-For заголовка запроса, а вторая — $remote_addr, то есть ip удаленного пользователя
Давайте возьмем простую диаграмму, чтобы объяснить:
Разница между X-real-ip и X-Forwarded-For
-
X-real-ip перезаписывается, а X-Forwarded-For добавляется позже
Например, запрос отправляется с 1.1.1.1 и проходит через три слоя прокси. Первый слой составляет 2.2.2.2, второй слой составляет 3.3.3.3, а источник IP4.4.4.4 настоящего запроса является третьим слоем прокси.
Однако X-Read-IP не имеет соответствующих стандартов.В приведенном выше примере, если настроен X-Read-IP, могут быть две ситуации.
最后一跳是正向代理,可能会保留真实客户端IP:X-Real-IP: 1.1.1.1// 最后一跳是反向代理,比如Nginx,一般会是与之直接连接的客户端IP:X-Real-IP: 3.3.3.3
И результат X-Forwarded-For:
X-Forwarded-For:1.1.1.1, 2.2.2.2, 3.3.3.3
Итак, если есть только один слой прокси, два значения одинаковы.