Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: worker process ... exited on signal 25
Alexander Yurchik wrote:
Настроен nginx с апачем в качестве бекэнда для обработки динамики. Все
работало отлично, пока вдруг не перестали открываться страницы сайта.
в логах нгинкса куча ошибок вида
2008/05/30 17:10:36 [alert] 20078#0: worker process 21910
в логах апача ничего подозрительного не нашел.
Что странно - создал файл php с вызовом phpinfo() и больше ничего. Так вот
вывод из phpinfo отдается не полностью а примерно первых 20%. Если обращаться
через server.com:8080/file.php - то отдается все без проблем. То есть апач
обрабатывает все корректно, но почему-то обрывается связь между апачем и
нгинксом.
Ну и эти ошибки в логах нгинкса....
Похоже включена буферизация ответов бакэнда (proxy_buffering on) и nginx
натыкается на RLIMIT_FSIZE, когда пытается записать ответ на диск.
phpinfo() как раз достаточно длинный.
Варианты решения:
1) Отключить буферизацию (proxy_buffering off)
2) Попытаться установить RLIMIT_FSIZE из шелла перед
запуском: ulimit -f unlimited (не всегда будет работать)
3) Попытаться использовать пачт из аттача, который вводит новую
директиву worker_rlimit_fsize аналогичную директиве worker_rlimit_core.
Ещё хотелось бы узнать какая ОС? У меня такой эффект проявлялся при
аплоадах то ли на 6-й убунте, то ли на SuSE 8.2 (не помню точно).
--
Regards,
Valery Kholodkov
diff -Naur nginx-0.7.1/src/core/nginx.c nginx-0.7.1-mine/src/core/nginx.c
--- nginx-0.7.1/src/core/nginx.c 2008-05-22 14:09:41.000000000 +0200
+++ nginx-0.7.1-mine/src/core/nginx.c 2008-05-30 16:47:52.000000000 +0200
@@ -115,6 +115,13 @@
offsetof(ngx_core_conf_t, rlimit_core),
NULL },
+ { ngx_string("worker_rlimit_fsize"),
+ NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_size_slot,
+ 0,
+ offsetof(ngx_core_conf_t, rlimit_fsize),
+ NULL },
+
{ ngx_string("worker_rlimit_sigpending"),
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
ngx_conf_set_num_slot,
@@ -733,6 +740,7 @@
ccf->rlimit_nofile = NGX_CONF_UNSET;
ccf->rlimit_core = NGX_CONF_UNSET_SIZE;
+ ccf->rlimit_fsize = NGX_CONF_UNSET_SIZE;
ccf->rlimit_sigpending = NGX_CONF_UNSET;
ccf->user = (ngx_uid_t) NGX_CONF_UNSET_UINT;
diff -Naur nginx-0.7.1/src/core/ngx_cycle.h
nginx-0.7.1-mine/src/core/ngx_cycle.h
--- nginx-0.7.1/src/core/ngx_cycle.h 2008-05-16 16:39:06.000000000 +0200
+++ nginx-0.7.1-mine/src/core/ngx_cycle.h 2008-05-30 16:48:37.000000000
+0200
@@ -78,6 +78,7 @@
ngx_int_t rlimit_nofile;
ngx_int_t rlimit_sigpending;
size_t rlimit_core;
+ size_t rlimit_fsize;
int priority;
diff -Naur nginx-0.7.1/src/os/unix/ngx_process_cycle.c
nginx-0.7.1-mine/src/os/unix/ngx_process_cycle.c
--- nginx-0.7.1/src/os/unix/ngx_process_cycle.c 2008-05-25 20:27:38.000000000
+0200
+++ nginx-0.7.1-mine/src/os/unix/ngx_process_cycle.c 2008-05-30
16:54:30.000000000 +0200
@@ -841,6 +841,17 @@
}
}
+ if (ccf->rlimit_fsize != NGX_CONF_UNSET_SIZE) {
+ rlmt.rlim_cur = (rlim_t) ccf->rlimit_fsize;
+ rlmt.rlim_max = (rlim_t) ccf->rlimit_fsize;
+
+ if (setrlimit(RLIMIT_FSIZE, &rlmt) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+ "setrlimit(RLIMIT_FSIZE, %i) failed",
+ ccf->rlimit_fsize);
+ }
+ }
+
#ifdef RLIMIT_SIGPENDING
if (ccf->rlimit_sigpending != NGX_CONF_UNSET) {
rlmt.rlim_cur = (rlim_t) ccf->rlimit_sigpending;
|