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