FastNetMon

Showing posts with label Apache2. Show all posts
Showing posts with label Apache2. Show all posts

Thursday, 11 November 2010

Apache MPM Prefork vs ITK

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

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

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

Sunday, 31 October 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)

Sunday, 3 October 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

Saturday, 18 September 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

Monday, 31 May 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/

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 дает следующий результат:
[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

Вот много вот такой ереси:
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 трафика

Включаем нужные модули Апача:
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

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

У нас на сервере пхп присутствут в дух инкарнациях - как модуль апача (встал стандартно при установке панели) и как фастцги (ставили также через панель). У нас есть пользователь, у которого есть права только на фастцги, возможность работы с ПХП как модулем Апача ему не дана. Этот пользователь создает сайт без поддержки пхп. Какзалось бы - все хорошо. Но если на этот статический сайт залить файл 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 и его надо указывать явно. Ниже привожу фикс для Дебы.

Открываем конфиг:
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

В моей интерпретацией он выглядит примерно так:
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

Как рассчитать 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

Tuesday, 13 April 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/ (как раз, вроде, на мою проблему).