Господа Cygwin'щики
Предупреждаю, в Apache для Cygwin есть один глюк: он странно "отстреливает" ненужных детей. Ниже привожу фрагмент письма, отправленного Тутубалину полторы недели назад.
С уважением
Дмитрий Пашко
---------------------------------------
Про Apache под Cygwin'ом.
Леша, я тут взгромоздил себе RusApache под Cygwin'ом. При установке
я обнаружил пару неприятностей, о которых спешу тебе сообщить.
1. В последней сборке, которая PL30.5 ты потерял каталог src/os/cygwin/
без которого, сам понимаешь, ничего Cygwin'ом собрать не удастся.
В связи с этим тонкий намек: восстановил бы ты историческую справедливость
и добавил оный каталог в свою сборку.
2. Оказалось, что на httpd.apache.org лежит два разных дистрибутива: один
официальный (собственно то, что лежит в downloads), другой... работает.
Проблема в следующем: Apache под Cygwin, в отличие от версии под Win32,
работает на fork'ах, т.е. как в настоящем Unix'е. Только, в отличие от
настоящего Unix'а, под Cygwin'ом как-то странно отрабатывается сигнал
SIGUSR1. А этот сигнал, в частности, используется Apache'ем для завершения
ненужных процессов, находящихся в idle-состоянии. Результат потрясающий:
приходях добрые пользователи и нагружают сервер. На это Apache начинает
плодить новые процессы, дабы обслужить страждущих. Но после того, как
пользователи уходят, Apache-родитель начинает "отстреливать" лишние
процессы в idle, а они, гады, вместо того, чтобы тихо умереть,
зацикливаются и "cъедают" процессор. Не смертельно в общем-то,
но как-то уж очень неаккуратно.
Попытки разобраться с этим привели меня на страницу, на которой
лежал бинарный дистрибутив Apache 1.3.20 под Cygwin:
http://httpd.apache.org/dist/httpd/binaries/cygwin/
Эксперименты с этим дистрибутивом показали, что бага, которую я описал
выше, в ЭТОМ дистрибутиве отсутствует. Сравнение показало, что исходники
отличаются несколькими строками в конфигурации и той самой обработкой
idle-процессов. В общем, после перенесения всех изменений в PL30.5 все
заработало как часы.
Список изменений я выделил отдельный патч (см. ниже), который
рекомендую всем пользователям связки Cygwin + Apache.
Алексей, у меня к тебе просьба: восстанови при случае потерянный каталог и
выложи на сервере этот patch. Думаю он будет полезен не только мне.
Дмитрий Пашко
mailto:d_pashko@xxxxxxxxx
P.S. Еще бы какой-нибудь человек с приличным английским намекнул бы на
www.apache.org, что полезно переносить их же собственные правки в официальный
релиз...
-------------------------------------------
diff -aur ./src/Configure ../apache_1.3.20.bin/src/Configure
--- ./src/Configure Thu May 10 18:04:16 2001
+++ ../apache_1.3.20.bin/src/Configure Tue Jun 12 02:24:36 2001
@@ -840,7 +840,8 @@
OSDIR="os/cygwin"
CFLAGS="$CFLAGS -DCYGWIN"
DEF_WANTHSREGEX=yes
- LIBS="$LIBS -lcrypt"
+ DBM_LIB="-lgdbm"
+ LIBS="$LIBS -lcrypt $DBM_LIB"
;;
*) # default: Catch systems we don't know about
OS='Unknown and unsupported OS'
diff -aur ./src/helpers/binbuild.sh ../apache_1.3.20.bin/src/helpers/binbuild.sh
--- ./src/helpers/binbuild.sh Mon Oct 23 19:48:00 2000
+++ ../apache_1.3.20.bin/src/helpers/binbuild.sh Tue Jun 12 02:33:08 2001
@@ -9,6 +9,8 @@
OS=`src/helpers/GuessOS`
case "x$OS" in
x*390*) CONFIGPARAM="--with-layout=BinaryDistribution --enable-module=most";;
+ *cygwin*) CONFIGPARAM="--with-layout=BinaryDistribution --enable-module=most \
+ --enable-rule=SHARED_CORE --enable-module=so --libexecdir=bin";;
*) CONFIGPARAM="--with-layout=BinaryDistribution --enable-module=most --enable-shared=max";;
esac
APDIR=`pwd`
diff -aur ./src/helpers/install.sh ../apache_1.3.20.bin/src/helpers/install.sh
--- ./src/helpers/install.sh Fri Dec 10 14:03:20 1999
+++ ../apache_1.3.20.bin/src/helpers/install.sh Tue Jun 12 02:24:36 2001
@@ -87,7 +87,11 @@
dst="$dst/`basename $src`"
fi
-# Add a possible extension (such as ".exe") to src and dst
+# Check if we need to add an executable extension (such as ".exe")
+# on specific OS to src and dst
+if [ -f "$src.exe" ]; then
+ ext=".exe"
+fi
src="$src$ext"
dst="$dst$ext"
diff -aur ./src/include/ap_config.h ../apache_1.3.20.bin/src/include/ap_config.h
--- ./src/include/ap_config.h Fri Apr 6 07:13:11 2001
+++ ../apache_1.3.20.bin/src/include/ap_config.h Tue Jun 12 02:24:36 2001
@@ -955,6 +955,12 @@
#define JMP_BUF jmp_buf
#define NO_KILLPG
#define USE_LONGJMP
+#define GDBM_STATIC
+#define HAVE_MMAP 1
+#define USE_MMAP_SCOREBOARD
+#define USE_MMAP_FILES
+#define HAVE_SYSLOG 1
+
#else
/* Unknown system - Edit these to match */
diff -aur ./src/main/http_main.c ../apache_1.3.20.bin/src/main/http_main.c
--- ./src/main/http_main.c Thu Apr 12 21:49:26 2001
+++ ../apache_1.3.20.bin/src/main/http_main.c Tue Jun 12 02:24:36 2001
@@ -4412,6 +4412,20 @@
#endif
static int hold_off_on_exponential_spawning;
+/*
+ * Define the signal that is used to kill off children if idle_count
+ * is greater then ap_daemons_max_free. Usually we will use SIGUSR1
+ * to gracefully shutdown, but unfortunatly some OS will need other
+ * signals to ensure that the child process is terminated and the
+ * scoreboard pool is not growing to infinity. This effect has been
+ * seen at least on Cygwin 1.x. -- Stipe Tolj <tolj@xxxxxxxxxxxxxxxx>
+ */
+#if defined(CYGWIN)
+#define SIG_IDLE_KILL SIGKILL
+#else
+#define SIG_IDLE_KILL SIGUSR1
+#endif
+
static void perform_idle_server_maintenance(void)
{
int i;
@@ -4491,9 +4505,10 @@
if (idle_count > ap_daemons_max_free) {
/* kill off one child... we use SIGUSR1 because that'll cause it to
* shut down gracefully, in case it happened to pick up a request
- * while we were counting
+ * while we were counting. Use the define SIG_IDLE_KILL to reflect
+ * which signal should be used on the specific OS.
*/
- kill(ap_scoreboard_image->parent[to_kill].pid, SIGUSR1);
+ kill(ap_scoreboard_image->parent[to_kill].pid, SIG_IDLE_KILL);
idle_spawn_rate = 1;
}
else if (idle_count < ap_daemons_min_free) {
> -----Original Message-----
> From: Kostenevich Dmitry [mailto:dansoft@xxxxxxxx]
> Sent: Wednesday, August 01, 2001 12:37 PM
> To: apache-rus@xxxxxxxxxxxxx
> Subject: Re: [apache-rus] баг ???
>
>
> с тем, что в apache-rus "вырезана" поддержка cygwin ;-)
>
> оная легко возвращается путём копирования каталога cygwin из apache в
> apache-rus
> путь что-то типа src/os/cygwin (точно не помню) ... у меня
> вроде работало.
> Но особо не тестировалось...
>
> ----- Original Message -----
> From: "Termi 2" <termit@xxxxxxxx>
> To: <apache-rus@xxxxxxxxxxxxx>
> Sent: Wednesday, August 01, 2001 2:17 PM
> Subject: [apache-rus] баг ???
>
>
> > Hello apache-rus,
> >
> > с чем связано нежелание apache_1.3.20rusPL30.5.tar.gz
> собираться под
> > CygWin???
> > в то время как оригинальный apache_1.3.20.tar.gz, как и
> оригинальный
> > с наложенными патчами patches_1.3.20rusPL30.5.tar.gz
> > собирается идеально
> >
> > --
> > Best regards,
> > Termi TNPSviaz system administrator
> > mailto:termit@xxxxxxxx
> >
> >
=============================================================================
= Apache-Rus@xxxxxxxxxxxxx mailing list =
Mail "unsubscribe apache-rus" to majordomo@xxxxxxxxxxxxx if you want to quit.
= Archive avaliable at http://www.lexa.ru/mail-archive =
"Russian Apache" includes software developed
by the Apache Group for use in the Apache HTTP server project
(http://www.apache.org/) See
Apache LICENSE.
Copyright (C) 1995-2001 The Apache Group. All rights reserved.
Copyright (C) 1996 Dm. Kryukov; Copyright (C)
1997-2009 Alex Tutubalin. Design (C) 1998 Max Smolev.