Размещение BlueMap на внешних веб-серверах при использовании файлового хранилища
Внутренний веб-сервер BlueMap очень легкий и довольно быстрый, но он может быть перегружен большим количеством одновременных пользователей.
Если вы хотите оптимизировать скорость работы вашего веб-приложения для более широкой аудитории, вы также можете разместить BlueMap напрямую на внешних веб-серверах, таких как NGINX или Apache. Чтобы это сработало, вам необходимо выполнить некоторую настройку.
Цель
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
}
}
Важно: Приведенная выше конфигурация является всего лишь примером, а не полной конфигурацией, которую можно просто скопировать и вставить. Вам ** потребуется ** адаптировать ее к вашим настройкам!