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