среда, 26 июня 2013 г.

MapServer+nginx+FastCGI on Ubuntu.

Hi.

Im new with Linux. But try to tell how to start with Mapserver on Ubuntu.


1. Installing

Add UbuntuGis repository:


sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt-get update

Before install MapServer dont forget that its needed in some libraries: curl, gdal,org, agg. Here more inforamtion about this - MapServer Site


Install MapServer, nginx,FastCGI and libgd:


sudo apt-get install libgd2-xpm-dev
sudo apt-get install cgi-mapserver mapserver-bin
sudo apt-get install nginx
sudo apt-get install spawn-fcgi
2. FastCGI config

Create file /etc/init.d/mapserv/ and put into:


#! /bin/sh
#
# description: Mapserver Service Manager
# processname: lt-mapserv
# pidfile: /var/run/mapserv.pid
# Source function library.
#. /etc/init.d/functions
# Check that networking is up.
#. /etc/sysconfig/network
if [ "$NETWORKING" = "no" ]
then
        exit 0
fi
PREFIX=/usr
NAME=mapserv
PID=/var/run/mapserv.pid
DAEMON=$PREFIX/bin/spawn-fcgi
DAEMON_OPTS=" -a 127.0.0.1 -p 9999 -F 4 -u user -U user -P $PID $PREFIX/lib/cgi-bin/mapserv"
start () {
    echo -n $"Starting $NAME "
        exec $DAEMON $DAEMON_OPTS >> /dev/null
        daemon --pidfile $PID
        RETVAL=$?
        echo
    [ $RETVAL -eq 0 ]
}
stop () {
    echo -n $"Stopping $NAME "
        killproc -p $PID
        #make sure all mapservers are closed
        pkill -f lt-mapserv
        RETVAL=$?
        echo
    if [ $RETVAL -eq 0 ] ; then
                rm -f $PID
        fi
}
restart () {
    stop
    start
}
# See how we were called.
case "$1" in
  start)
        start
    ;;
  stop)
        stop
    ;;
  status)
    status lt-mapserv
        RETVAL=$?
        ;;
  restart)
    restart
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart}"
        RETVAL=2
        ;;
esac
exit $RETVAL

Make this file executable:


chmod +x /etc/init.d/mapserv
3. nginx config

Create file /etc/nginx/sites-enabled/your-file-name


server {
    ##another server config
    listen   80;
    server_name  your_server.name www.mapserver.your_server.name;
    #MapServer
        location / {
                fastcgi_pass   127.0.0.1:9999;
                fastcgi_index  mapserv?*;
                fastcgi_param  SCRIPT_FILENAME  /usr/lib/cgi-bin/mapserv$fastcgi_script_name;
                include fastcgi_params;

    }
}

I was make all thing on localhost. So i not create new file, but just add lines with:


        location /map/ {
                fastcgi_pass   127.0.0.1:9999;
                fastcgi_index  mapserv?*;
                fastcgi_param  SCRIPT_FILENAME  /usr/lib/cgi-bin/mapserv$fastcgi_script_name;
                include fastcgi_params;

    }
into /etc/nginx/sites-enabled/default.

Its all with configurations. Now you can start FastCGI script:


service mapserv start 
And start nginx:
/etc/init.d/nginx start

Go to the localhost/map/ and if you do all right you'll see:


No query information to decode. QUERY_STRING is set, but empty.

Its mean that MapServer+nginx work fine.


4. Create map.

Now lets do your first map.For this we need some data. I take Shape files: http://gis-lab.info/other/mapserver-begin-example.zip. Extract it everywhere you want, i do it into /home/my-user/example.


MapServer have no admin panel like Geoserver. For make map you gonna create *.map files. In zip already contain some. We'll use file polt.map:


 
# Аннотированный map-файл (за основу взят файл из учебника 
# http://biometry.gis.umn.edu/tutorial/) 
#
# Все, что идет за символом решетки - комментарий и программой не обрабатывается 
# 
# Map-файлы начинаются с ключевого слова MAP, обозначающего начало 
# "map"-объекта. Закрывает map-объект ключевое слово END в конце файла. Вся 
# карта, которая будет отображаться пользователю описывается внутри.

MAP
  IMAGETYPE      GIF
  EXTENT         34.59 49.58 34.63 49.6
  SIZE           400 300
  SHAPEPATH      "/home/user/example/shp/"
  IMAGECOLOR     255 255 255

#   Внутри MAP-объекта определяются новые объекты - слои (LAYER). 
#   Обязательно нужно определить по крайней мере один слой.
#   Количество слоев ограничено сверху (по умолчанию - не больше 100 слоев), 
#   если нужно большее количество слоев, придется перекомпилировать 
#   MapServer (см. map.h)


  LAYER # Определяем полигональный слой
    NAME         veget
    DATA         Poltava10_Vegetation_region
    STATUS       ON
    TYPE         POLYGON

#     Внутри слоя нужно определить как минимум один класс. Классов может быть
#     несколько, но не больше 10 (иначе опять придется перекомпилировать MapServer) 

    CLASS
      NAME       "Растительность"

#       Внутри класса определяются стили: как именно данный класс отобразить
#       на карте.
      STYLE
        COLOR        232 232 232
        OUTLINECOLOR 32 32 32
      END
    END
  END # Конец определения слоя

END # Конец определения карты

There much comments on russian, but don't worry this files works fine. This map contains only one layer veget There you gonna change only SHAPEPATH parameter if you extract your zip archive in another place.


For see this map add in your address line:


 
http://localhost/map/?map=/home/user/example/polt.map&layer=veget&mode=map

If you see map image:


Its mean all works fine.


Thanks for Yodeski Rodríguez Álvarez for nginx and FasrCGI configuration files. Part with map creating takes from gis-lab.ru

3 комментария:

  1. Макс! Респект!
    Спасибо огромное за материал. Сидел целый день по кускам собирал информацию... И вот увидел твой работающий мануал!

    Маленькое замечание - в ubuntu у меня возникли проблемы с функцией killproc (не очень я в ubuntu пока), заменил на killall - проверил, вроде скрипт поднятия-опускания mapserver-a работает правильно.

    Еще раз спасибо!

    Андрей.

    ОтветитьУдалить
  2. Я на самом деле никогда не стопил скрипт поэтому не могу сказать как работает killproc.

    ОтветитьУдалить