Принцип распределения нагрузки с помощью 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