FastNetMon

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

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

Debian: не работает Apache Mod_Expires

Имеем вот такие настройки в .htaccess:

62 <IfModule mod_expires.c>
63 # Enable expirations.
64 ExpiresActive On
65
66 # Cache all files for 2 weeks after access (A).
67 ExpiresDefault A1209600
68
69 # Do not cache dynamically generated pages.
70 ExpiresByType text/html A1
71 </IfModule>


То есть все файлы с типом text/html должны выдаваться с заголовками, разрешающими их кэширование, это можно проверять командой (обязательно, чтобы 1.html был статикой, иначе никаких директив мы не поулчим! Апач не дописывает директивы к выдаче скриптов):
wget http://domain.ru:80/1.html --server-response -O/dev/null


Но выдаются только следующие заголовки на бэкэнде:

HTTP/1.1 200 OK
Date: Tue, 13 Apr 2010 07:21:32 GMT
Server: Apache
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html


А на фронтэнде nginx:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 13 Apr 2010 07:21:34 GMT
Content-Type: text/html
Connection: keep-alive
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Vary: Accept-Encoding


Как видите, ничего близкого к кэшированию тут нету.

Чтобы кэширование все же заработало, необходимо включить соответствующий модуль:
a2enmod expires
/etc/init.d/apache restart


После этого получаем от бэкэнда:

HTTP/1.1 200 OK
Date: Tue, 13 Apr 2010 07:24:53 GMT
Server: Apache
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Cache-Control: max-age=1
Expires: Tue, 13 Apr 2010 07:24:54 GMT
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html


И фронтэнда:

HTTP/1.1 200 OK
Server: nginx
Date: Tue, 13 Apr 2010 07:25:20 GMT
Content-Type: text/html
Connection: keep-alive
Last-Modified: Tue, 13 Apr 2010 07:19:25 GMT
ETag: "5258883-5-4841914cef940"
Accept-Ranges: bytes
Content-Length: 5
Cache-Control: max-age=1
Expires: Tue, 13 Apr 2010 07:25:21 GMT
Vary: Accept-Encoding


Как видите, появились новые директивы:
Cache-Control: max-age=1
Expires: Tue, 13 Apr 2010 07:25:21 GMT

[Tue Apr 13 00:48:12 2010] [error] [client xx.xx.xx.xx] (13)Permission denied: cannot read directory for multi: /var/www/

Описание проблемы: http://defindit.com/readme_files/apache_13_error.html

Как следствие - не работает /server-status с ошибкой:
You don't have permission to access /server-status on this server.


Проблема в MultiViews для default-site.

Фикс:
a2dissite 000-default
/etc/init.d/apache2 reload

среда, 7 апреля 2010 г.

Защита папки .svn при выкатывании сайта из Subversion на Apache

Когда Вы храните сайт в Subversion и выкатываете его на продакшеновый Апач посредством него же, то волей-неволей во всех папках проекта появляются служебные папки .svn, которые Apache с превеликим удовольствием выдаст первому встречному при запросе http://ваш_сайт/.svn. Как понимаете, это серьезный удар по безопасности и положение нужно срочно исправлять.

Поможет в этом нам директива Apache DirectoryMatch:

<DirectoryMatch "^/.*/(\.svn|CVS)/">
Order deny,allow
Deny from all
</DirectoryMatch>


Добавив такой код в конфиг-файл Apache, Вы заблокируете доступ ко всем папкам .svn в пределах сервера через веб.

Взято с: http://codesnippets.joyent.com/posts/show/1364

суббота, 3 апреля 2010 г.

Руководство по поиску узких мест в производительности web-серверов

Самое первое, что стоит смотреть - это не уперся ли Апач в лимит коннектов.
tail -f /var/log/httpd/error_log
[Sat Apr 03 14:35:05 2010] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sat Apr 03 14:35:05 2010] [notice] Digest: generating secret for digest authentication ...
[Sat Apr 03 14:35:05 2010] [notice] Digest: done
[Sat Apr 03 14:35:06 2010] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations
[Sat Apr 03 14:42:02 2010] [error] server reached MaxClients setting, consider raising the MaxClients setting


Вы не поверите, но это решает 50% проблем с работой веб-серверов :)

Как заставить httpd на CentOS принимать .htaccess в папке /var/www/html?

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


Ищем там блок Directory "/var/www/html" и внутри него заменяем:
AllowOverride None


на


AllowOverride All


Применяем изменения:
/etc/init.d/httpd restart

среда, 31 марта 2010 г.

Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration

Фикс на Debian:

a2enmod headers
/etc/init.d/apache2 restart

Apache, Debian [emerg] (22)Invalid argument: couldn't grab the accept mutex

Вот такая радость в error.log Апача:
[Tue Mar 30 22:11:43 2010] [emerg] (22)Invalid argument: couldn't grab the accept mutex


Проблема решилась сама собой после насильного перезапуска процессов Апача и перезагрузки сервера. Если у кого есть "правильное" решение - прошу в комменты.

понедельник, 29 марта 2010 г.

Как установить MaxClients больше 256 ?

Если просто написать MaxClients 257, то получим ошибку:

WARNING: MaxClients of 257 exceeds ServerLimit value of 256 servers, lowering MaxClients to 256. To increase, please see the ServerLimit


Правильно писать вот так:

ServerLimit 257
MaxClients 256


И после этого перезапуск Апача произойдет успешно:

/etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .

четверг, 18 февраля 2010 г.

Как закрыть Apache на 8080м порту?

В связке ISPManager + Apache + Nginx есть встроенный косяк безопасности - к Апачу можно подключиться через 8080й порт снаружи.

Фиксится этот баг так:

# разрешаем локальный трафик
iptables -A INPUT -i lo -j ACCEPT
# блокируем все остальные соединения до 8080го порта
iptables -A INPUT -p tcp --dport 8080 -j DROP


Хм, фикс под сомнением.... может и не сработать.

вторник, 16 февраля 2010 г.

Debian: Apache too many open files

Имеем в error логе Апача следующее:

Unable to open logs


А при strace -f запуске Апача:

[pid 3348] open("/var/www/httpd-logs/domain.ru.access.log", O_WRONLY|O_CREAT|O_APPEND|O_LARGEFILE, 0666) = -1 EMFILE (Too many open files)
[pid 3348] gettimeofday({1266321102, 423342}, NULL) = 0
[pid 3348] open("/etc/localtime", O_RDONLY) = -1 EMFILE (Too many open files)


Это ошибка означает, что мы уперлись в стандартный лимит - 1024 открытых файла и его надо увеличить так:
echo 'export APACHE_ULIMIT_MAX_FILES="ulimit -n 999999"' >> /etc/apache2/envvars


Ну и все, перезапускаем Апача:

/etc/init.d/apache2 restart

пятница, 12 февраля 2010 г.

Debian: /usr/lib/apache2/modules/mod_jk.so: cannot open shared object file: No such file or directory

Ставим:
apt-get install -y libapache2-mod-jk

Debian: Invalid command 'ExpiresActive', perhaps misspelled or defined by a module not included in the server configuration


a2enmod expires
/etc/init.d/apache2 restart

Invalid command 'CharsetDisable', perhaps misspelled or defined by a module not included in the server configuration

Возникает ошибка при использовании в .htaccess такой вот директивы:
CharsetDisable On


Судя по форумам, это директива, которая использовалась в "Русском Апаче" и она обычным Апачем не поддерживается (пруфлинк). Так что основной фикс - удалить эту строку из .htaccess.

пятница, 5 февраля 2010 г.

Директива _default_ для виртуальных хостов Apache

The string _default_, which is used only with IP virtual hosting to catch unmatched IP addresses.


Например, в случае SSL виртуального хоста действовать оно будет так: если для IP адреса не был создан виртуальный хост, где явно указан IP, например, вот так: <VirtualHost 11.11.11.11:443>, то запрос будет обрабатываться виртуальным хостом с _default_ (ну и SSL сертификаты будут использованы, разумеется, его же). В противном случае, запрос отработает заданный вихост.

(с) http://httpd.apache.org/docs/2.2/mod/core.html#virtualhost

среда, 20 января 2010 г.

Куда пропал оф сайт mod_fcgid http://fastcgi.coremail.cn/doc.htm ?

Последнюю неделю пытаюсь зайти на http://fastcgi.coremail.cn/doc.htm, но обламываюсь :( Думал, что просто лежит. Оказывается нет:
mod_fcgid was created by Ryan Pan (Pan Qingfeng, pqf or 潘庆峰) in 2004 as a new FastCGI implementation, and was granted to the ASF as an Apache HTTP Server subproject in 2009, shepherded by Chris Darroch (chrisd).


(с) http://httpd.apache.org/mod_fcgid/

суббота, 16 января 2010 г.

Защита HTTP серверов от DoS / DDoS атак

Рекомендую для этого следующие правила:

http://phpsuxx.blogspot.com/2009/12/iptables_16.html и http://phpsuxx.blogspot.com/2010/01/http-get-dos.html

То есть, итого:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 -j REJECT

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --name http --set
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --name http --update --seconds 60 --hitcount 20 -j DROP


А если хотите только записывать подозрительных товарищей, то -j LOG и dmesg Вам в помощь и вот примерчик:


iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 -j LOG
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --name http --set
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --name http --update --seconds 60 --hitcount 20 -j LOG


Только не забываем отключить syslog, иначе будем смерть винтам :)

/etc/init.d/rsyslog stop


Ну и следом пускаем бан-скрипт:

while true; do sleep 1; dmesg -c; done | awk '{print $6}' | tr '=' ' ' | awk '{print $2}' | while read ip; do iptables -I INPUT -p tcp --dport 80 -s $ip -j DROP ; done

среда, 13 января 2010 г.

Запуск двух серверов Apache на Debian Linux

Есть ряд задач, когда требуется иметь в системе два веб-сервера Apache (на разных портах), использующих по возможности одни бинарные файлы и основные конфиги и не мешающих друг другу в работе.

Итак, достойного мануал для решения задачи я не нашел, так что будем импровизация :)

Для начала обсудим, что должно быть у Апачей общим, а что раздельным. Очевидно, отличаться они будут по файлу /etc/apache2/apache2.conf (т.к. в нем указаны порты и специфичные для каждого из Апачей виртуальные хосты). Файл /etc/apache2/ports.conf содержит прослушиваемые порты, так что он также будет отличаться. Также есть еще файл /etc/apache2/envvars, который содержит путь к файлу для сохранения pid запущенного демона.

Логи? Логи уровня демонов также стоит разделить, они задаются следующими директивами в apache2.conf:

ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/other_vhosts_access.log vhost_combined


Идем в папку init скриптов:

cd /etc/init.d


Создаем копию init скрипта родного Апача:

cp apache2 failoverapache


Сразу Добавляем фейловер Апача в автозапуск:
update-rc.d failoverapache defaults


Далее необходимо скорректировать init скрипт failoverapache, сразу оговорюсь, что конфиг файлы "второго Апача" будут иметь суффикс _failover для удобного отличения от оригинала.

Выбираем новый путь до pid файла
Вот здесь упоминается PID, который у нас должен быть свой

PIDFILE=`. /etc/apache2/envvars ; echo $APACHE_PID_FILE`
if [ -z "$PIDFILE" ] ; then
echo ERROR: APACHE_PID_FILE needs to be defined in /etc/apache2/envvars >&2
exit 2
fi


Заменяем на:

PIDFILE=`. /etc/apache2/envvars_failover ; echo $APACHE_PID_FILE`
if [ -z "$PIDFILE" ] ; then
echo ERROR: APACHE_PID_FILE needs to be defined in /etc/apache2/envvars_failover >&2
exit 2
fi


И чуть выше корректируем ENV:

ENV="env -i LANG=C PATH=/usr/local/bin:/usr/bin:/bin APACHE_ENVVARS=/etc/apache2/envvars_failover"


И сразу же корректируем конфиги:

cp /etc/apache2/envvars /etc/apache2/envvars_failover


И следом:

vi /etc/apache2/envvars_failover


И заменяем там:
export APACHE_PID_FILE=/var/run/apache2.pid

на

export APACHE_PID_FILE=/var/run/apache2_failover.pid


ports.conf
Теперь создадим свой файл ports.conf:
vi /etc/apache2/ports_failover.conf


Куда поместим одну директиву:

Listen 8081


Создаем файлы логов
Вот так:
touch /var/log/apache2/error_failover.log
touch /var/log/apache2/other_vhosts_access_failover.log
chown root:root /var/log/apache2/other_vhosts_access_failover.log
chown root:adm /var/log/apache2/error_failover.log
chmod 640 /var/log/apache2/error_failover.log


Теперь давайте посмотрим, как осуществляется управление демоном Апача. Сразу скажу, что кэш мы не используем и следовательно "check_htcacheclean" всегда будет выдавать ложь

Запуск:

start)
log_daemon_msg "Starting web server" "apache2"
if $APACHE2CTL start; then
if check_htcacheclean ; then
log_progress_msg htcacheclean
start_htcacheclean || log_end_msg 1
fi
log_end_msg 0
else
log_end_msg 1
fi
;;


То есть все вопросы к: $APACHE2CTL, его мы будем использовать не как SysV инит скрипт, а будем им проксировать все наши вопросы к apache :)

Для этого в верху скрипта делаем замену:
APACHE2CTL="$ENV /usr/sbin/apache2ctl"


на

APACHE2CTL="$ENV /usr/sbin/apache2ctl -f /etc/apache2/apache2_failover.conf"


Далее изменяем все параметры вызов APACHE2CTL:

$APACHE2CTL start на $APACHE2CTL -k start
$APACHE2CTL stop на $APACHE2CTL -k stop
$APACHE2CTL graceful на $APACHE2CTL -k graceful
$APACHE2CTL configtest на $APACHE2CTL -t



Теперь надо скорректировать функцию pidof_apache, иначе при stop мы будем убивать всех Апаче разом:

Делаем замену:

pidof_apache() {
# if pidof is null for some reasons the script exits automagically
# classified as good/unknown feature
PIDS=`pidof apache2` || true



на:

pidof_apache() {
# if pidof is null for some reasons the script exits automagically
# classified as good/unknown feature
PIDS=`ps aux | grep 'apache2_failover' | grep -v 'grep' | awk '{print $2}' | xargs` || true


Теперь попробуем запустить второго Апача:

/etc/init.d/failoverapache start
Starting web server: apache2apache2: Could not open configuration file /etc/apache2/apache2_failover.conf: No such file or directory
failed!


Облом и вполне оправданный :)

Теперь необходимо на основе apache2.conf составить /etc/apache2/apache2_failover.conf

Скопируем оригинал

cp /etc/apache2/apache2.conf /etc/apache2/apache2_failover.conf


И далее корректируем пути к файлами, которые обсуждали выше.


CustomLog /var/log/apache2/other_vhosts_access_failover.log vhost_combined
ErrorLog /var/log/apache2/error_failover.log
Include /etc/apache2/ports_failover.conf


Теперь надо поменять порты у директив NameVirtualHost xx.xx.xx.xx:8081 и VirtualHost xx.xx.xx.xx:8081.

Повторяем попытку запуска:

/etc/init.d/failoverapache start
Starting web server: apache2.


Ну и дальше по аналогии останется внести все способы перезапуска и протестировать, чтобы Апачи друг с другом не воевали, но это чуть позже.

Для регенерации конфигов можете использовать мой скрипт: http://fastvps.googlecode.com/svn/trunk/scripts/convert_vhosts.pl