Главная  /  Правка  /  История  /   /  Область пользователей

Расширенная инструкция по установке wikipp

Эта статья типа «быстрый старт». На входе требуются элементарные знания программирования под линукс на c++ и 15 минут свободного времени. На выходе вы получаете готовый, простой, высокопроизводительный wiki сайт, который распространяется автором по лицензии GPL. Прочитав/поковыряв его исходники вы запросто сможете начать писать на c++ для web и помочь автору фреймфорка.

Многие тщательно критикуют любые разработки под web на c++, потому что просто не имеют достаточно опыта, чтобы развернуть сайт на cppcms. Выполняйте следующие команды в указанной последовательности и у вас все получится!

Подымаем боевой стабильный кирпич debian-5.0.7/5.0.6 прямо по default настройкам Если для разработки — лучше на virtualbox 4.0, иначе — сразу на сервере

Заходим под рутом и поехали:

Репозитории

nano /etc/apt/sources.list

  deb http://volatile.debian.org/debian-volatile lenny/volatile main
  deb-src http://volatile.debian.org/debian-volatile lenny/volatile main

  #lenny
  deb http://ftp.ru.debian.org/debian/ lenny main
  deb-src http://ftp.ru.debian.org/debian/ lenny main
  deb http://security.debian.org/ lenny/updates main
  deb-src http://security.debian.org/ lenny/updates main

  #testing
  deb http://ftp.ru.debian.org/debian/ testing main
  deb-src http://ftp.ru.debian.org/debian/ testing main
  deb http://security.debian.org/ testing/updates main
  deb-src http://security.debian.org/ testing/updates main

  #unstable
  deb http://ftp.ru.debian.org/debian/ unstable main
  deb-src http://ftp.ru.debian.org/debian/ unstable main

nano /etc/apt/preferences

  Package: *
  Pin: release a=stable
  Pin-Priority: 700

  Package: *
  Pin: release a=testing
  Pin-Priority: 650

  Package: *
  Pin: release a=unstable
  Pin-Priority: 600

ни в коем случае не переводите всю систему на testing/unstable - проблем не оберетесь!

Зависимости

apt-get update

   apt-get install -t testing checkinstall subversion build-essential make autoconf autotools-dev automake libtool libcurl4-openssl-dev pkg-config libcgicc5-dev libboost-dev libboost-iostreams1.42-dev libboost-signals1.42-dev libasio-dev python libfcgi-dev libmm-dev libgcrypt11-dev libsqlite3-dev gettext libdbd-sqlite3 libdbd-mysql libdbi0-dev libpcre++-dev

Cppcms

  wget garr.dl.sourceforge.net/project/cppcms/cppcms/0.99.5%20-%20beta%205/cppcms-0.99.5.tar.bz2
  tar -jxvf cppcms-0.99.5.tar.bz2
  cd cppcms-0.99.5

  svn co http://cppcms.svn.sourceforge.net/svnroot/cppcms/framework/branches/maintance_0_0_x/ cppcms
  cd cppcms

  ./autogen.sh (не обращаем внимания на Consider и required)
  ./autogen.sh (не обращаем внимания на Consider)
  ./configure

Проблемы

checking for fastcgi/fcgiapp.h… no

А заголовочный fcgiapp.h лежит в /usr/include. Не нужно спешить делать символические ссылки!

  cd
  apt-get -t testing source libfcgi-dev
  ls -la libfcgi-2.4.0/include
  cd cppcms-0.99.5
  egrep -R "fcgiapp\.h|fcgi_config\.h|fcgi_config_x86\.h|fcgi_stdio\.h|fcgiapp\.h|fcgimisc\.h|fcgio\.h|fcgios\.h" * > find_log.txt

  nano find_log.txt

Найдено только в cppcms/fcgi.h и fcgi.h Вот кто во всем виноват:

  #ifdef EN_FASTCGI_LONG_PATH
      #include <fastcgi/fcgio.h>
      #include <fastcgi/fcgiapp.h>
  #else
      #include <fcgio.h>
      #include <fcgiapp.h>
  #endif

Ложная тревога. Собираем!

  cd cppcms
  make

X--tag=CXX: command not found

Дело в том что libtool пытается ВЫПОЛНИТЬ параметры которые начинаются с X. Надо бы эту «фичу» временно отключить!

  export echo=echo
  make
  make install
  export -n echo 
  cd

Dbixx

  svn co http://cppcms.svn.sourceforge.net/svnroot/cppcms/dbixx/trunk/ dbixx
  cd dbixx

  ./autogen.sh (не обращаем внимания на Consider)
  ./configure 
  make
  make install

  cd

Wikipp

  svn co http://cppcms.svn.sourceforge.net/svnroot/cppcms/wikipp/trunk wikipp
  cd wikipp

  ./autogen.sh (не обращаем внимания на Consider и required)
  ./autogen.sh (не обращаем внимания на Consider)
  ./configure
  make
  make install

Зальем какой-никакой дизайн и syntax highlighter

  mkdir /var/www/
  mkdir /var/www/wikipp
  mkdir /var/www/wikipp/media
  cd templates
  cp -R sh /var/www/wikipp/media/
  cp *.css /var/www/wikipp/media/
  cd /var/www/wikipp/
  wget ru.wikipedia.org/favicon.ico

Почистим

  cd /var/www/wikipp/media/
  rm -rf `find . -name *.svn`

Дадим все права для www-data

  chown -R www-data /var/www/wikipp
  cd

Конфигурация

  cppcms_make_key

Скопируйте то что он скажет

nano /usr/local/etc/wikipp/config.txt

  # WikiPP
  wikipp.script="/wiki"
  wikipp.media="/media"
  wikipp.syntax_highlighter="/media/sh"
  wikipp.disable_registration=0

  # CppCMS System Settings
  # Server
  #server.api="scgi"
  server.api="fastcgi"
  server.mod="thread"
  server.threads = 5
  server.buffer = 100
  #server.socket = "/tmp/wikipp.sock"
  #server.socket = "0.0.0.0:8080"
  session.expire = "renew"
  session.timeout = 2592000 # 30 days
  session.location = "client"
  session.cookies_prefix="wikipp"
  session.cookies_key = "сюда вставить полученный ключ от cppcms_make_key"

  # Localization
  #locale.dir = "./locale"
  locale.dir = "/usr/local/share/locale"
  locale.lang_list = { "he" "en" "ru" "pl" }
  locale.lang_default = "ru"
  locale.domain_list = { "wikipp" }

  # gzip - default disabled
  gzip.enable=1
  gzip.level=1

  # Cache
  cache.backend="fork"
  cache.limit=1000
  cache.memsize = 8192

  # Templates location
  #templates.dirs = { "./templates/.libs/" }
  templates.dirs = { "/usr/local/lib/wikipp" }
  # templates.ext = ".dll"
  # Uncomment above for cygwin platform

  dbixx.driver="mysql"
  #dbixx.driver="sqlite3"
  #dbixx.driver="postgresql"

  mysql.dbname="wikipp"
  mysql.username="root"
  mysql.password="придумать пароль для mysql"

  #sqlite3.dbname="wikipp.db"
  #sqlite3.sqlite3_dbdir="./db/"
  #postgresql.dbname="cppcms"
  #postgresql.username="artik"

Mysql

  apt-get -t testing install mysql-server
  mysql -u root -p -e "create database wikipp"
  mysql -u root -p wikipp </usr/local/share/wikipp/mysql.sql

Nginx

  apt-get -t unstable install nginx-full
  nano /etc/nginx/sites-enabled/default

  server {
      listen 80;
      root /var/www/wikipp;
      server_name localhost;
      #server_name 123.45.67.89;

      location / {
          autoindex off;
      }

      location /wiki {
          autoindex off;

          include fastcgi_params;

          fastcgi_pass unix:/tmp/wikipp.sock;

          fastcgi_split_path_info ^(/wiki)(.*)$;

          fastcgi_param SCRIPT_NAME /var/www/wikipp/wiki;
          fastcgi_param PATH_INFO $fastcgi_path_info;
      }

      location /media {
            access_log        off;
            expires           30d;
      }
  }

Все разъяснения в статье игоря сысоева особое внимание «syntax: fastcgi_split_path_info regex»

  /etc/init.d/nginx restart

Spawn-daemon

nano /etc/init.d/wikipp-spawn-daemon

    #!/bin/bash  
RETVAL=0
BASE="/home/andrew/wikipp"
function start {
    if [ ! -f /usr/bin/spawn-fcgi ]
    then
        echo "install spawn-fcgi first"
        exit 1
    fi
    if [ ! -f $BASE/wikipp ]
    then
        echo "build wikipp first"
        exit 2
    fi
    if [ ! -f $BASE/config.txt ]
    then
        echo "config.txt has been lost"
        exit 3
    fi
    if [ -f /var/run/wikipp.pid ]
    then
        echo "wikipp has been already started"
    else
        eval "/usr/bin/spawn-fcgi -P /var/run/wikipp.pid -u www-data -g www-data -s /tmp/wikipp.sock -- $BASE/wikipp -c $BASE/config.txt"
    fi
}
function stop {
    if [ -f /var/run/wikipp.pid ]
    then
        eval  "kill -9 `cat /var/run/wikipp.pid`"
        eval  "rm /var/run/wikipp.pid"
        echo "stopped" 
    else
        echo "wikipp has been already stopped";
    fi
}
case "$1" in  
    start)  
        start
        RETVAL=$?  
    ;;  
    stop)  
        stop
        RETVAL=$? 
    ;;  
    restart)  
        stop  
        start 
        RETVAL=$?  
    ;;  
    *)  
        echo "Usage: wikipp-spawn-daemon {start|stop|restart}"  
        exit 1  
    ;;  
esac  
exit $RETVAL

spawn-fcgi

  apt-get -t testing install spawn-fcgi

  cd /etc/init.d
  chmod +x wikipp-spawn-daemon
  update-rc.d wikipp-spawn-daemon defaults
  /etc/init.d/wikipp-spawn-daemon start

Получаем pid

  ls -la /tmp

Убеждаемся что сокет /tmp/wikipp.sock создался от юзера www-data

  ps ax

Убеждаемся что в процессах сидит один "/usr/local/sbin/wikipp -c /usr/local/etc/wikipp/config.txt" и его pid совпадает с вышеполученным

Все! для обычных людей дело сделано. Заходим на http://server_name/wiki

Тестирование

Добавьте какую нибудь статью Для удобства можете поднять ftp и заливать картинки в media/images

Откройте сайт в опере/мозилле и соберите все сетевые запросы с некоторой страницы из dragonfly/firebug в один файл: nano siege-urls.txt

  http://host-name/wikipp/en/page/main
  http://host-name/media/style.css
  http://host-name/media/sh/Scripts/shCore.js
  http://host-name/media/sh/Scripts/shBrushCpp.js
  http://host-name/media/sh/Styles/SyntaxHighlighter.css
  http://host-name/media/style-ltr.css
  http://host-name/media/images/image_0.jpg
  http://host-name/media/images/image_1.jpg
  http://host-name/media/images/image_2.jpg
  http://host-name/favicon.ico

Мне повезло. Атакующий vps был в одном датацентре что и атакуемый. Погрешности мизерные!

1) 350 пользователей каждый обращается по 20 раз с перерывом в 15 секунд

  siege -f siege-urls.txt -i -d15 -r20 -c350

атакуемый потреблял:

Проц (одно ядро хеон 5220): до теста 0.17% во время теста 1.0% — 4.3%. среднее 3.3%

Оперативка: до теста 44.65 мб во время теста 45 — 48 мб. среднее 46.8 мб

  Availability: 100.00 %
  Elapsed time: 198.46 secs
  Data transferred: 296.01 MB
  Response time: 0.00 secs
  Transaction rate: 35.27 trans/sec
  Throughput: 1.49 MB/sec
  Concurrency: 0.06
  Successful transactions: 7000
  Failed transactions: 0
  Longest transaction: 0.12
  Shortest transaction: 0.00

2) Попытаемся набрать побольше Transaction rate и Throughput:

  siege -f siege-urls.txt -i -d0 -r20 -c381

Больше 381 юзеров не могу. (оперативки на атакующем 256 мб)

Проц: до теста 0.17% во время теста 5.0% — 23.3%. но среднее 8.33%

Оперативка: до теста 44.65 мб во время теста 45 — 51.6 мб. среднее 50 мб

  Availability: 100.00 %
  Elapsed time: 18.50 secs
  Data transferred: 323.62 MB
  Response time: 0.09 secs
  Transaction rate: 411.89 trans/sec
  Throughput: 17.49 MB/sec
  Concurrency: 36.24
  Successful transactions: 7620
  Failed transactions: 0
  Longest transaction: 3.15
  Shortest transaction: 0.00

Утечек нет. после теста — 44.65 мб

Fcgi-debug

Если вы хотите прилепить на фронтенд нечто отличное от nginx и у вас ничего не получается — вот вам лом против которого нет приема

  apt-get -t testing install ragel libev-dev libglib2.0-dev cmake

  git clone git://stbuehler.de/fcgi-debug.git
  cd fcgi-debug
  cmake -DCMAKE_INSTALL_PREFIX="/usr" -DCMAKE_VERBOSE_MAKEFILE=ON
  make
  make install
  cd

  /etc/init.d/wikipp-spawn-daemon stop

открываем отдельную ssh сессию и запускаем

  /usr/bin/spawn-fcgi -u www-data -g www-data -s /tmp/wikipp.sock -n -- /usr/bin/fcgi-debug /usr/local/sbin/wikipp -c /usr/local/etc/wikipp/config.txt

Обращаем внимание что не указыван pid и добавлен -n (no fork mode)

В браузере заходим на http://server_name/wiki. В консоли вылезут полностью все параметры fastcgi протокола использованные в запросе/ответе

ctrl+c закрываем ssh сессию и включаем обычный режим работы

  /etc/init.d/wikipp-spawn-daemon start

Проект

CppCMS является основой веб-разработки для выполнения ресурсоемких приложений.

Размещение

SourceForge.net Logo

Поддержать проект

CppCMS needs You


Навигация

Главная страница



Валидация CSS | Валидация XHTML 1.0