FastNetMon

Показаны сообщения с ярлыком Apache2. Показать все сообщения
Показаны сообщения с ярлыком Apache2. Показать все сообщения

пятница, 12 ноября 2010 г.

Apache MPM Prefork vs ITK

Вот тесты: http://blog.penumbra.be/2010/05/hosting-attack-mitigation-p1/

Раза в полтора ITK тормознее. Надо бы свои тесты провести.

А вот еще интересные тесты: http://workingdirectory.net/posts/2010/benchmarking-php/

среда, 10 ноября 2010 г.

Установка mod_vhost_limit на Debian 5 Lenny для лимитирования числа рабочих процессов для 1 виртуального хоста

Я ранее уже писал про эту штуку: http://phpsuxx.blogspot.com/2010/09/apache-modvhostlimit-worker-vhost.html

Итак, заранее предположим, что у нас есть настроенный префорк Апач.

Собираем:
cd /usr/src
wget http://fastvps.googlecode.com/svn/trunk/packages/mod_vhost_limit/mod_vhost_limit-0.2.tgz
tar -xf mod_vhost_limit-0.2.tgz
cd mod_vhost_limit-0.2
apt-get install -y apache2-prefork-dev

После этого нужно файлик compile.sh заменить на следующий (в исходном все пути забиты под CentOS):
libtool --silent --mode=compile gcc -g -O2 -pthread -DLINUX=2 \
-D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -D_SVID_SOURCE \
-I/usr/include/apache2 \
-I/usr/include/apr-1.0 \
-prefer-pic -c mod_vhost_limit.c && touch mod_vhost_limit.slo

libtool --silent --mode=link gcc -g -O2 -pthread -DLINUX=2 \
-D_REENTRANT -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -D_SVID_SOURCE \
-D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER \
-I/usr/include/apache2 \
-I/usr/include/apr-1.0 \
-export-dynamic -o mod_vhost_limit.la -rpath /usr/lib/apache2/modules \
-module -avoid-version mod_vhost_limit.lo


rm -rf *.a *.la *.lo *.slo *.o
mv .libs/*.so .
rm -rf .libs

Итак, теперь компилируем:
./compile.sh

В результате этих манипуляций у нас должен получить вот такой вот бинарик:
ls -al mod_vhost_limit.so
-rwxr-xr-x 1 root root 30K 2010-11-10 06:16 mod_vhost_limit.so

Создаем папку для модуля:
mkdir /opt/mod_vhost_limit
mv mod_vhost_limit.so /opt/mod_vhost_limit

Далее конфигурируем Апача:
echo "LoadModule vhost_limit_module /opt/mod_vhost_limit/mod_vhost_limit.so" > /etc/apache2/mods-enabled/vhost_limit.load
echo "MaxVhostClients 10" > /etc/apache2/mods-enabled/vhost_limit.conf

Тестируем конфиг:
apache2ctl -t
Syntax OK

Убеждаемся, что модуль загрузился:
apache2ctl -M 2>&1 | grep vhost_limit
vhost_limit_module (shared)

Перезапускаем Апача для применения изменений:
/etc/init.d/apache2 restart

Тесты

Для начала откроем лог для просмотра диагностических сообщений от модуля:
tail -f /var/log/apache2/error.log

Теперь пробуем бомбануть какой-нибудь сайт 10 потоками, чтобы создать 10 воркеров.

ab -c 10 -n 1000 http://test.ru/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking test.ru (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: nginx/0.6.32
Server Hostname: test.ru
Server Port: 80

Document Path: /
Document Length: 358 bytes

Concurrency Level: 10
Time taken for tests: 2.005 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1000
Total transferred: 694000 bytes
HTML transferred: 358000 bytes
Requests per second: 498.73 [#/sec] (mean)
Time per request: 20.051 [ms] (mean)
Time per request: 2.005 [ms] (mean, across all concurrent requests)
Transfer rate: 338.01 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 2 10 89.3 3 2004
Waiting: 2 10 89.3 3 2004
Total: 3 10 89.3 4 2005

Percentage of the requests served within a certain time (ms)
50% 4
66% 4
75% 4
80% 4
90% 5
95% 5
98% 6
99% 7
100% 2005 (longest request)

То есть, получаем идеальные цифры (логи при этом идеально пусты):
Complete requests: 1000

Увеличиваем до 11 потоков и тут начинается работа модуля:
ab -c 11 -n 1000 http://test.ru/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking test.ru (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software: nginx/0.6.32
Server Hostname: test.ru
Server Port: 80

Document Path: /
Document Length: 323 bytes

Concurrency Level: 11
Time taken for tests: 2.004 seconds
Complete requests: 1000
Failed requests: 657
(Connect: 0, Receive: 0, Length: 657, Exceptions: 0)
Write errors: 0
Non-2xx responses: 1000
Total transferred: 640542 bytes
HTML transferred: 346176 bytes
Requests per second: 499.01 [#/sec] (mean)
Time per request: 22.044 [ms] (mean)
Time per request: 2.004 [ms] (mean, across all concurrent requests)
Transfer rate: 312.15 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 1 12 113.7 3 2003
Waiting: 1 12 113.7 3 2003
Total: 1 13 113.7 4 2004

Percentage of the requests served within a certain time (ms)
50% 4
66% 5
75% 5
80% 5
90% 6
95% 6
98% 7
99% 8
100% 2004 (longest request)


Итого, пошел серьезный отбой запросов:
Complete requests: 1000
Failed requests: 657

Также в логе ошибок появились следующие записи:
[Wed Nov 10 06:31:16 2010] [warn] Vhost Limit : Access to test.ru deferred, Max Clients 10 exceeded (11 currently)
[Wed Nov 10 06:31:16 2010] [warn] Vhost Limit : Access to test.ru deferred, Max Clients 10 exceeded (11 currently)
[Wed Nov 10 06:31:16 2010] [warn] Vhost Limit : Access to test.ru deferred, Max Clients 10 exceeded (11 currently)
[Wed Nov 10 06:31:16 2010] [warn] Vhost Limit : Access to test.ru deferred, Max Clients 10 exceeded (11 currently)
[Wed Nov 10 06:31:16 2010] [warn] Vhost Limit : Access to test.ru deferred, Max Clients 10 exceeded (11 currently)
[Wed Nov 10 06:31:16 2010] [warn] Vhost Limit : Access to test.ru deferred, Max Clients 10 exceeded (11 currently)

Ура, ура :)

Далее увеличил лимит воркеров до сотни и прогнал нагрузочный тест в виде:
ab -c 100 -n 10000 http://test.ru/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking test.ru (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software: nginx/0.6.32
Server Hostname: test.ru
Server Port: 80

Document Path: /
Document Length: 358 bytes

Concurrency Level: 100
Time taken for tests: 51.825 seconds
Complete requests: 10000
Failed requests: 19
(Connect: 0, Receive: 0, Length: 19, Exceptions: 0)
Write errors: 0
Non-2xx responses: 10000
Total transferred: 6940950 bytes
HTML transferred: 3583439 bytes
Requests per second: 192.96 [#/sec] (mean)
Time per request: 518.251 [ms] (mean)
Time per request: 5.183 [ms] (mean, across all concurrent requests)
Transfer rate: 130.79 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 2
Processing: 2 468 3396.0 4 50099
Waiting: 2 468 3396.0 4 50099
Total: 2 468 3396.0 4 50100

Percentage of the requests served within a certain time (ms)
50% 4
66% 4
75% 5
80% 7
90% 68
95% 106
98% 6081
99% 16013
100% 50100 (longest request)


Так что вполне production ready решение.

Также еше фишка в том, что Апача выбрасывает 503 ошибку (это пример лога уже при проксировании nginx):
xx.xx.xx.xx - - [10/Nov/2010:06:47:34 +0300] "GET / HTTP/1.0" 503 323 "-" "ApacheBench/2.3"

Пруф из кода:
206 return HTTP_SERVICE_UNAVAILABLE;

В процессе работы в продакшене крайне рекомендую контролировать, на какие сайты реагирует модуль:
cat /var/log/apache2/error.log | grep 'Vhost Limit'

А вот так топ террористов устроить:
cat /var/log/apache2/error.log | grep 'Vhost Limit' | awk '{print $12}' | sort | uniq -c | sort -g

Результаты нагрузочного тестирования в продакшене

Модуль к использованию НЕ РЕКОМЕНДУЕТСЯ, так как при высокой частоте форков он не справляется и не выдерживает заданный лимит, в результате при выставленном лимите в 30 форков их плодится до сотни и более.
cat /var/log/apache2/error.log | grep deferred | awk '{print $18 " " $0}' | sed 's/(//' | sort -g | tail -n30
86 [Tue Nov 16 00:09:39 2010] [warn] Vhost Limit : Access to xxx.ru deferred, Max Clients 30 exceeded (86 currently)
87 [Sun Nov 14 18:23:44 2010] [warn] Vhost Limit : Access to xxx.ru deferred, Max Clients 30 exceeded (87 currently)
87 [Tue Nov 16 00:09:43 2010] [warn] Vhost Limit : Access to yyyyy.ru deferred, Max Clients 30 exceeded (87 currently)
88 [Sun Nov 14 18:23:44 2010] [warn] Vhost Limit : Access to xxx.ru deferred, Max Clients 30 exceeded (88 currently)
89 [Sun Nov 14 18:23:44 2010] [warn] Vhost Limit : Access to xxx.ru deferred, Max Clients 30 exceeded (89 currently)

И в итоге получаем почти зависшую машину со следующими показателями:
ps aux | grep apa| wc -l
859

cat hangup_lynx_16nov.log | grep xxx.ru | wc -l
106

воскресенье, 31 октября 2010 г.

Переключение Apache на Debian 5 Lenny в режим worker MPM

Итак, имеем Апача, работающего в режиме prefork с подключенным php5 как модулем Апача. Вариант миграции на Apache MPM worker только один - отказываться от php5 как модуля Апача и переходить на php5 как FastCGI (посредством mod_fcgid). Я рассмотрю лишь подключение Apache Worker, с mod_fcgid Вам придется разобраться самостоятельно.

Итак, имеем следующую конфигурацию Апача:
dpkg -l | grep prefork
ii apache2-mpm-prefork 2.2.9-10+lenny8 Apache HTTP Server - traditional non-threaded model

Итак, пробуем ставить Apache worker:
apt-get install apache2-mpm-worker

В ответ APT выдаст предупреждение о том, что в связи с конфликтом нужно удалить следующие пакеты: apache2-mpm-prefork и libapache2-mod-php5. Соглашаемся с этим. После этого APT сделает попытку перезапустить Апача, но, скорее всего, ему это не удастся, так как все было настроено для php5 как модуля Апача и в конфигурации много директив php_admin_value, которые уже некем обрабатывать (модуль-то Апача мы стерли):
Syntax error on line 7 of /etc/apache2/conf.d/phpmyadmin.conf:
Invalid command 'php_admin_value', perhaps misspelled or defined by a module not included in the server configuration
failed!

Удаляем эти конфиги / директивы и повторяем попытку перезапуска Апача:
/etc/init.d/apache2 restart

Все, после этого все должно заработать как нужно :)

Убеждаемся, что мы работаем на Worker MPM:
apache2ctl -M 2>&1| grep mpm
mpm_worker_module (static)

воскресенье, 3 октября 2010 г.

Установка Apache 2.2 с поддержкой PHP 5.3.2 на FreeBSD 8.1

Инициализируем систему портов вот так.

Установка Apache 2.2

cd /usr/ports/www/apache22
make install clean

Когда будет выведено окно настройки конфигурации, то оставляем там все без изменений - стандартная конфигурация довольно оптимальна.

Добавляем запуск Apache при запуске системы:
echo 'apache22_enable="YES"' >> /etc/rc.conf

Запускаем Апача:
/usr/local/etc/rc.d/apache22 start

Либо вот так покороче и поудобнее:
service apache22 start

Теперь открываем в баузере страницу: http://ip_вашего_сервера и там в случае корректной работы Apache мы должны увидеть надпись "It works!".

Конфиг Апача находится по адресу /usr/local/etc/apache22/httpd.conf, а стандартная папка для сайтов /usr/local/www/apache22/data/.

Подключение PHP 5 к Apache 2.2 в режиме mod_php

cd /usr/ports/lang/php5
make install clean

После этого при конфигурировании флагов сборки ставим галочку на "APACHE Build Apache module".

Теперь нужно собрать часто исползуемые расшрения:
cd /usr/ports/lang/php5-extensions
make install clean

При конфигурации ставим галочки (те, что уже стоят, не трогаем) на CURL, FILEINFO, BCMATH, GD, FTP, IMAP, MSTRING, MCRYPT, MYSQL, OPENSSL, SOCKETS, XMLRPC, XSL, ZIP, ZLIB.

Все остальные окошки конфигурации оставляем без изменения (их будет море, угу).

Теперь открываем конфигурацию Апача:
vi /usr/local/etc/apache22/httpd.conf

И добавляем следующее:
# возможно, эта строка уже будет добавлена, если она есть, повторно добавлять не нужно
LoadModule php5_module libexec/apache/libphp5.so
<IfModule mod_php5.c>
DirectoryIndex index.php index.html
</IfModule>
<IfModule mod_php5.c>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
</IfModule>

Теперь перезапускаем Апача для применения изменений:
service apache22 restart

Убеждаемся, что PHP был корректно подключен к Апачу:
apachectl -M | grep php5
Syntax OK
php5_module (shared)

Создаем тестовый PHP скрипт:
echo "<? PHP echo 'Hello from PHP!'; ?>" > /usr/local/www/apache22/data/index.php

И теперь открываем веб-страницу: http://ip_вашего_сервера/index.php и там мы должны увидеть текст Hello from PHP!, который повествует о том, что связка Apache2.2 и PHP 5.3.2 корректно настроена.

По материалам: http://www.freebsd.org/doc/handbook/network-apache.html

суббота, 18 сентября 2010 г.

Apache mod_vhost_limit: лимитированние числа worker процессов на vhost

По наводке arp`а нашел такую штуку: http://ivn.cl/2010/01/06/downloads-for-bandwidth-mod/

Модуль предназначен для того, чтобы задать лимит числа процессов-обработчиков для конкретного vhost. То есть, его задача не дать кому-то одному забить сервер до такой степени, что он либо повиснет либо упрется в MaxClients.

Прямой путь до исходников (зеркало):
http://fastvps.googlecode.com/svn/trunk/packages/mod_vhost_limit/mod_vhost_limit-0.2.tgz

понедельник, 31 мая 2010 г.

Уважаемый all! Как ограничить число worker процессов для виртуального хост апача?

Сабж.


update1:
ага, спасибо, в ITK такое есть.

MaxClientsVHost: A separate MaxClients for the vhost. This can be useful if, say, half of your vhosts depend on some NFS server (like on our setup); if the NFS server goes down, you do not want the children waiting forever on NFS to take the non-NFS-dependent hosts down. This can thus act as a safety measure, giving "server too busy" on the NFS-dependent vhosts while keeping the other ones happily running. (Of course, you could use it to simply keep one site from eating way too much resources, but there are probably better ways of doing that.)


http://mpm-itk.sesse.net/

среда, 19 мая 2010 г.

[Wed May 19 19:39:55 2010] [emerg] (13)Permission denied: mod_fcgid: can't get lock, pid: 21627

strace дает следующий результат:
[pid 21841] brk(0xc26000) = 0xc26000
[pid 21841] semop(2555905, 0x7f87e3f84a60, 1) = -1 EACCES (Permission denied)
[pid 21841] write(9, "[Wed May 19 19:45:06 2010] [emerg] (13)Permission denied: mod_fcgid: can't get lock, pid: 21841\n"..., 96) = 96


Причина:

dpkg -l | grep itk
ii apache2-mpm-itk 2.2.6-02-1+lenny2+b3 multiuser MPM for Apache 2.2


Решение - удалить и воткнуть префорк. То есть, mod_fcgid несовместим с Apache mpm_itk.

воскресенье, 16 мая 2010 г.

Debian, Apache, /var/log/apache2/error.log

Вот много вот такой ереси:
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1
Invalid query name 1


В интернетах пишут, что баг из-за кривой стандартной программы host: http://www.kathmann.com/2008/10/29/debian-apache-2-error-invalid-query-name-1/

У меня стояла именно она:
dpkg -l | grep host | grep 'utility for querying DNS servers'
ii host 20000331-9 utility for querying DNS servers


Ставим замену:
apt-get install -y bind9-host


При этом стандартная утилита host будет удалена:
dpkg -l | grep host | grep 'utility for querying DNS servers'

суббота, 8 мая 2010 г.

Настройка mod_proxy для проксирования https трафика

Включаем нужные модули Апача:
a2enmod proxy
a2enmod proxy_http


И еще, возможно, пригодится:
a2enmod proxy_connect


Перезапуск для включения модулей:
/etc/init.d/apache2 restart



vi /etc/apache2/mods-enabled/proxy.conf


Там удаляем причину перманентного Forbidden Access Deny:
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
#Allow from .example.com
</Proxy>


Добавляем:
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
 Allow from all
</Proxy>


Далее формулируем вот такой vhost:
<VirtualHost xx.xx.xx.xx:443>
ServerName xxx.domain.ru
ServerAlias www.xxx.domain.ru

CustomLog /var/www/httpd-logs/xxx.domain.ru.access.log combined
ErrorLog /var/www/httpd-logs/xxx.domain.ru.error.log

SSLEngine on
SSLCertificateFile /etc/apache2/ssl.crt/server.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/server.key

SSLProxyEngine On
ProxyPreserveHost On
ProxyPass / https://yy.yy.xx.zz/
ProxyPassReverse / https://xxx.domain.ru/
</VirtualHost>


После этого все запросы к нашему серверу по протоколу https будут перенаправляться на удаленный сервер ttps://yy.yy.xx.zz, который также отдает нам тарфик в https. Только прошу обратить внимание, иногда приходится выключать .htaccess редиректы, чтобы не было циклов на бэкэнде.

пятница, 7 мая 2010 г.

Отключение MOD_PHP в ISPManager / Debian, когда для сайта деактивирована поддержка PHP

Краткое изложение проблемы:

У нас на сервере пхп присутствут в дух инкарнациях - как модуль апача (встал стандартно при установке панели) и как фастцги (ставили также через панель). У нас есть пользователь, у которого есть права только на фастцги, возможность работы с ПХП как модулем Апача ему не дана. Этот пользователь создает сайт без поддержки пхп. Какзалось бы - все хорошо. Но если на этот статический сайт залить файл test.php, он исполнится! И при этом ПХП будет рабоатть как Модуль Апача. Как победить эту проблему?"


Фикс:
http://forum.ispsystem.com/ru/showthread.php?t=9134&highlight=%D0%BD%D0%B5%D1%82+%D0%BF%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D0%B8+php

Фиксим:
vi /etc/mime.types


Там находим и комментируем все строки с php:

#application/x-httpd-php phtml pht php
#application/x-httpd-php-source phps
#application/x-httpd-php3 php3
#application/x-httpd-php3-preprocessed php3p
#application/x-httpd-php4 php4


Далее открываем файл конфига PHP:
vi /etc/apache2/mods-available/php5.conf


И приводим внутренний блок вот к такому виду:

# Disable PHP for whole server
# AddType application/x-httpd-php .php .phtml .php3
# AddType application/x-httpd-php-source .phps


Перезапускаем Апача:

/etc/init.d/apache2 restart


И все оке!

Но если в .htaccess прописано следующее:
AddHandler application/x-httpd-php .php .htm .html


То PHP все равно включится в режиме модуль, но это победить уже проще :)

пятница, 30 апреля 2010 г.

Option MultiViews not allowed here

Проблема возникает из-за того, что Multiviews не включается в AllowOverride All и его надо указывать явно. Ниже привожу фикс для Дебы.

Открываем конфиг:
vi /etc/apache2/conf.d/secure.conf


Там видим:
AllowOverride FileInfo AuthConfig Limit Indexes Options


Корректируем:
AllowOverride FileInfo AuthConfig Limit Indexes Options=All,MultiViews


Перезапускаем Апача:
/etc/init.d/apache2 restart


Все ок :) источник фикса: http://mathiasbynens.be/notes/apache-allowoverride-all

воскресенье, 25 апреля 2010 г.

Подсчет "чистой памяти", потребляемой процессом (пример на Апаче)

По мотивам: http://prematureoptimization.org/blog/archives/28

В моей интерпретацией он выглядит примерно так:
pidof apache2 | xargs pmap -d | grep '^mapped' | awk '{print $4}' | sed 's/K//' | perl -e 'do { $a+=$_; $b++ } for <>;print $a/1024, " mb\n", $a/1024/$b, " mb\n"'


Выдача его выглядит так:
555.3828125 mb
30.8546006944444 mb


Первая строка означает "настоящее потребление памяти всеми процессами", а вторая означает усредненное на каждый форк значение.

А вот "реальное" использование памяти всеми процессами на сервере:
ps aux | awk '{print $2}' | grep -v 'PID' | xargs pmap -d | grep '^mapped' | awk '{print $4}' | sed 's/K//' | perl -e 'do { $a+=$_; $b++ } for <>;print $a/1024, " mb\n", $a/1024/$b, " mb\n"'


У меня скрипт выдал 5000 мегабайт при вот таких показаниях в top:
Mem: 12328016k total, 11257416k used, 1070600k free, 900536k buffers
Swap: 16779768k total, 233988k used, 16545780k free, 7255084k cached


То есть, 11257416k used - 900536k buffers - 7255084k cached = 3 Гигабайта. Однако. То есть каким-то образом мой скрипт учитывает и страничный кэш (ну не буферы же он приплетает, чесслово).

Также при тесте на VPS скрипт выдал следующие значения:
80.04296875 mb

При следующей выдаче free:
free
total used free shared buffers cached
Mem: 409600 84748 324852 0 0 0
-/+ buffers/cache: 84748 324852
Swap: 0 0 0

Также можно посчитать общий размер памяти, который mapped (то есть общий):
ps aux | awk '{print $2}' | grep -v 'PID' | xargs pmap -d | grep '^mapped' | awk '{print $2}' | sed 's/K//' | perl -e 'do { $a+=$_; $b++ } for <>;print $a/1024, " mb\n", $a/1024/$b, " mb\n"'


Вот отличная статья по сабжу: http://www.opennet.ru/base/sys/pmap_memory.txt.html

воскресенье, 18 апреля 2010 г.

Как рассчитать MaxClients для конкретного сервера?

Вот так: http://perl.apache.org/docs/1.0/guide/performance.html#Choosing_MaxClients

Как узнать, какой URL / сайт больше всего грузит Apache?

Утилитой Apachetop!

Ставим:
apt-get install -y apachetop


Натравливаем на access лог Апача:
apachetop -f /var/log/apache/access.log


Кстати, access логи nginx он также отлично кушает:
apachetop -f /var/log/nginx/access.log


Выдача команды имеет вот такой вид:
last hit: 14:49:12 atop runtime: 0 days, 00:00:35 14:49:28
All: 19 reqs ( 0.9/sec) 50.4K ( 2457.9B/sec) 2716.6B/req
2xx: 8 (42.1%) 3xx: 11 (57.9%) 4xx: 0 ( 0.0%) 5xx: 0 ( 0.0%)
R ( 30s): 19 reqs ( 0.6/sec) 50.4K ( 1720.5B/sec) 2716.6B/req
2xx: 8 (42.1%) 3xx: 11 (57.9%) 4xx: 0 ( 0.0%) 5xx: 0 ( 0.0%)

REQS REQ/S KB KB/S URL
6 0.29 37.8 1.8*/
2 0.11 0.0 0.0 /favicon.ico
2 0.12 12.6 0.7 /favicon.ico/
1 0.06 0.0 0.0 /wp-content/themes/bluebird/style.css
1 0.06 0.0 0.0 /wp-includes/js/thickbox/thickbox.css
1 0.06 0.0 0.0 /wp-content/plugins/google-ajax-translation/google-ajax-translation
1 0.06 0.0 0.0 /wp-includes/js/jquery/jquery.js
1 0.06 0.0 0.0 /wp-content/themes/bluebird/images/header1.jpg
1 0.06 0.0 0.0 /wp-content/themes/bluebird/images/header2.jpg
1 0.06 0.0 0.0 /wp-content/themes/bluebird/images/feedicon.png
1 0.06 0.0 0.0 /wp-content/plugins/google-ajax-translation/transparent.gif
1 0.06 0.0 0.0 /files/2009/12/Christmas-Tree.png

вторник, 13 апреля 2010 г.

Поиск аномальных записей в логах ошибок Nginx и Apache

В логах ошибок Апача и Нгинкса тонны записей, но полезных среди них очень мало и они почти теряются на фоне ошибок "No such directory" и прочих, что делает просмотр логов очень неудобным и допускающим пропуск важных записей. Чтобы просматривать логи в удобном виде, необходимо отфильтровать лишние записи каким-либо образом, например грепом. Все примеры ниже будут для Debian.

Nginx:

cat /var/log/nginx/error.log | grep -v '2: No such file or directory' | grep -v 'failed (20: Not a directory' | grep -v ' access forbidden by rule' | egrep -v 'conflicting server name.*ignored' | grep -v 'Connection refused' | grep -v 'upstream timed out' | grep -v 'Connection reset by peer' | grep -v 'upstream prematurely closed connection while reading response header'



Apache:

cat /var/log/apache2/error.log /var/log/httpd/error_log | grep -v '\[notice\] mod_fcgid: call' | grep -v 'Init: SSL server IP/port conflict' | grep -v 'RSA server certificate wildcard' | grep -v 'suEXEC mechanism enabled' | grep -v 'Init: You should not use name-based virtual hosts in conjunction with SSL' | grep -v 'mod_ssl/2.2.9 OpenSSL/0.9.8g configured -- resuming normal operations' | grep -v 'File does not exist' | grep -v 'RSA server certificate is a CA certificate' | grep -v 'RSA server certificate CommonName ' | grep -v 'Graceful restart requested, doing restart' | grep -v 'caught SIGTERM, shutting down' | grep -v 'Digest: done' | grep -v 'Digest: generating secret for digest authentication' | grep -v 'configured -- resuming normal operations' | grep -v 'Could not reliably determine the server' | egrep -v 'DocumentRoot.*does not exist' | egrep -v 'mod_fcgid: process.*terminated by calling exit\(\), return code: 0' | grep -v 'No such file or directory: Timeout connecting daemon' | grep -v 'process.*going graceful shutdown, sending SIGTERM' | grep -v 'process.*graceful shutdown timeouted, sending SIGKILL' | grep -v 'mod_fcgid: cleanup zombie process' | grep -v 'mod_fcgid: too much' | grep -v 'process.*exit(communication error)' | grep -v 'process.*exit(shutting down)' | grep -v 'Premature end of script headers: ispmgr' | egrep -v 'script.*not found or unable to stat' | grep -v 'client denied by server configuration' | grep -v 'mod_fcgid: process.*exit(lifetime expired)' | grep -v 'mod_fcgid: process.*exit(idle timeout)' | grep -v 'mod_fcgid: process.*exit(busy timeout)'


ISPManager:
cat /usr/local/ispmgr/var/ispmgr.log | grep Error -i | grep -v 'error.log' | grep -v 'location_error' | grep -v 'fdata='



Поиск аномалий по клиентским логам:
for i in `find /var/www/*/data/logs | grep 'error.log'`; do file $i | grep -q 'gzip compressed data'; if [ $? -eq 0 ]; then zcat $i ; else cat $i; fi ; done | grep -v 'File does not exist' | grep -v 'client denied by server configuration' | grep -v 'script not found or unable to stat' | grep -v 'not found or unable to stat' | grep -v 'No such file or directory: Timeout connecting daemon' | grep -v 'File name too long' | grep -v 'Directory index forbidden by Options directive' | grep -v 'attempt to invoke directory as script' | grep -v 'mod_fcgid: server is restarted' | grep -v 'Permission denied: file permissions deny server access' | egrep -v 'script.*not found or unable to stat' | grep -v "Permission denied: Can't open directory for index" | grep -v 'stderr: WordPress database error' | grep -v 'mod_fcgid: read data timeout in 40 seconds' | grep -v 'Premature end of script headers' | grep -v 'Request exceeded the limit of 10 internal redirects'

Установка PHP htscanner на Debian - поддержка php_flag в .htaccess для PHP FastCGI / CGI

Офсайт проекта: http://pecl.php.net/package/htscanner

Ставим зависимости:
apt-get install -y php5-dev make patch


cd /usr/src
wget http://pecl.php.net/get/htscanner-0.9.0.tgz
# или зеркало
wget http://fastvps.googlecode.com/svn/trunk/packages/htscanner-0.9.0.tgz
tar -xf htscanner-0.9.0.tgz
cd htscanner-0.9.0
# накладываем патч, без него не будет работать php_flag
wget http://fastvps.googlecode.com/svn/trunk/patches/htscanner.patch
patch -p0 < htscanner.patch # следом накладываем патч для запрета перекрыти memory_limit wget http://fastvps.googlecode.com/svn/trunk/patches/deny_values.patch patch -p0 < deny_values.patch phpize ./configure make



Устанавливаем:
cp modules/htscanner.so /usr/lib/php5/20060613/


Или
make install


Но этого недостаточно, чтобы модуль подключился:
php -m | grep htscanner


Создаем конфиг:
vi /etc/php5/conf.d/htscanner.ini


[htscanner]
extension="htscanner.so"
; The configuration file htscanner needs to scan for php_* directives
config_file=".htaccess"
; The fallback docroot when htscanner can't determine the current docroot
default_docroot="/"
default_ttl=300
; Stop when an error occured in RINIT (no document root, cannot get path_translated,...)
stop_on_error = 0


Теперь создаем в корне сайта .htaccess со следующими строками (поиски по Гуглу и опрос знакомых подтвердили, у htscanner php_flag не работает в принципе):
php_flag register_globals On

но это не сработает почему-то :( А вот такой вариант отлично пашет:

php_value register_globals 1


Обращаю внимание, что после изменения .htaccess необходимо перезапустить рабочие процессы PHP, чтобы изменения применились:
killall -u username


В процессе поиска фикса насткнулся на следующие патчи для htscanner 0.9.0:
http://yourserveradmin.com/ik/htscanner-0.9.0.eol.patch и вот http://blog.hbis.fr/2009/04/02/htscanner-parser-patch/patch-htscanner-parser-20090401/ (как раз, вроде, на мою проблему).