Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Размещение BlueMap на внешних веб-серверах при использовании файлового хранилища

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

Если вы хотите оптимизировать скорость работы вашего веб-приложения для более широкой аудитории, вы также можете разместить BlueMap напрямую на внешних веб-серверах, таких как NGINX или Apache. Чтобы это сработало, вам необходимо выполнить некоторую настройку.

  1. Цель
  2. NGINX
  3. Apache2
    1. Модули Apache2
    2. Настройка Apache2
  4. Настройка Caddy

Цель

BlueMap отображает и сохраняет карту в виде множества небольших фрагментов, называемых плитками. Эти плитки сохраняются в отдельных файлах в виде древовидной структуры папок здесь: <webroot>/maps/<map-id>/tiles/. Данные с низким разрешением сохраняются в файлах PNG, которые можно использовать в обычном режиме. Данные с высоким разрешением сохраняются в файлах GZip-сжатых PRBM (модифицированных PRWM). Проблема сейчас в том, что веб-приложение (браузер) запрашивает несжатые файлы .prbm, но обычный веб-сервер находит только сжатые .prbm.gz единицы.

Например: веб-приложение запрашивает плитку: /maps/world/tiles/0/x9/z-8.prbm. Если ваш веб- сервер сейчас ищет этот файл, он его не найдет, потому что на самом деле ему нужен вот этот файл: /maps/world/tiles/0/x9/z-8.prbm.gz! И вдобавок ко всему он сжат.

Рядом с фрагментами карт могут быть другие файлы карт, доступные только в сжатом виде. Например, <webroot>/maps/<map-id>/textures.json.gz.

Итак, нам нужно сделать две вещи:

  • Перенаправить запрос на вариант файла .gz, если таковой доступен
  • Сообщить браузеру, что отправляемый файл на самом деле сжат в формате GZip, и браузер должен распаковать его, прежде чем передавать веб-приложению. (Мы можем сделать это с помощью http-заголовка Кодировка содержимого: gzip)

Необязательно:

  • Если какой-либо фрагмент карты не существует, вместо того, чтобы возвращать значение 404 и показывать ошибки в консоли браузера, мы возвращаем значение 204 (без содержимого).
  • Если вы используете плагин/мод, на вашей карте обычно отображаются маркеры игроков, обновляемые в режиме реального времени. Для работы с внешним веб-сервером вам также потребуется выполнить обратную проксировку всех запросов к /maps/*/live/* на встроенный веб-сервер.

NGINX

В NGINX на самом деле только одна строка конфигурации выполняет обе функции (поиск gz-файлов и установка заголовка): gzip_static always;

Таким образом, в определенном контексте конфигурация вашего веб-сайта может выглядеть следующим образом:

server {
  listen 80;
  server_name yourdomain.com;
  
  # путь к bluemap-webroot, BlueMap также можно использовать во вложенной папке .. просто измените пути соответствующим образом
  root /var/www;
  
  location /maps/ {
    # найдите gz-файлы и установите заголовок "Content-Encoding: gzip"
    gzip_static always;

    # преобразуйте 404 в 204 для фрагментов
    location ~* ^/maps/[^/]*/tiles/ {
      error_page 404 = @empty;
    }
  }
  
  location @empty {
    return 204;
  }

  # НЕОБЯЗАТЕЛЬНО:
  # Прокси-сервер запрашивает оперативные данные на интегрированном веб-сервере bluemaps.
  # Если у вас несколько серверов, вам нужно будет проксировать каждый идентификатор карты на соответствующий сервер.
  location ~* ^/maps/[^/]*/live/ {
    proxy_pass http://127.0.0.1:8100;
  }
}

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

Apache2

Модули Apache2

Для этого необходимо включить модули HEADERS, REWRITE и все ПРОКСИ (PROXY и PROXY_HTTP) для Apache.
(Вы можете проверить свои включенные модули с помощью apache2ctl -M и проверить, включены ли модули. Не забудьте перезапустить apache2 после установки любого отсутствующего модуля с помощью a2enmod MODULENAME)

Настройка Apache2

DocumentRoot /var/www/
<Directory /var/www/>
  allow from all
  Options FollowSymLinks
  Require all granted
  SetEnv no-gzip

  RewriteEngine on

  # if a .gz file exists rewrite to that 
  RewriteCond %{REQUEST_FILENAME}.gz -s
  RewriteRule ^(.+) $1.gz

  # add a content-encoding header to tell the browser to decompress
  <FilesMatch .gz$>
    Header set Content-Encoding gzip
  </FilesMatch>
  
  # if a map-tile doesnt exist, send a 204
  RewriteCond %{REQUEST_URI} "^/maps/[^/]*/tiles/"
  RewriteCond %{REQUEST_FILENAME} !-s
  RewriteCond %{REQUEST_FILENAME} !-l
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^.*$ - [R=204,L]
</Directory>

# OPTIONAL:
# Proxy requests for live data to the bluemaps integrated webserver.
# If you have multiple servers you will need to proxy each map-id to the correct server.
ProxyPreserveHost On
ProxyPassMatch ^/(maps/[^/]*/live/.*) http://127.0.0.1:8100/$1

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

Настройка Caddy

yourdomain.com {
  # path to bluemap-webroot, BlueMap can also be used in a sub-folder .. just adapt the paths accordingly
  root * /var/www
  file_server

  # Match the textures.json file & .prbm files
  @gz path /maps/*/textures.json *.prbm
  # Find .gz files (if not found respond with 204) for the above matcher, and set the "Content-Encoding gzip" header
  handle @gz {
    try_files {path}.gz =204
    header Content-Encoding gzip
  }

  # Respond with 204 for non-existant map-tiles
  @204 path */tiles/*
  handle @204 {
    try_files {path} =204
  }

  # OPTIONAL:
  # Proxy requests for live data to the bluemaps integrated webserver.
  # If you have multiple servers you will need to proxy each map-id to the correct server.
  handle /maps/*/live/* {
    reverse_proxy 127.0.0.1:8100
  }
}

Важно: Приведенная выше конфигурация является всего лишь примером, а не полной конфигурацией, которую можно просто скопировать и вставить. Вам ** потребуется ** адаптировать ее к вашим настройкам!