Эта статья типа «быстрый старт». На входе требуются элементарные знания программирования под линукс на c++ и 15 минут свободного времени. На выходе вы получаете готовый, простой, высокопроизводительный wiki сайт, который распространяется автором по лицензии GPL. Прочитав/поковыряв его исходники вы запросто сможете начать писать на c++ для web и помоч автору фреймфорка. |
Эта статья типа «быстрый старт». На входе требуются элементарные знания программирования под линукс на c++ и 15 минут свободного времени. На выходе вы получаете готовый, простой, высокопроизводительный wiki сайт, который распространяется автором по лицензии GPL. Прочитав/поковыряв его исходники вы запросто сможете начать писать на c++ для web и помочь автору фреймфорка. |
|
- [Оглавление](#) |
- [Репозитории](#repos) |
- [Зависимости](#deps) |
- [Cppcms](#cppcms) |
- [Проблемы](#problems) |
- [Dbixx](#dbixx) |
- [Wikipp](#wikipp) |
- [Конфигурация](#conf) |
- [Mysql](#mysql) |
- [Nginx](#nginx) |
- [Spawn-daemon](#spawn) |
- [Тестирование](#test) |
- [Fcgi-debug](#fcgi-debug) |
|
Многие тщательно критикуют любые разработки под web на c++, потому что просто не имеют достаточно опыта, чтобы развернуть сайт на cppcms. Выполняйте следующие команды в указанной последовательности и у вас все получится! |
|
|
Подымаем боевой стабильный кирпич debian-5.0.7/5.0.6 прямо по default настройкам |
Если для разработки — лучше на virtualbox 4.0, иначе — сразу на сервере |
|
Заходим под рутом и поехали: |
|
## <span id="repos"></span>Репозитории |
|
nano /etc/apt/sources.list |
|
deb volatile.debian.org/debian-volatile lenny/volatile main |
deb-src volatile.debian.org/debian-volatile lenny/volatile main |
|
#lenny |
deb ftp.ru.debian.org/debian/ lenny main |
deb-src ftp.ru.debian.org/debian/ lenny main |
deb security.debian.org/ lenny/updates main |
deb-src security.debian.org/ lenny/updates main |
|
#testing |
deb ftp.ru.debian.org/debian/ testing main |
deb-src ftp.ru.debian.org/debian/ testing main |
deb security.debian.org/ testing/updates main |
deb-src security.debian.org/ testing/updates main |
|
#unstable |
deb ftp.ru.debian.org/debian/ unstable main |
deb-src 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 - проблем не оберетесь! |
|
## <span id="deps"></span>Зависимости |
|
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 |
|
## <span id="cppcms"></span>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 |
|
## <span id="problems"></span>Проблемы |
|
### 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 |
|
## <span id="dbixx"></span>Dbixx |
|
svn co http://cppcms.svn.sourceforge.net/svnroot/cppcms/dbixx/trunk/ dbixx |
cd dbixx |
|
./autogen.sh (не обращаем внимания на Consider) |
./configure |
make |
make install |
|
cd |
|
## <span id="wikipp"></span>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 |
|
## <span id="conf"></span>Конфигурация |
|
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" |
|
## <span id="mysql"></span>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 |
|
## <span id="nginx"></span>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; |
} |
} |
|
Все разъяснения в [статье игоря сысоева](http://sysoev.ru/nginx/docs/http/ngx_http_fastcgi_module.html) особое внимание «syntax: fastcgi_split_path_info regex» |
|
/etc/init.d/nginx restart |
|
## <span id="spawn"></span>Spawn-daemon |
|
nano /etc/init.d/wikipp-spawn-daemon |
|
#!/bin/bash |
START="/usr/bin/spawn-fcgi -P /var/log/nginx/wikipp.pid -u www-data -g www-data -s /tmp/wikipp.sock -- /usr/local/sbin/wikipp -c /usr/local/etc/wikipp/config.txt" |
STOP="killall -9 /usr/local/sbin/wikipp" |
RETVAL=0 |
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](http://server_name/wiki) |
|
## <span id="test"></span>Тестирование |
|
Добавьте какую нибудь статью |
Для удобства можете поднять ftp и заливать картинки в media/images |
|
Откройте сайт в опере/мозилле и соберите все сетевые запросы с некоторой страницы из dragonfly/firebug в один файл: |
nano siege-urls.txt |
|
http://art-blog.no-ip.info/wikipp/en/page/main |
http://art-blog.no-ip.info/media/style.css |
http://art-blog.no-ip.info/media/sh/Scripts/shCore.js |
http://art-blog.no-ip.info/media/sh/Scripts/shBrushCpp.js |
http://art-blog.no-ip.info/media/sh/Styles/SyntaxHighlighter.css |
http://art-blog.no-ip.info/media/style-ltr.css |
http://art-blog.no-ip.info/media/images/image_0.jpg |
http://art-blog.no-ip.info/media/images/image_1.jpg |
http://art-blog.no-ip.info/media/images/image_2.jpg |
http://art-blog.no-ip.info/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 мб |
|
## <span id="fcgi-debug"></span>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 |
|