Расширенная инструкция по установке 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