Настройка тайлового сервера TileStache

Ещё один тайловый сервер, который я нашёл в дистрибутиве Debian - это TileStache. Он, как и TileLite, тоже написан на Python. Это ещё один комбайн "всё в одном": он поддерживает отрисовку тайлов с помощью Mapnik, кэширование тайлов, в том числе сторонних, и содержит встроенный веб-сервер (по сути он им и является). В отличие от TileLite, этот тайловый сервер может обслуживать несколько слоёв сразу, в том числе, может брать тайлы слоя из стороннего тайлового сервера.

1. Настройка в режиме самостоятельного веб-сервера

Итак, ставим его:

# apt-get install tilestache

Создаём сценарий инициализации /etc/init.d/tilestache:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          tilestache
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts TileStache server
# Description:       starts TileStache server using start-stop-daemon
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin
NAME=tilestache
PID=/var/run/tilestache.pid
DAEMON=/usr/bin/tilestache-server
DAEMON_OPTS="--config /etc/tilestache.cfg -p 8000"

test -x $DAEMON || exit 0

set -e

case "$1" in
  start)
        echo "Starting $NAME: "
        start-stop-daemon --start --make-pidfile --background --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS
        echo "done."
        ;;
  stop)
        echo "Stopping $NAME: "
        start-stop-daemon --stop --pidfile $PID --retry 5
        rm -f $PID
        echo "done."
        ;;
  restart)
        echo "Stopping $NAME: "
        start-stop-daemon --stop --pidfile $PID --retry 5
        rm -f $PID
        echo "done..."
        sleep 1
        echo "Starting $NAME: "
        start-stop-daemon --start --make-pidfile --background --pidfile $PID --exec $DAEMON -- $DAEMON_OPTS
        echo "done."
        ;;
  *)
        echo "Usage: /etc/init.d/$NAME {start|stop|restart}" >&2
        exit 1
        ;;
esac

exit 0

И прописываем в автозапуск:

# update-rc.d tilestache defaults

Копируем пример настройки сервера из файла /usr/share/doc/tilestache/examples/tilestache.cfg в файл /etc/tilestache.cfg и правим его до следующего вида:

{
  "cache":
  {
    "name": "Disk",
    "path": "/var/lib/tilestache",
    "umask": "0000"
  },
  "layers": 
  {
    "osm":
    {
        "provider": {"name": "mapnik", "mapfile": "/etc/mapnik-osm-data/osm.xml"},
        "projection": "spherical mercator"
    } 
  }
}

Создаём каталог для кэша тайлов:

# mkdir /var/lib/tilestache

Осталось запустить TileStache:

# /etc/init.d/tilestache start

2. Настройка Lighttpd для проксирования запросов к TileStache

Включаем модуль proxy веб-сервера Lighttpd:

# lighty-enable-mod proxy

Настраиваем модуль на проксирование каталога /osm в файле конфигурации модуля proxy /etc/lighttpd/conf-enabled/10-proxy.conf:

server.modules   += ( "mod_proxy" )
proxy.server = (
  "/osm" =>
  (
    (
      "host" => "127.0.0.1",
      "port" => 8000
    )
  )
)

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

Теперь ерезапустим Lighttpd:

# /etc/init.d/lighttpd restart

3. Настройка в режиме FastCGI для работы с Lighttpd

Теперь повторим уже опробованную ранее на TileLite методику запуска тайлового сервера в режиме FastCGI.

Создадим каталог для настроек TileStache, перенесём в него наш конфиг и поставим flup:

# mkdir /etc/tilestache
# mv /etc/tilestache.cfg /etc/tilestache
# apt-get install python-flup

В качестве образца для FastCGI-сервера возьмём файл /usr/bin/tilestache-server, скопировав его в каталог /etc/tilestache под именем tilestache.py:

# cp /usr/bin/tilestache-server /etc/tilestache/tilestache.py

Отредактируем его до следующего состояния:

#!/usr/bin/python

if __name__ == '__main__':
    from flup.server.fcgi import WSGIServer
    import TileStache

    application = TileStache.WSGITileServer(config='/etc/tilestache/tilestache.cfg', autoreload=True)
    WSGIServer(application).run()

Дадим права на выполнение:

# chmod +x /etc/tilestache/tilestache.py

И приступим к настройке модуля FastCGI в Lighttpd. Включим его:

# lighty-enable-mod fastcgi

И настроим следующим образом:

$HTTP["url"] =~ "^/osm/" {
  fastcgi.server +=
  (
    "" => 
    (
      (
        "bin-path" => "/etc/tilestache/tilestache.py",
        "socket" => "/tmp/tilestache.socket",
        "max-procs" => 1,
        "check-local" => "disable",
      )
    )
  )
}

В отличие от TileLite, этот сервер может обслуживать несколько слоёв одновременно, поэтому имя слоя нужно передавать в ссылке на запрашиваемый тайл. Поэтому настройка столь необычна. Она передаёт на обслуживание FastCGI-процессу корень веб-сервера лишь в том случае, если запрошена страница, адрес которой начинается с /osm/, то есть - имени слоя. Если нужно настроить несколько слоёв, потребуется доработать регулярное выражение таким образом, чтобы оно совпадало с именем каждого из слоёв.

Поскольку теперь TileStache будет запускаться Lighttpd, настроим права на доступ к каталогу /var/lib/tilestache:

# chmod www-data:www-data /var/lib/tilestache

Теперь остановим и отключим настроенный ранее TileStache, отключим модуль proxy и перезапустим веб-сервер:

# /etc/init.d/tilestache stop
# update-rc.d tilestache disable
# lighty-disable-mod proxy
# /etc/init.d/lighttpd restart

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

Количество, увы, не перешло в качество. Интересно, пользуются ли авторы своими творениями? Пользуются ли мэйнтейнеры из Debian GIS Project поддерживаемыми ими пакетами? Судя по отсутствию сценариев инициализации - нет. А если и пользуются, то скорее всего совместно с Apache и mod_wsgi. Но в таком случае я их не понимаю - раз уж от Apache никуда не деться, почему бы не воспользоваться mod_tile?

Написать автору