LINUX.ORG.RU

Сообщения atomlab

 

Aapache перестает обрабатывать запросы.

Форум — Admin

Добрый день. Есть проблема с Apache.

Apache в какой-то момент перестает обрабатывать запросы. HTTP запрос ему отправлен,а ответа нет.

Server version: Apache/2.2.19 (Unix)
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)

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

Я наблюдаю с помощью strace за родтельским процессом и дочерним. Обычно это выглядит так.

Родительский процесс
strace -vp <master_pid>

wait4(-1, 0x7fff23b7b84c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)
wait4(-1, 0x7fff23b7b84c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)
...
и т.д.


Дочерний процесс
strace -vp <child_pid>

#Ожидание запроса
futex(0x7f32d3ae3000, FUTEX_WAIT, 0, NULL

#Поступление запроса,обработка

epoll_wait(7, {{EPOLLIN, {u32=12209800, u64=12209800}}}, 2, 10000) = 1
accept(4, {sa_family=AF_INET, sin_port=htons(35696), sin_addr=inet_addr("127.0.0.1")}, [16]) = 11
futex(0x7faf46972000, FUTEX_WAKE, 1)    = 1
fcntl(11, F_GETFL)                      = 0x2 (flags O_RDWR)
fcntl(11, F_SETFL, O_RDWR|O_NONBLOCK)   = 0
read(11, "GET /phpinfo.php?=PHPE9568F34-D42"..., 8000) = 566
stat("/var/www/site.com/public_html/phpinfo.php", {st_dev=makedev(147, 0), st_ino=5816332, st_mode=S_IFREG|0600, st_nlink=1, st_uid=1000, st_gid=600, st_blksize=4096, st_blocks=8, st_size=18, st_atime=2013/03/06-18:53:58, st_mtime=2009/09/22-17:57:22, st_ctime=2010/12/20-16:30:00}) = 0
open("/var/www/site.com/public_html/.htaccess", O_RDONLY) = 12
fstat(12, {st_dev=makedev(147, 0), st_ino=5823385, st_mode=S_IFREG|0600, st_nlink=1, st_uid=1000, st_gid=600, st_blksize=4096, st_blocks=8, st_size=153, st_atime=2013/03/06-18:53:58, st_mtime=2010/12/23-18:20:37, st_ctime=2010/12/23-18:26:05}) = 0
read(12, "php_value mbstring.func_overload "..., 4096) = 153
read(12, ""..., 4096)                   = 0
close(12)                               = 0
open("/var/www/site.com/public_html/phpinfo.php/.htaccess", O_RDONLY) = -1 ENOTDIR (Not a directory)
rt_sigaction(SIGCHLD, {0x7faf44833820, [CHLD], SA_RESTORER|SA_RESTART, 0x7faf451ff1e0}, {0x7faf44833820, [CHLD], SA_RESTORER|SA_RESTART, 0x7faf451ff1e0}, 8) = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={900, 0}}, NULL) = 0
rt_sigaction(SIGPROF, {0x7faf44879130, [PROF], SA_RESTORER|SA_RESTART, 0x7faf451ff1e0}, {0x7faf44879130, [PROF], SA_RESTORER|SA_RESTART, 0x7faf451ff1e0}, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
writev(11, [{"HTTP/1.1 200 OK\r\nDate: Thu, 07 Ma"..., 171}, {"GIF89ax\0C\0\346j\0\177\202\27097G(%*\314\315\342\241\244\313\323\325\347\262\264"..., 2524}], 2) = 2695
write(8, "site.com 98.34.52.44"..., 257) = 257
shutdown(11, 1 /* send */)              = 0
poll([{fd=11, events=POLLIN}], 1, 2000) = 1 ([{fd=11, revents=POLLIN|POLLHUP}])
read(11, ""..., 512)                    = 0
close(11)                               = 0
read(5, 0x7fffb6fdbbab, 1)              = -1 EAGAIN (Resource temporarily unavailable)

#Ожидание нового запроса
futex(0x7faf46972000, FUTEX_WAIT, 0, NULL

В один момент родительский процесс убивает дочерние процессы (по timout вроде) и создает новые.

select(0, NULL, NULL, NULL, {1, 0})     = ? ERESTARTNOHAND (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
select(0, NULL, NULL, NULL, {0, 742953}) = 0 (Timeout)
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], WNOHANG|WSTOPPED, NULL) = 14481
wait4(-1, 0x7fffbe8854bc, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb1afeeda30) = 29584

С этого момента дочерние процессы все время висият в ожидании запроса.
futex(0x7f32d3ae3000, FUTEX_WAIT, 0, NULL

В родительском процессе я так понимаю постоянное ожидание завершения работы от дочерних процессов (wait4)
wait4(-1, 0x7fff23b7b84c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)
wait4(-1, 0x7fff23b7b84c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)

Для распределения запросов между дочерними процессами в Apache 2 используются мьютексы. Multi Processing Modules (MPM).


Подскажите пожалуйста куда копнуть,чтобы отследить что происходит с запросами и как узнать причну почему дочернему процессу не передается запрос?

Спасибо.

 

atomlab
()

Зависший процесс. Вывод strace.

Форум — Admin

Добрый день. Подскажите пожалуйста куда копать. Есть проблема с зависшим процессом. В результате выполнения php скрипта запускается процесс программы вывода диалогов pinentry. Программе pinentry просто передается один агрумент(пароль),чтобы его она его использовала для шифрования утилитой gnupg. Этот процесс(pinentry) начинает жрать cpu100%.

Вывод strace

#strace -vfp  16325
Постоянно вылят такие системные вызовы
rt_sigaction(SIGTSTP, {0x1, [], SA_RESTORER|SA_RESTART, 0x7f1df305c1e0}, {0x7f1df33b5d50, [], SA_RESTORER|SA_RESTART, 0x7f1df305c1e0}, 8) = 0
poll([{fd=0, events=POLLIN}], 1, 0)     = 1 ([{fd=0, revents=POLLHUP}])
rt_sigaction(SIGTSTP, {0x7f1df33b5d50, [], SA_RESTORER|SA_RESTART, 0x7f1df305c1e0}, NULL, 8) = 0
rt_sigaction(SIGTSTP, {0x1, [], SA_RESTORER|SA_RESTART, 0x7f1df305c1e0}, {0x7f1df33b5d50, [], SA_RESTORER|SA_RESTART, 0x7f1df305c1e0}, 8) = 0
rt_sigaction(SIGTSTP, {0x7f1df33b5d50, [], SA_RESTORER|SA_RESTART, 0x7f1df305c1e0}, NULL, 8) = 0
read(0, ""..., 1)                       = 0

Из этого понял,что системный вызов sigaction посылает процессу сигнал SIGTSTP для приостановки выполнения процесса.

Но приведенный выше блок циклично повторяется в выводе stracer пока не убить процесс вручную.

Вопрос: Как определить,почему процесс не завершается и вообще что происходит?

Дистр: Gentoo

Спасибо.

 

atomlab
()

squid и маршрутизация

Форум — Admin

Стоит squid 3.1.6. Настроен как tproxy. Пока никаких ограничений для теста. Пропускает все.

#no local caching
maximum_object_size 0 KB
minimum_object_size 0 KB
no_cache deny all

http_port 3129 tproxy

http_access allow all

access_log /var/log/squid3/access.log squid

В iptables так перенаправляются запросы.

iptables -t nat -A PREROUTING -i eth3 -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.0.0.1:3129

Запрос прилетает на squid. Дальше запрос улетает на удаленный сайт.В качестве source_ip клиентски ip,потому что tproxy. Обратно ответ идет по другому маршруту напрямую на ip клиента минуя прокси. В логах сквида появляется ошибка с кодом 504.

1355210815.107 182111 33.87.45.66 TCP_MISS/504 4043 GET http://www.site.ru/ - DIRECT/55.66.77.99 text/html

Вопрос. Может ли это быть из-за того,что сквид ждет ответа от сайта. А ответ от сайта улетел по другому маршруту обратно?

Спасибо.

 

atomlab
()

syslog-ng.Часть хостов резолвить по ip,часть нет.Как?

Форум — Admin

Добрый день.

Есть сеть. В ней есть несколько почтовых серверов и сотни свичей и роутеров. Когда логи прилетают от серверов хочу раскидывать по каталогам с доменным именем сервера. Когда логи прилетают от свичей,хочу чтобы в качтсве имени каталога был ip свича. Вот кусок конфига.

/etc/syslog-ng/syslog-ng.conf

options {
        ...
        long_hostnames(off);
        use_fqdn(yes);
        use_dns(yes);
};

...

 #Указываю,что нужно автоматически создавать каталоги и именем устройства из $FULLHOST
destination mail_log{ file("/var/log/servers/$FULLHOST/$DAY-$MONTH-$YEAR.log" create_dirs(yes) owner("log") group("log") dir_owner("log") perm(0640) dir_perm(0750) dir_group("log") ); };

#Указываю,что нужно автоматически создавать каталоги и именем устройства из $HOST. Хотя разницы между $FULLHOST не особо заметил.
destination device_log{ file("/var/log/devices/$HOST/$DAY-$MONTH-$YEAR.log" create_dirs(yes) owner("log") group("log") dir_owner("log") perm(0640) dir_perm(0750) dir_group("log") ); };

#Фильтр для почтовых серверов
filter mail { program ("mail|pop|imap|exim|smtp|dovecot") or facility(mail) and not program ("last|syslog|^$|^[0-9]+$"); };

#Фильтр для цисок всяких и прочего сетевого оборудования
filter device { host ("paradyne|zyxel|voip|catalyst|dialup") or program("^[0-9]+$") or facility(local7) ;};

log { source(net); filter(mail); destination(mail_log); };
log { source(net); filter(device); destination(device_log); };

Если опция use_dns(yes) , то все PTR записи ip адресов разрешаются в DNS и заносятся в переменные $HOST и $FULLHOST. Если use_dns(no),то $HOST и $FULLHOST содержат ip адрес хоста.

Не нашел переменной которая бы всегда содержала только ip адрес хоста. Тогда я бы ее мог использовать в destination.

Как решить данную задачу?

Спасибо.

 ,

atomlab
()

RSS подписка на новые темы