Вот тесты: http://blog.penumbra.be/2010/05/hosting-attack-mitigation-p1/
Раза в полтора ITK тормознее. Надо бы свои тесты провести.
А вот еще интересные тесты: http://workingdirectory.net/posts/2010/benchmarking-php/
Showing posts with label Apache2. Show all posts
Showing posts with label Apache2. Show all posts
Friday, 12 November 2010
Wednesday, 10 November 2010
Установка mod_vhost_limit на Debian 5 Lenny для лимитирования числа рабочих процессов для 1 виртуального хоста
Я ранее уже писал про эту штуку: http://phpsuxx.blogspot.com/2010/09/apache-modvhostlimit-worker-vhost.html
Итак, заранее предположим, что у нас есть настроенный префорк Апач.
Собираем:
После этого нужно файлик compile.sh заменить на следующий (в исходном все пути забиты под CentOS):
Итак, теперь компилируем:
В результате этих манипуляций у нас должен получить вот такой вот бинарик:
Создаем папку для модуля:
Далее конфигурируем Апача:
Тестируем конфиг:
Убеждаемся, что модуль загрузился:
Перезапускаем Апача для применения изменений:
Тесты
Для начала откроем лог для просмотра диагностических сообщений от модуля:
Теперь пробуем бомбануть какой-нибудь сайт 10 потоками, чтобы создать 10 воркеров.
То есть, получаем идеальные цифры (логи при этом идеально пусты):
Увеличиваем до 11 потоков и тут начинается работа модуля:
Итого, пошел серьезный отбой запросов:
Также в логе ошибок появились следующие записи:
Ура, ура :)
Далее увеличил лимит воркеров до сотни и прогнал нагрузочный тест в виде:
Так что вполне production ready решение.
Также еше фишка в том, что Апача выбрасывает 503 ошибку (это пример лога уже при проксировании nginx):
Пруф из кода:
В процессе работы в продакшене крайне рекомендую контролировать, на какие сайты реагирует модуль:
А вот так топ террористов устроить:
Результаты нагрузочного тестирования в продакшене
Модуль к использованию НЕ РЕКОМЕНДУЕТСЯ, так как при высокой частоте форков он не справляется и не выдерживает заданный лимит, в результате при выставленном лимите в 30 форков их плодится до сотни и более.
И в итоге получаем почти зависшую машину со следующими показателями:
Итак, заранее предположим, что у нас есть настроенный префорк Апач.
Собираем:
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
Sunday, 31 October 2010
Переключение Apache на Debian 5 Lenny в режим worker MPM
Итак, имеем Апача, работающего в режиме prefork с подключенным php5 как модулем Апача. Вариант миграции на Apache MPM worker только один - отказываться от php5 как модуля Апача и переходить на php5 как FastCGI (посредством mod_fcgid). Я рассмотрю лишь подключение Apache Worker, с mod_fcgid Вам придется разобраться самостоятельно.
Итак, имеем следующую конфигурацию Апача:
Итак, пробуем ставить Apache worker:
В ответ APT выдаст предупреждение о том, что в связи с конфликтом нужно удалить следующие пакеты: apache2-mpm-prefork и libapache2-mod-php5. Соглашаемся с этим. После этого APT сделает попытку перезапустить Апача, но, скорее всего, ему это не удастся, так как все было настроено для php5 как модуля Апача и в конфигурации много директив php_admin_value, которые уже некем обрабатывать (модуль-то Апача мы стерли):
Удаляем эти конфиги / директивы и повторяем попытку перезапуска Апача:
Все, после этого все должно заработать как нужно :)
Убеждаемся, что мы работаем на Worker MPM:
Итак, имеем следующую конфигурацию Апача:
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)
Sunday, 10 October 2010
Sunday, 3 October 2010
Установка Apache 2.2 с поддержкой PHP 5.3.2 на FreeBSD 8.1
Инициализируем систему портов вот так.
Установка Apache 2.2
Когда будет выведено окно настройки конфигурации, то оставляем там все без изменений - стандартная конфигурация довольно оптимальна.
Добавляем запуск Apache при запуске системы:
Запускаем Апача:
Либо вот так покороче и поудобнее:
Теперь открываем в баузере страницу: http://ip_вашего_сервера и там в случае корректной работы Apache мы должны увидеть надпись "It works!".
Конфиг Апача находится по адресу /usr/local/etc/apache22/httpd.conf, а стандартная папка для сайтов /usr/local/www/apache22/data/.
Подключение PHP 5 к Apache 2.2 в режиме mod_php
После этого при конфигурировании флагов сборки ставим галочку на "APACHE Build Apache module".
Теперь нужно собрать часто исползуемые расшрения:
При конфигурации ставим галочки (те, что уже стоят, не трогаем) на CURL, FILEINFO, BCMATH, GD, FTP, IMAP, MSTRING, MCRYPT, MYSQL, OPENSSL, SOCKETS, XMLRPC, XSL, ZIP, ZLIB.
Все остальные окошки конфигурации оставляем без изменения (их будет море, угу).
Теперь открываем конфигурацию Апача:
И добавляем следующее:
Теперь перезапускаем Апача для применения изменений:
Убеждаемся, что PHP был корректно подключен к Апачу:
Создаем тестовый 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
Установка 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
Saturday, 18 September 2010
Apache mod_vhost_limit: лимитированние числа worker процессов на vhost
По наводке arp`а нашел такую штуку: http://ivn.cl/2010/01/06/downloads-for-bandwidth-mod/
Модуль предназначен для того, чтобы задать лимит числа процессов-обработчиков для конкретного vhost. То есть, его задача не дать кому-то одному забить сервер до такой степени, что он либо повиснет либо упрется в MaxClients.
Прямой путь до исходников (зеркало):
Модуль предназначен для того, чтобы задать лимит числа процессов-обработчиков для конкретного vhost. То есть, его задача не дать кому-то одному забить сервер до такой степени, что он либо повиснет либо упрется в MaxClients.
Прямой путь до исходников (зеркало):
http://fastvps.googlecode.com/svn/trunk/packages/mod_vhost_limit/mod_vhost_limit-0.2.tgz
Monday, 23 August 2010
Wednesday, 2 June 2010
Monday, 31 May 2010
Уважаемый all! Как ограничить число worker процессов для виртуального хост апача?
Сабж.
update1:
ага, спасибо, в ITK такое есть.
http://mpm-itk.sesse.net/
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/
Tuesday, 25 May 2010
Кто еще использует префиксы www. ?
Довольно много кто:
Цифры за пару часов от одного довольно посещаемого сайта.
domain.ru 324
www.domain.ru 45
Цифры за пару часов от одного довольно посещаемого сайта.
Wednesday, 19 May 2010
[Wed May 19 19:39:55 2010] [emerg] (13)Permission denied: mod_fcgid: can't get lock, pid: 21627
strace дает следующий результат:
Причина:
Решение - удалить и воткнуть префорк. То есть, mod_fcgid несовместим с Apache mpm_itk.
[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.
Sunday, 16 May 2010
Debian, Apache, /var/log/apache2/error.log
Вот много вот такой ереси:
В интернетах пишут, что баг из-за кривой стандартной программы host: http://www.kathmann.com/2008/10/29/debian-apache-2-error-invalid-query-name-1/
У меня стояла именно она:
Ставим замену:
При этом стандартная утилита host будет удалена:
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'
Saturday, 8 May 2010
Настройка mod_proxy для проксирования https трафика
Включаем нужные модули Апача:
И еще, возможно, пригодится:
Перезапуск для включения модулей:
Там удаляем причину перманентного Forbidden Access Deny:
Добавляем:
Далее формулируем вот такой vhost:
После этого все запросы к нашему серверу по протоколу https будут перенаправляться на удаленный сервер ttps://yy.yy.xx.zz, который также отдает нам тарфик в https. Только прошу обратить внимание, иногда приходится выключать .htaccess редиректы, чтобы не было циклов на бэкэнде.
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 редиректы, чтобы не было циклов на бэкэнде.
Friday, 7 May 2010
Отключение MOD_PHP в ISPManager / Debian, когда для сайта деактивирована поддержка 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
Фиксим:
Там находим и комментируем все строки с php:
Далее открываем файл конфига PHP:
И приводим внутренний блок вот к такому виду:
Перезапускаем Апача:
И все оке!
Но если в .htaccess прописано следующее:
То 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 все равно включится в режиме модуль, но это победить уже проще :)
Friday, 30 April 2010
Option MultiViews not allowed here
Проблема возникает из-за того, что Multiviews не включается в AllowOverride All и его надо указывать явно. Ниже привожу фикс для Дебы.
Открываем конфиг:
Там видим:
Корректируем:
Перезапускаем Апача:
Все ок :) источник фикса: http://mathiasbynens.be/notes/apache-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
Sunday, 25 April 2010
Подсчет "чистой памяти", потребляемой процессом (пример на Апаче)
По мотивам: http://prematureoptimization.org/blog/archives/28
В моей интерпретацией он выглядит примерно так:
Выдача его выглядит так:
Первая строка означает "настоящее потребление памяти всеми процессами", а вторая означает усредненное на каждый форк значение.
А вот "реальное" использование памяти всеми процессами на сервере:
У меня скрипт выдал 5000 мегабайт при вот таких показаниях в top:
То есть, 11257416k used - 900536k buffers - 7255084k cached = 3 Гигабайта. Однако. То есть каким-то образом мой скрипт учитывает и страничный кэш (ну не буферы же он приплетает, чесслово).
Также при тесте на VPS скрипт выдал следующие значения:
При следующей выдаче free:
Также можно посчитать общий размер памяти, который mapped (то есть общий):
Вот отличная статья по сабжу: http://www.opennet.ru/base/sys/pmap_memory.txt.html
В моей интерпретацией он выглядит примерно так:
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
Sunday, 18 April 2010
Как узнать, какой URL / сайт больше всего грузит Apache?
Утилитой Apachetop!
Ставим:
Натравливаем на access лог Апача:
Кстати, access логи nginx он также отлично кушает:
Выдача команды имеет вот такой вид:
Ставим:
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
Tuesday, 13 April 2010
Поиск аномальных записей в логах ошибок Nginx и Apache
В логах ошибок Апача и Нгинкса тонны записей, но полезных среди них очень мало и они почти теряются на фоне ошибок "No such directory" и прочих, что делает просмотр логов очень неудобным и допускающим пропуск важных записей. Чтобы просматривать логи в удобном виде, необходимо отфильтровать лишние записи каким-либо образом, например грепом. Все примеры ниже будут для Debian.
Nginx:
Apache:
ISPManager:
Поиск аномалий по клиентским логам:
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
Ставим зависимости:
Устанавливаем:
Или
Но этого недостаточно, чтобы модуль подключился:
Создаем конфиг:
Теперь создаем в корне сайта .htaccess со следующими строками (поиски по Гуглу и опрос знакомых подтвердили, у htscanner php_flag не работает в принципе):
но это не сработает почему-то :( А вот такой вариант отлично пашет:
Обращаю внимание, что после изменения .htaccess необходимо перезапустить рабочие процессы PHP, чтобы изменения применились:
В процессе поиска фикса насткнулся на следующие патчи для 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/ (как раз, вроде, на мою проблему).
Ставим зависимости:
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/ (как раз, вроде, на мою проблему).
Subscribe to:
Posts
(
Atom
)