Тема настройки прокси становится актуальной для разработчиков, системных администраторов и всех, кто управляет веб-серверами. Прокси-сервер, или просто прокси, — это сервер-посредник, который получает запрос от клиента (например, браузера), передает его на другой сервер и возвращает ответ обратно клиенту.

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

Если вам требуется надежный и быстрый сервер для настройки прокси, Timeweb Cloud предлагает удобную и мощную платформу с поддержкой всех необходимых технологий.

Часть 1: Настройка прокси в Nginx

Зачем нужен прокси в Nginx

Прокси в Nginx помогает решать сразу несколько задач:

  • Распределение нагрузки. Если у вас много клиентов, можно направлять их запросы на несколько серверов, тем самым снижая нагрузку на каждый.
  • Улучшение безопасности. Использование прокси позволяет скрыть IP-адрес и расположение реального сервера, что затрудняет попытки взлома и атак.
  • Кэширование данных. Nginx может временно сохранять (кэшировать) контент, чтобы сократить время ответа на повторяющиеся запросы. Это особенно полезно для медиа-контента, API или статических страниц.
  • SSL-теминация. Если Nginx настроен для работы с SSL-сертификатами, он может принимать HTTPS-запросы и расшифровывать их до передачи на другие серверы.

Основные виды прокси в Nginx

В Nginx можно использовать несколько видов прокси:

  • Реверс-прокси (Reverse Proxy). Самый популярный тип прокси для веб-серверов. Когда клиент отправляет запрос на Nginx, сервер передает его на один из своих бекенд-серверов и возвращает результат обратно.
  • Форвард-прокси (Forward Proxy). Этот вид прокси используется, если ваш Nginx должен принимать запросы от внутренней сети и отправлять их во внешнюю, например, для фильтрации трафика или обхода блокировок.

В большинстве случаев в веб-разработке нас интересует реверс-прокси, и именно на него будет основной акцент в нашем гайде.

Установка Nginx

Прежде чем настроить прокси, убедитесь, что у вас установлен Nginx. Если его еще нет, установите его командой (например, на Ubuntu):

sudo apt update
sudo apt install nginx

После установки Nginx можно запустить и проверить его работу:

sudo systemctl start nginx
sudo systemctl enable nginx

Чтобы убедиться, что Nginx установлен и работает, откройте браузер и перейдите на http://ваш-IP-адрес. Должна появиться стандартная страница приветствия Nginx.

Базовая настройка реверс-прокси

Теперь переходим к настройке реверс-прокси. Представьте, что у вас есть бекенд-сервер (например, Node.js, Django или любой другой), который слушает запросы на порту 3000. Мы хотим, чтобы Nginx принимал все запросы на стандартном порту 80 и передавал их на бекенд-сервер.

Откройте файл конфигурации Nginx. На большинстве систем это можно сделать так:

sudo nano /etc/nginx/sites-available/default

Внутри файла найдите или добавьте блок server. Вот базовая конфигурация для реверс-прокси:

server {
    listen 80;

    server_name ваш-домен.ru;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

Давайте разберем, что здесь происходит:

  • listen 80; — указывает Nginx слушать порт 80, на котором работают стандартные HTTP-запросы.
  • server_name — замените на домен, который хотите использовать. Если у вас нет домена, оставьте это поле как есть.
  • location / — указывает, что проксирование будет происходить для всех путей («/» означает корень). Если нужно проксировать только определенный путь, например, /api, замените / на /api.
  • proxy_pass — ключевая строка. Это адрес вашего бекенд-сервера. Здесь 127.0.0.1:3000 означает, что Nginx будет проксировать запросы на локальный сервер, слушающий порт 3000.
  • proxy_set_header — эти строки добавляют дополнительные заголовки, которые помогают передать на бекенд оригинальный IP-адрес пользователя, схему соединения (http/https) и другую полезную информацию.

После того как вы внесли изменения, сохраните файл и выйдите из редактора. Затем проверьте конфигурацию на наличие ошибок командой:

sudo nginx -t

Если ошибок нет, перезапустите Nginx для применения новых настроек:

sudo systemctl reload nginx

Проверка работы прокси

Теперь время проверить настройку. Откройте браузер и перейдите по адресу http://ваш-домен.ru. Если всё настроено правильно, вы должны увидеть ответ от вашего бекенд-сервера, работающего на порту 3000, но через порт 80.

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

Часть 2: Настройка проксирования с SSL и улучшение безопасности

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

Получение SSL-сертификата

Есть несколько способов получить SSL-сертификат, но самый популярный и бесплатный — это Let’s Encrypt. Этот сервис позволяет вам создать сертификат, который автоматически продлевается каждые 90 дней, что значительно упрощает поддержку HTTPS.

Установите Certbot — инструмент для автоматического получения и установки сертификатов Let’s Encrypt. На Ubuntu это можно сделать так:

sudo apt update
sudo apt install certbot python3-certbot-nginx

После установки Certbot запустите команду для создания сертификата:

sudo certbot --nginx -d ваш-домен.ru -d www.ваш-домен.ru

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

Ручная настройка SSL (если нужен особый контроль)

Если вы хотите настроить сертификат вручную, следуйте этим шагам. После получения SSL-сертификата от любого провайдера (например, от Let’s Encrypt), добавьте его в конфигурацию Nginx.

Откройте файл конфигурации Nginx:

sudo nano /etc/nginx/sites-available/default

Замените конфигурацию сервера на следующую, добавив настройки для SSL:

server {
    listen 80;
    server_name ваш-домен.ru www.ваш-домен.ru;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name ваш-домен.ru www.ваш-домен.ru;

    ssl_certificate /etc/letsencrypt/live/ваш-домен.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ваш-домен.ru/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

Что здесь происходит:

  • Первый server блок (HTTP) — слушает порт 80 (HTTP) и перенаправляет весь HTTP-трафик на HTTPS с помощью return 301 https://$host$request_uri;. Это важно, чтобы все запросы по HTTP автоматически перенаправлялись на защищённое соединение.
  • Второй server блок (HTTPS) — слушает HTTPS-трафик на порту 443 и использует ваш SSL-сертификат.
  • ssl_certificate и ssl_certificate_key — указывают путь к файлам сертификата и ключа. Обычно для Let’s Encrypt сертификаты находятся по пути /etc/letsencrypt/live/ваш-домен.ru/.
  • ssl_protocols и ssl_ciphers — позволяют задать протоколы и шифры, которые Nginx будет использовать для защиты соединения. Выбирайте самые безопасные (как в примере выше), чтобы поддерживать современные стандарты.

Улучшение безопасности с помощью дополнительных заголовков

Чтобы повысить безопасность, добавим HTTP-заголовки, защищающие ваш сайт от атак и уязвимостей. Эти заголовки делают сайт менее уязвимым для некоторых типов атак, таких как XSS и кликджекинг.

Добавьте их в location / блок:

add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";

Что означают эти заголовки:

  • X-Content-Type-Options nosniff — предотвращает попытки браузера интерпретировать файлы не по типу. Например, если сервер отдает файл, обозначенный как текст, браузер не попытается его интерпретировать как что-то другое.
  • X-Frame-Options DENY — запрещает встроить ваш сайт в iframe. Это защищает от кликджекинга, когда злоумышленник может вставить ваш сайт в невидимый фрейм и заставить пользователя совершить несанкционированные действия.
  • X-XSS-Protection «1; mode=block» — активирует встроенную защиту браузера от XSS-атак.

Обновление и проверка конфигурации

Как и раньше, после внесения изменений в конфигурацию, проверьте её:

sudo nginx -t

Затем перезапустите Nginx:

sudo systemctl reload nginx

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

Часть 3: Настройка кэширования, оптимизация и расширенные параметры прокси в Nginx

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

Настройка кэширования в Nginx

Кэширование позволяет хранить ответы сервера для повторных запросов и быстро возвращать их пользователям. Если у вас много статического контента или часто повторяющихся данных, кэширование сократит нагрузку на сервер и ускорит отдачу контента.

Включение прокси-кэширования

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

Создайте каталог для кэша:

sudo mkdir /var/cache/nginx/proxy_cache
sudo chown -R www-data:www-data /var/cache/nginx/proxy_cache

Откройте файл конфигурации Nginx и добавьте в него параметры кэширования. Например:

proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

server {
    listen 443 ssl;
    server_name ваш-домен.ru www.ваш-домен.ru;

    ssl_certificate /etc/letsencrypt/live/ваш-домен.ru/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ваш-домен.ru/privkey.pem;

    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_pass http://127.0.0.1:3000;
        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_cache_path — указывает путь к папке для кэша и создаёт зону кэширования my_cache с 10 МБ памяти для индексов ключей (keys_zone). max_size ограничивает размер кэша до 1 ГБ, а inactive=60m — это время, через которое кэшированные данные удаляются, если к ним не обращались.
  • proxy_cache — активирует кэширование для my_cache в пределах заданного location.
  • proxy_cache_valid — указывает, на какое время кэшировать ответы с разными статусами. В данном примере ответы с кодом 200 и 302 кэшируются на 10 минут, а ошибки 404 — на 1 минуту.

Кэширование только статического контента

Если вам нужно кэшировать только статический контент (например, изображения или файлы стилей), можно добавить условие к location:

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 7d;
    proxy_cache my_cache;
    proxy_pass http://127.0.0.1:3000;
}

expires 7d означает, что данные кэшируются на 7 дней, что подходит для редко обновляемых статических файлов.

Настройка тайм-аутов и ограничений по времени

Чтобы улучшить работу прокси и предотвратить задержки при обращении к бекенду, можно установить тайм-ауты для запросов:

proxy_connect_timeout 5s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;

Значения тайм-аутов:

  • proxy_connect_timeout — время ожидания подключения к бекенд-серверу.
  • proxy_read_timeout — время ожидания ответа от бекенд-сервера после подключения.
  • proxy_send_timeout — время, за которое Nginx должен передать запрос бекенду.

Эти параметры полезны для управления долгими соединениями и предотвращения излишнего использования ресурсов на сервере.

Ограничение размера буфера

Иногда Nginx может работать с крупными данными, например, при загрузке больших файлов. Чтобы управлять памятью более эффективно, можно установить размер буферов:

proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

Эти параметры помогут избежать перегрузки памяти и обеспечат стабильную работу сервера при работе с большими данными.

Завершение и тестирование

Как и всегда, после внесения изменений в конфигурацию, проверьте её:

sudo nginx -t

Затем перезапустите Nginx:

sudo systemctl reload nginx

Проверка эффективности кэширования

Чтобы убедиться, что кэширование работает, можно использовать curl. Запустите команду дважды и обратите внимание на заголовки:

curl -I http://ваш-домен.ru

При первом запросе в заголовках не будет X-Cache или его значение будет MISS, что означает, что данные берутся с сервера. При повторном запросе значение X-Cache должно измениться на HIT, подтверждая, что данные взяты из кэша.

Заключение

Мы прошли через все этапы настройки реверс-прокси в Nginx, добавили SSL, настроили кэширование и оптимизировали сервер для улучшения производительности. Теперь ваш Nginx готов принимать запросы, безопасно проксировать их на бекенд, кэшировать данные и обеспечивать быстрый отклик. Такой подход позволяет использовать Nginx не просто как прокси, а как полноценный инструмент для управления и оптимизации трафика.

 

Комментарии

0

Без регистрации и смс