
Обратный прокси-сервер — это служба, которая принимает клиентский запрос, отправляет его одному или нескольким прокси-серверам, получает ответ и доставляет ответ сервера клиенту.
Благодаря своей производительности и масштабируемости NGINX часто используется в качестве обратного прокси-сервера для HTTP- и не-HTTP-серверов. Типичная конфигурация обратного прокси-сервера предполагает размещение Nginx перед приложениями Node.js , Python или Java .
Использование Nginx в качестве обратного прокси-сервера дает вам ряд дополнительных преимуществ:
- Балансировка нагрузки . Nginx может выполнять балансировку нагрузки для распределения клиентских запросов по прокси-серверам, что повышает производительность, масштабируемость и надежность.
- Кэширование — используя Nginx в качестве обратного прокси-сервера, вы можете кэшировать предварительно отрендеренные версии страниц для ускорения их загрузки. Nginx кэширует контент, полученный из ответов проксируемых серверов, и использует его для ответа клиентам, избавляя от необходимости каждый раз обращаться к проксируемому серверу за одним и тем же контентом.
- Терминация SSL — Nginx может выступать в качестве конечной точки SSL для соединений с клиентами. Он обрабатывает и расшифровывает входящие SSL-соединения, а также шифрует ответы прокси-сервера.
- Сжатие . Если прокси-сервер не отправляет сжатые ответы, вы можете настроить Nginx на сжатие ответов перед отправкой их клиентам.
- Противодействие DDoS-атакам . Вы можете ограничить входящие запросы и количество подключений на один IP-адрес до значений, типичных для обычных пользователей. Nginx также позволяет блокировать или ограничивать доступ в зависимости от местоположения клиента и значений заголовков запроса, таких как «User-Agent» и «Referer».
В этой статье описываются шаги, необходимые для настройки Nginx в качестве обратного прокси-сервера.
Предпосылки
Мы предполагаем, что на вашем сервере Ubuntu , CentOS или Debian установлен Nginx.
Использование 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 и может использовать HTTP или HTTPS в качестве протокола, доменное имя или IP-адрес, а также необязательный порт и URI в качестве адреса.
Приведенная выше конфигурация указывает Nginx передавать все запросы к расположению /app на прокси-сервер по адресу http://127.0.0.1:8080 .
В дистрибутивах на базе Ubuntu и Debian файлы блоков сервера хранятся в каталоге /etc/nginx/sites-available , а в CentOS — в каталоге /etc/nginx/conf.d .
Чтобы лучше проиллюстрировать работу директив 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 — значение close.
Чтобы настроить или задать заголовки для проксируемых соединений, используйте директиву 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 в настоящее время стала стандартом. В этом разделе мы приведём пример настройки обратного прокси-сервера Nginx для HTTPS, включая рекомендуемые параметры и заголовки прокси-сервера 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"— эти поля заголовка обязательны для заполнения, если ваше приложение использует Websockets. -
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 в качестве обратного прокси-сервера. Мы также показали, как передавать дополнительные параметры на сервер, а также изменять и задавать различные поля заголовков в проксируемых запросах.
Если у вас есть вопросы или пожелания, не стесняйтесь оставлять комментарии.
Связанные руководства
- Защитите Nginx с помощью Let's Encrypt на CentOS 8
- Как запустить, остановить или перезапустить Nginx
- Защитите Nginx с помощью Let's Encrypt на Debian 10 Linux
- Как установить Odoo 13 на Ubuntu 18.04
- Настройка журналов ошибок и доступа Nginx
- Как установить Nginx на CentOS 8
- Перенаправление HTTP на HTTPS в Nginx