Обратный прокси-сервер — это служба, которая принимает запрос клиента, отправляет запрос одному или нескольким прокси-серверам, получает ответ и доставляет ответ сервера клиенту.
Благодаря своей производительности и масштабируемости NGINX часто используется в качестве обратного прокси-сервера для HTTP-серверов и серверов, отличных от HTTP. Типичная конфигурация обратного прокси-сервера — поставить Nginx перед приложениями Node.js , Python или Java .
Использование Nginx в качестве обратного прокси дает вам несколько дополнительных преимуществ:
- Балансировка нагрузки — Nginx может выполнять балансировку нагрузки для распределения запросов клиентов по прокси-серверам, что повышает производительность, масштабируемость и надежность.
- Кеширование. Используя Nginx в качестве обратного прокси-сервера, вы можете кэшировать предварительно обработанные версии страниц, чтобы ускорить загрузку страницы. Он работает путем кэширования содержимого, полученного от ответов прокси-серверов, и использования его для ответа клиентам без необходимости каждый раз связываться с прокси-сервером для получения одного и того же содержимого.
- Завершение SSL — Nginx может выступать в качестве конечной точки SSL для соединений с клиентами. Он будет обрабатывать и расшифровывать входящие SSL-соединения и шифровать ответы прокси-сервера.
- Сжатие — если прокси-сервер не отправляет сжатые ответы, вы можете настроить Nginx для сжатия ответов перед их отправкой клиентам.
- Смягчение DDoS-атак — вы можете ограничить входящие запросы и количество подключений на один IP-адрес до значения, типичного для обычных пользователей. Nginx также позволяет блокировать или ограничивать доступ в зависимости от местоположения клиента и значения заголовков запроса, таких как «User-Agent» и «Referer».
В этой статье описаны шаги, необходимые для настройки Nginx в качестве обратного прокси.
Содержание
Подготовка
Мы предполагаем, что у вас установлен Nginx на вашем сервере Ubuntu , CentOS или Debian .
Использование Nginx в качестве обратного прокси
Чтобы настроить Nginx в качестве обратного прокси для HTTP-сервера, откройте файл конфигурации блока сервера домена и укажите в нем расположение и прокси-сервер:
server {
listen 80;
server_name www.example.com example.com;
location /app {
proxy_pass http://127.0.0.1:8080;
}
}
URL-адрес проксируемого сервера устанавливается с proxy_pass
директивы proxy_pass
и может использовать HTTP
или HTTPS
качестве протокола, доменного имени или IP-адреса, а также необязательного порта и URI в качестве адреса.
Приведенная выше конфигурация указывает Nginx передавать все запросы в /app
прокси-серверу по адресу http://127.0.0.1:8080
.
/etc/nginx/sites-available
, а в CentOS — в /etc/nginx/conf.d
.Чтобы лучше проиллюстрировать, как proxy_pass
директивы location
и proxy_pass
, рассмотрим следующий пример:
server {
listen 80;
server_name www.example.com example.com;
location /blog {
proxy_pass http://node1.com:8000/wordpress/;
}
}
Если посетитель обращается к http://example.com/blog/my-post
, Nginx передаст этот запрос по прокси на http://node1.com:8000/wordpress/my-post
.
Когда адрес проксируемого сервера содержит URI, ( /wordpress/
), URI запроса, который передается на проксируемый сервер, заменяется URI, указанным в директиве. Если адрес прокси-сервера указан без URI, полный URI запроса передается на прокси-сервер.
Передача заголовков запроса
Когда Nginx проксирует запрос, он автоматически определяет два поля заголовка в проксируемых запросах от клиента, Host
и Connection
, и удаляет пустые заголовки. Host
установлен на переменную $proxy_host
, а Connection
установлено на закрытие.
Чтобы настроить или установить заголовки для прокси-соединений, используйте директиву proxy_set_header
, за которой следует значение заголовка. Вы можете найти список всех доступных заголовков запросов и их разрешенные значения здесь . Если вы хотите предотвратить передачу заголовка на прокси-сервер, установите для него пустую строку ""
.
В следующем примере мы меняем значение поля заголовка Host
на $host
и удаляем поле заголовка Accept-Encoding
, устанавливая его значение в пустую строку.
location / {
proxy_set_header Host $host;
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:3000;
}
Каждый раз, когда вы изменяете файл конфигурации, вам необходимо перезапустить службу Nginx, чтобы изменения вступили в силу.
Настройка Nginx в качестве обратного прокси для прокси-сервера без HTTP
Чтобы настроить Nginx в качестве обратного прокси-сервера для прокси-сервера, отличного от HTTP, вы можете использовать следующие директивы:
fastcgi_pass
— обратный прокси к серверу FastCGI.-
uwsgi_pass
— обратный прокси к серверу uwsgi. -
scgi_pass
— обратный прокси к серверу SCGI. -
memcached_pass
— обратный прокси к серверу Memcached .
Один из наиболее распространенных примеров — использование Nginx в качестве обратного прокси для PHP-FPM :
server {
# ... other directives
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
}
}
Общие параметры обратного прокси Nginx
В настоящее время обслуживание контента через HTTPS стало стандартом. В этом разделе мы дадим вам пример конфигурации обратного прокси-сервера HTTPS Nginx, включая рекомендуемые параметры и заголовки прокси-сервера Nginx.
location/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
proxy_http_version 1.1
— определяет версию протокола HTTP для проксирования, по умолчанию она установлена на 1.0. Для Websockets иkeepalive
соединений вам необходимо использовать версию 1.1.-
proxy_cache_bypass $http_upgrade
— Устанавливает условия, при которых ответ не будет взят из кеша. -
Upgrade $http_upgrade
иConnection "upgrade"
— эти поля заголовка необходимы, если ваше приложение использует веб-сокеты. -
Host $host
— Переменная$host
в следующем порядке приоритета содержит: имя хоста из строки запроса, или имя хоста из поля заголовка запросаHost
, или имя сервера, соответствующее запросу. -
X-Real-IP $remote_addr
— перенаправляет удаленный IP-адрес реального посетителя на прокси-сервер. -
X-Forwarded-For $proxy_add_x_forwarded_for
— список, содержащий IP-адреса каждого сервера, через который клиент прошел проксирование. -
X-Forwarded-Proto $scheme
— при использовании внутри блока HTTPS-сервера каждый HTTP-ответ от проксируемого сервера перезаписывается на HTTPS. -
X-Forwarded-Host $host
— определяет исходный хост, запрошенный клиентом. -
X-Forwarded-Port $server_port
— определяет исходный порт, запрошенный клиентом.
Если у вас нет существующего сертификата SSL / TLS, используйте certbot для получения бесплатного SSL-сертификата Let's Encrypt на вашем сервере Ubuntu 18.04 , CentOS 7 или Debian .
Выводы
Вы узнали, как использовать Nginx в качестве обратного прокси. Мы также показали вам, как передавать дополнительные параметры на сервер, а также изменять и устанавливать различные поля заголовка в проксированных запросах.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Сказано: […Обратный прокси-сервер — это служба, которая принимает запрос клиента, отправляет запрос одному или нескольким прокси-серверам, получает ответ и доставляет ответ сервера клиенту. …]
На самом деле: Обратный прокси-сервер — это служба, которая отвечает проксируемым серверам на их переодический запрос, поступившие на их адрес запросы клиентов, т.е. он всегда всех слушает, и если отвечает, то только по запросу. Вся выше приведенная конфигурация соответствую прямому прокси, т.е. запросы клиентов, непосредственно передаются проксируемым серверам.
Константин, обратным прокси-сервер является потому, что транслируется запросы от клиентов из внешней сети на сервера внутренней. Кроме того, в отличие от обычного прокси, вам на клиенте никакие настройки производить не надо, он даже не знает о его существовании. Что за периодические запросы от серверов? Обратный прокси устанавливает два соединения — между клиентом и внутренним сервером и, получая запрос от первого, транслирует во второй.