Поиск по сайту:

Как настроить Nginx в качестве обратного прокси-сервера в Ubuntu 22.04


Введение

Обратный прокси-сервер — это рекомендуемый метод для доступа сервера приложений к Интернету. Независимо от того, используете ли вы приложение Node.js в производственной среде или минимальный встроенный веб-сервер с Flask, эти серверы приложений часто будут привязываться к localhost через TCP-порт. Это означает, что по умолчанию ваше приложение будет доступно только локально на той машине, на которой оно находится. Хотя вы можете указать другую точку привязки для принудительного доступа через Интернет, эти серверы приложений предназначены для обслуживания из-за обратного прокси-сервера в производственных средах. Это обеспечивает преимущества безопасности, изолируя сервер приложений от прямого доступа в Интернет, возможность централизованной защиты брандмауэра и минимальную плоскость атаки для распространенных угроз, таких как атаки типа «отказ в обслуживании».

С точки зрения клиента взаимодействие с обратным прокси ничем не отличается от прямого взаимодействия с сервером приложений. Функционально это одно и то же, и клиент не может отличить. Клиент запрашивает ресурс, а затем получает его без дополнительной настройки, требуемой клиентом.

В этом руководстве показано, как настроить обратный прокси-сервер с помощью Nginx, популярного веб-сервера и решения для обратного прокси-сервера. Вы установите Nginx, настроите его как обратный прокси-сервер с помощью директивы proxy_pass и перенаправите соответствующие заголовки из запроса вашего клиента. Если у вас нет сервера приложений для тестирования, вы можете настроить тестовое приложение с помощью WSGI-сервера Gunicorn.

Предпосылки

Для выполнения этого урока вам понадобятся:

  • Сервер Ubuntu 22.04, настроенный в соответствии с нашим руководством по первоначальной настройке сервера для Ubuntu 22.04,
  • Адрес сервера приложений, который вы хотите использовать через прокси. В этом руководстве он будет называться app_server_address. Это может быть IP-адрес с портом TCP (например, Gunicorn по умолчанию http://127.0.0.1:8000) или сокет домена unix (например, http://unix :/tmp/pgadmin4.sock для pgAdmin). Если у вас нет настроенного сервера приложений для тестирования, вам помогут настроить приложение Gunicorn, которое будет привязано к http://127.0.0.1:8000.
  • Доменное имя, указывающее на общедоступный IP-адрес вашего сервера. Это будет настроено с помощью Nginx для прокси-сервера вашего сервера приложений.

Шаг 1 — Установка Nginx

Nginx доступен для установки с помощью apt через репозитории по умолчанию. Обновите индекс репозитория, затем установите Nginx:

  1. sudo apt update
  2. sudo apt install nginx

Нажмите Y, чтобы подтвердить установку. Если вас попросят перезапустить службы, нажмите ENTER, чтобы принять значения по умолчанию.

Вам необходимо разрешить доступ к Nginx через брандмауэр. Настроив сервер в соответствии с исходными предварительными требованиями к серверу, добавьте следующее правило с помощью ufw:

  1. sudo ufw allow 'Nginx HTTP'

Теперь вы можете убедиться, что Nginx работает:

  1. systemctl status nginx
Output
● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2022-08-29 06:52:46 UTC; 39min ago Docs: man:nginx(8) Main PID: 9919 (nginx) Tasks: 2 (limit: 2327) Memory: 2.9M CPU: 50ms CGroup: /system.slice/nginx.service ├─9919 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;" └─9920 "nginx: worker process

Затем вы добавите собственный блок сервера с вашим доменом и прокси-сервером приложения.

Шаг 2 — Настройка блока сервера

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

  1. sudo nano /etc/nginx/sites-available/your_domain

Вставьте следующее в новый файл, заменив your_domain и app_server_address. Если у вас нет сервера приложений для тестирования, по умолчанию используйте http://127.0.0.1:8000 для дополнительной настройки сервера Gunicorn на шаге 3:

server {
    listen 80;
    listen [::]:80;

    server_name your_domain www.your_domain;
        
    location / {
        proxy_pass app_server_address;
        include proxy_params;
    }
}

Сохраните и выйдите. С помощью nano вы можете сделать это, нажав CTRL+O, а затем CTRL+X.

Этот файл конфигурации начинается со стандартной настройки Nginx, где Nginx будет прослушивать порт 80 и отвечать на запросы, сделанные на your_domain и www.your_domain. Функциональность обратного прокси-сервера включается с помощью директивы Nginx proxy_pass. При такой конфигурации переход к вашему_домену в локальном веб-браузере будет таким же, как открытие app_server_address на удаленном компьютере. Хотя в этом руководстве будет проксироваться только один сервер приложений, Nginx может служить прокси-сервером для нескольких серверов одновременно. Добавляя дополнительные блоки местоположения по мере необходимости, одно имя сервера может объединять несколько серверов приложений через прокси в одно целостное веб-приложение.

Все HTTP-запросы имеют заголовки, содержащие информацию о клиенте, отправившем запрос. Сюда входят такие сведения, как IP-адрес, настройки кеша, отслеживание файлов cookie, статус авторизации и многое другое. Nginx предоставляет некоторые рекомендуемые параметры переадресации заголовков, которые вы указали как proxy_params, а подробности можно найти в /etc/nginx/proxy_params:

proxy_set_header Host $http_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;

При использовании обратных прокси ваша цель — передать соответствующую информацию о клиенте, а иногда и информацию о самом обратном прокси-сервере. Бывают случаи, когда прокси-сервер хочет знать, какой обратный прокси-сервер обработал запрос, но обычно важная информация исходит из запроса исходного клиента. Чтобы передать эти заголовки и сделать информацию доступной там, где она ожидается, Nginx использует директиву proxy_set_header.

По умолчанию, когда Nginx действует как обратный прокси-сервер, он изменяет два заголовка, удаляет все пустые заголовки, а затем передает запрос. Два измененных заголовка — это заголовок Host и Connection. Доступно много заголовков HTTP, и вы можете просмотреть этот подробный список заголовков HTTP для получения дополнительной информации о каждом из их назначений, хотя соответствующие заголовки для обратных прокси будут рассмотрены здесь позже.

Вот заголовки, пересылаемые proxy_params, и переменные, в которых он хранит данные:

  • Хост. Этот заголовок содержит исходный хост, запрошенный клиентом, то есть домен веб-сайта и порт. Nginx хранит это в переменной $http_host.
  • X-Forwarded-For: этот заголовок содержит IP-адрес клиента, отправившего первоначальный запрос. Он также может содержать список IP-адресов, причем первым идет исходный IP-адрес клиента, а затем список всех IP-адресов обратных прокси-серверов, через которые прошел запрос. Nginx хранит это в переменной $proxy_add_x_forwarded_for.
  • X-Real-IP: этот заголовок всегда содержит один IP-адрес, принадлежащий удаленному клиенту. Это отличается от аналогичного X-Forwarded-For, который может содержать список адресов. Если X-Forwarded-For отсутствует, это будет то же самое, что и X-Real-IP.
  • X-Forwarded-Proto: этот заголовок содержит протокол, используемый исходным клиентом для подключения, будь то HTTP или HTTPS. Nginx хранит это в переменной $scheme.

Затем включите этот файл конфигурации, создав из него ссылку на каталог sites-enabled, который Nginx читает при запуске:

  1. sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Теперь вы можете проверить файл конфигурации на наличие синтаксических ошибок:

  1. sudo nginx -t

При отсутствии сообщений о проблемах перезапустите Nginx, чтобы применить изменения:

  1. sudo systemctl restart nginx

Теперь Nginx настроен как обратный прокси-сервер для вашего сервера приложений, и вы можете получить к нему доступ из локального браузера, если ваш сервер приложений работает. Если у вас есть предполагаемый сервер приложений, но он не запущен, вы можете приступить к запуску предполагаемого сервера приложений. Вы можете пропустить оставшуюся часть этого руководства.

В противном случае перейдите к настройке тестового приложения и сервера с помощью Gunicorn на следующем шаге.

Шаг 3 — Тестирование вашего обратного прокси с помощью Gunicorn (необязательно)

Если перед началом этого руководства у вас был подготовлен и запущен сервер приложений, вы можете посетить его в своем браузере сейчас:

your_domain

Однако, если у вас нет под рукой сервера приложений для тестирования обратного прокси-сервера, вы можете выполнить следующие шаги, чтобы установить Gunicorn вместе с тестовым приложением. Gunicorn — это сервер Python WSGI, который часто работает в паре с обратным прокси-сервером Nginx.

Обновите индекс репозитория apt и установите gunicorn:

  1. sudo apt update
  2. sudo apt install gunicorn

У вас также есть возможность установить Gunicorn через pip с PyPI для последней версии, которая может быть связана с виртуальной средой Python, но apt используется здесь в качестве быстрого тестового стенда. .

Далее вы напишете функцию Python, возвращающую «Hello World!» как ответ HTTP, который будет отображаться в веб-браузере. Создайте test.py с помощью nano или предпочитаемого вами текстового редактора:

  1. nano test.py

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

def app(environ, start_response):
    start_response("200 OK", [])
    return iter([b"Hello, World!"])

Это минимальный код, необходимый Gunicorn для запуска ответа HTTP, который отображает строку текста в вашем веб-браузере. После просмотра кода сохраните и закройте файл.

Теперь запустите сервер Gunicorn, указав модуль Python test и функцию app внутри него. Запуск сервера возьмет на себя управление вашим терминалом:

  1. gunicorn --workers=2 test:app
Output
[2022-08-29 07:09:29 +0000] [10568] [INFO] Starting gunicorn 20.1.0 [2022-08-29 07:09:29 +0000] [10568] [INFO] Listening at: http://127.0.0.1:8000 (10568) [2022-08-29 07:09:29 +0000] [10568] [INFO] Using worker: sync [2022-08-29 07:09:29 +0000] [10569] [INFO] Booting worker with pid: 10569 [2022-08-29 07:09:29 +0000] [10570] [INFO] Booting worker with pid: 10570

Вывод подтверждает, что Gunicorn прослушивает адрес по умолчанию http://127.0.0.1:8000. Это адрес, который вы установили ранее в конфигурации Nginx для прокси. Если нет, вернитесь к файлу /etc/nginx/sites-available/your_domain и отредактируйте app_server_address, связанный с proxy_pass. директива.

Откройте веб-браузер и перейдите к домену, который вы настроили с помощью Nginx:

your_domain

Ваш обратный прокси-сервер Nginx теперь обслуживает ваш сервер веб-приложений Gunicorn, отображая «Hello World!».

Заключение

С помощью этого руководства вы настроили Nginx в качестве обратного прокси-сервера, чтобы обеспечить доступ к вашим серверам приложений, которые в противном случае были бы доступны только локально. Кроме того, вы настроили пересылку заголовков запроса, передавая информацию о заголовке клиента.

Чтобы ознакомиться с примерами полного решения, использующего Nginx в качестве обратного прокси-сервера, ознакомьтесь с тем, как запустить интерфейс Meilisearch с помощью InstantSearch в Ubuntu 22.04.