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

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

  1. deb http://volatile.debian.org/debian-volatile lenny/volatile main  
  2. deb-src http://volatile.debian.org/debian-volatile lenny/volatile main  
  3.   
  4. #lenny  
  5. deb http://ftp.ru.debian.org/debian/ lenny main  
  6. deb-src http://ftp.ru.debian.org/debian/ lenny main  
  7. deb http://security.debian.org/ lenny/updates main  
  8. deb-src http://security.debian.org/ lenny/updates main  
  9.   
  10. #testing  
  11. deb http://ftp.ru.debian.org/debian/ testing main  
  12. deb-src http://ftp.ru.debian.org/debian/ testing main  
  13. deb http://security.debian.org/ testing/updates main  
  14. deb-src http://security.debian.org/ testing/updates main  
  15.   
  16. #unstable  
  17. deb http://ftp.ru.debian.org/debian/ unstable main  
  18. deb-src http://ftp.ru.debian.org/debian/ unstable main  

nano /etc/apt/preferences

  1. Package: *  
  2. Pin: release a=stable  
  3. Pin-Priority: 700  
  4.   
  5. Package: *  
  6. Pin: release a=testing  
  7. Pin-Priority: 650  
  8.   
  9. Package: *  
  10. Pin: release a=unstable  
  11. Pin-Priority: 600  

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

Зависимости

apt-get update

  1. 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

  1. wget garr.dl.sourceforge.net/project/cppcms/cppcms/0.99.5%20-%20beta%205/cppcms-0.99.5.tar.bz2  
  2. tar -jxvf cppcms-0.99.5.tar.bz2  
  3. cd cppcms-0.99.5  
  4.   
  5. svn co http://cppcms.svn.sourceforge.net/svnroot/cppcms/framework/branches/maintance_0_0_x/ cppcms  
  6. cd cppcms  
  7.   
  8. ./autogen.sh (не обращаем внимания на Consider и required)  
  9. ./autogen.sh (не обращаем внимания на Consider)  
  10. ./configure  

Проблемы

checking for fastcgi/fcgiapp.h… no

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

  1. cd  
  2. apt-get -t testing source libfcgi-dev  
  3. ls -la libfcgi-2.4.0/include  
  4. cd cppcms-0.99.5  
  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  
  6.   
  7. nano find_log.txt  

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

  1. #ifdef EN_FASTCGI_LONG_PATH  
  2.     #include <fastcgi/fcgio.h>  
  3.     #include <fastcgi/fcgiapp.h>  
  4. #else  
  5.     #include <fcgio.h>  
  6.     #include <fcgiapp.h>  
  7. #endif  

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

  1. cd cppcms  
  2. make  

X--tag=CXX: command not found

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

  1. export echo=echo  
  2. make  
  3. make install  
  4. export -n echo   
  5. cd  

Dbixx

  1. svn co http://cppcms.svn.sourceforge.net/svnroot/cppcms/dbixx/trunk/ dbixx  
  2. cd dbixx  
  3.   
  4. ./autogen.sh (не обращаем внимания на Consider)  
  5. ./configure   
  6. make  
  7. make install  
  8.   
  9. cd  

Wikipp

  1. svn co http://cppcms.svn.sourceforge.net/svnroot/cppcms/wikipp/trunk wikipp  
  2. cd wikipp  
  3.   
  4. ./autogen.sh (не обращаем внимания на Consider и required)  
  5. ./autogen.sh (не обращаем внимания на Consider)  
  6. ./configure  
  7. make  
  8. make install  

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

  1. mkdir /var/www/  
  2. mkdir /var/www/wikipp  
  3. mkdir /var/www/wikipp/media  
  4. cd templates  
  5. cp -R sh /var/www/wikipp/media/  
  6. cp *.css /var/www/wikipp/media/  
  7. cd /var/www/wikipp/  
  8. wget ru.wikipedia.org/favicon.ico  

Почистим

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

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

  1. chown -R www-data /var/www/wikipp  
  2. cd  

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

  1. cppcms_make_key  

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

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

  1. # WikiPP  
  2. wikipp.script="/wiki"  
  3. wikipp.media="/media"  
  4. wikipp.syntax_highlighter="/media/sh"  
  5. wikipp.disable_registration=0  
  6.   
  7. # CppCMS System Settings  
  8. # Server  
  9. #server.api="scgi"  
  10. server.api="fastcgi"  
  11. server.mod="thread"  
  12. server.threads = 5  
  13. server.buffer = 100  
  14. #server.socket = "/tmp/wikipp.sock"  
  15. #server.socket = "0.0.0.0:8080"  
  16. session.expire = "renew"  
  17. session.timeout = 2592000 # 30 days  
  18. session.location = "client"  
  19. session.cookies_prefix="wikipp"  
  20. session.cookies_key = "сюда вставить полученный ключ от cppcms_make_key"  
  21.   
  22. # Localization  
  23. #locale.dir = "./locale"  
  24. locale.dir = "/usr/local/share/locale"  
  25. locale.lang_list = { "he" "en" "ru" "pl" }  
  26. locale.lang_default = "ru"  
  27. locale.domain_list = { "wikipp" }  
  28.   
  29. # gzip - default disabled  
  30. gzip.enable=1  
  31. gzip.level=1  
  32.   
  33. # Cache  
  34. cache.backend="fork"  
  35. cache.limit=1000  
  36. cache.memsize = 8192  
  37.   
  38. # Templates location  
  39. #templates.dirs = { "./templates/.libs/" }  
  40. templates.dirs = { "/usr/local/lib/wikipp" }  
  41. # templates.ext = ".dll"  
  42. # Uncomment above for cygwin platform  
  43.   
  44. dbixx.driver="mysql"  
  45. #dbixx.driver="sqlite3"  
  46. #dbixx.driver="postgresql"  
  47.   
  48. mysql.dbname="wikipp"  
  49. mysql.username="root"  
  50. mysql.password="придумать пароль для mysql"  
  51.   
  52. #sqlite3.dbname="wikipp.db"  
  53. #sqlite3.sqlite3_dbdir="./db/"  
  54. #postgresql.dbname="cppcms"  
  55. #postgresql.username="artik"  

Mysql

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

Nginx

  1. apt-get -t unstable install nginx-full  
  2. nano /etc/nginx/sites-enabled/default  
  3.   
  4. server {  
  5.     listen 80;  
  6.     root /var/www/wikipp;  
  7.     server_name localhost;  
  8.     #server_name 123.45.67.89;  
  9.   
  10.     location / {  
  11.         autoindex off;  
  12.     }  
  13.   
  14.     location /wiki {  
  15.         autoindex off;  
  16.   
  17.         include fastcgi_params;  
  18.   
  19.         fastcgi_pass unix:/tmp/wikipp.sock;  
  20.   
  21.         fastcgi_split_path_info ^(/wiki)(.*)$;  
  22.   
  23.         fastcgi_param SCRIPT_NAME /var/www/wikipp/wiki;  
  24.         fastcgi_param PATH_INFO $fastcgi_path_info;  
  25.     }  
  26.   
  27.     location /media {  
  28.           access_log        off;  
  29.           expires           30d;  
  30.     }  
  31. }  

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

  1. /etc/init.d/nginx restart  

Spawn-daemon

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

  1.     #!/bin/bash    
  2. RETVAL=0  
  3. BASE="/home/andrew/wikipp"  
  4. function start {  
  5.     if [ ! -f /usr/bin/spawn-fcgi ]  
  6.     then  
  7.         echo "install spawn-fcgi first"  
  8.         exit 1  
  9.     fi  
  10.     if [ ! -f $BASE/wikipp ]  
  11.     then  
  12.         echo "build wikipp first"  
  13.         exit 2  
  14.     fi  
  15.     if [ ! -f $BASE/config.txt ]  
  16.     then  
  17.         echo "config.txt has been lost"  
  18.         exit 3  
  19.     fi  
  20.     if [ -f /var/run/wikipp.pid ]  
  21.     then  
  22.         echo "wikipp has been already started"  
  23.     else  
  24.         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"  
  25.     fi  
  26. }  
  27. function stop {  
  28.     if [ -f /var/run/wikipp.pid ]  
  29.     then  
  30.         eval  "kill -9 `cat /var/run/wikipp.pid`"  
  31.         eval  "rm /var/run/wikipp.pid"  
  32.         echo "stopped"   
  33.     else  
  34.         echo "wikipp has been already stopped";  
  35.     fi  
  36. }  
  37. case "$1" in    
  38.     start)    
  39.         start  
  40.         RETVAL=$?    
  41.     ;;    
  42.     stop)    
  43.         stop  
  44.         RETVAL=$?   
  45.     ;;    
  46.     restart)    
  47.         stop    
  48.         start   
  49.         RETVAL=$?    
  50.     ;;    
  51.     *)    
  52.         echo "Usage: wikipp-spawn-daemon {start|stop|restart}"    
  53.         exit 1    
  54.     ;;    
  55. esac    
  56. exit $RETVAL  

spawn-fcgi

  1. apt-get -t testing install spawn-fcgi  
  2.   
  3. cd /etc/init.d  
  4. chmod +x wikipp-spawn-daemon  
  5. update-rc.d wikipp-spawn-daemon defaults  
  6. /etc/init.d/wikipp-spawn-daemon start  

Получаем pid

  1. ls -la /tmp  

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

Убеждаемся что в процессах сидит один "/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

  1. http://host-name/wikipp/en/page/main  
  2. http://host-name/media/style.css  
  3. http://host-name/media/sh/Scripts/shCore.js  
  4. http://host-name/media/sh/Scripts/shBrushCpp.js  
  5. http://host-name/media/sh/Styles/SyntaxHighlighter.css  
  6. http://host-name/media/style-ltr.css  
  7. http://host-name/media/images/image_0.jpg  
  8. http://host-name/media/images/image_1.jpg  
  9. http://host-name/media/images/image_2.jpg  
  10. http://host-name/favicon.ico  

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

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

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

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

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

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

  1. Availability: 100.00 %  
  2. Elapsed time: 198.46 secs  
  3. Data transferred: 296.01 MB  
  4. Response time: 0.00 secs  
  5. Transaction rate: 35.27 trans/sec  
  6. Throughput: 1.49 MB/sec  
  7. Concurrency: 0.06  
  8. Successful transactions: 7000  
  9. Failed transactions: 0  
  10. Longest transaction: 0.12  
  11. Shortest transaction: 0.00  

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

  1. 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 мб

  1. Availability: 100.00 %  
  2. Elapsed time: 18.50 secs  
  3. Data transferred: 323.62 MB  
  4. Response time: 0.09 secs  
  5. Transaction rate: 411.89 trans/sec  
  6. Throughput: 17.49 MB/sec  
  7. Concurrency: 36.24  
  8. Successful transactions: 7620  
  9. Failed transactions: 0  
  10. Longest transaction: 3.15  
  11. Shortest transaction: 0.00  

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

Fcgi-debug

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

  1. apt-get -t testing install ragel libev-dev libglib2.0-dev cmake  
  2.   
  3. git clone git://stbuehler.de/fcgi-debug.git  
  4. cd fcgi-debug  
  5. cmake -DCMAKE_INSTALL_PREFIX="/usr" -DCMAKE_VERBOSE_MAKEFILE=ON  
  6. make  
  7. make install  
  8. cd  
  9.   
  10. /etc/init.d/wikipp-spawn-daemon stop  

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

  1. /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 сессию и включаем обычный режим работы

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

Проект

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

Размещение

SourceForge.net Logo

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

CppCMS needs You


Навигация

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



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