Распределение нагрузки с помощью NGINX в Spring Boot

Принцип распределения нагрузки с помощью NGINX

Данная статья описывает схему построения среды для развертывания приложения написаного на Spring Boot.

Как известно Java application севера довольно плохо подходят для задачи распределения нагрузки. Особенно это актуально если нужно передавать статические данные(файлы стилей, картинки и другие). Поэтому для этих целей используются более быстрые и легкие сервера способные при минимальных нагрузках выдавать хорошую производительность. Одним из таких серверов является NGINX.

Кеширование запросов

В приведенном ниже примере система анализирует расширение запрашиваемого файла и если это один из нужных форматов кеширует данные.

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

location ~* \.(svg|js|jpg|png|css|html|gif|pdf)$ {
            proxy_pass              $scheme://app:8080/$request_uri;
            proxy_redirect  off;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        Host $http_host;
            expires 30d;
}

Перенаправление трафика к статическим данным

В данной конфигурации NGINX анализирует запрашиваемый URL и если находит совпадение (в данном случае /static) автоматически отображает файлы в файловой системе. При такой схеме трафика возникает минимальная нагрузка на систему без обязательной первичной инициализации.

Более внимательное рассмотрение показывает, что все часто запрашиваемые данные будут закешированы на протяжении 30 дней.

server {
    listen 80;
    charset utf-8;
    access_log off;

    location / {
        proxy_pass http://app:8080;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /static {
        access_log   off;
        expires      30d;

        alias /app/target/classes/static;
    }
}

Стандартное хранение кеша в NGINX

Согласно основной документации NGINX использует гибридную стратегию хранения кеша, где задействуется одновременно оперативная память и жесткий диск.

Построение архитектуры в Docker среде

Docker в частности docker-compose помогает с легкостью развернуть приложение с несколькими контейнерами. Так как в примере используется maven контейнер, который предоставляет доступ к исходникам проекта у нас появляется возможность подключить (mount) папки со статическими файлами.

version: '3'
services:
  nginx:
   container_name: some-nginx
   image: nginx:1.13
   restart: always
   ports:
   - 80:80
   - 443:443
   volumes:
   - ./nginx/conf.d:/etc/nginx/conf.d
   - ./app:/app
   depends_on:
   - app

  app:
    restart: always
    build: ./app
    working_dir: /app
    volumes:
      - ./app:/app
    expose:
      - "8080"
    command: mvn clean spring-boot:run

Пример maven контейнера.

FROM maven:3.5-jdk-8

Related posts

Leave a Comment