патч для nginx/win32
Добрый день! мы достаточно плотно используем nginx для Windows, запускаем его через назначенное задание (scheduled tasks). Для этого в конфиге надо сделать daemon off и дальше менеджер заданий следит за мастер-процессом, запущенным на терминале. это, кстати, удобнее, чем служба Windows (вообще, назначенные задания более удобны и мы чаще используем их, чем службы). в этом сценарии есть один недостаток, при завершении мастер-процесса, остается запущенный worker-процесс. насколько я понял, в случае Windows это штатная ситуация (при такой работе с процессами, которая используется в nginx), для исправления предлагаю такой патч (сделан для 1.3.14): --- src/os/win32/ngx_process_cycle.c2013-03-26 16:57:20.0 +0600 +++ src/os/win32/ngx_process_cycle.c.new2013-03-26 16:57:00.987341331 +0600 @@ -303,6 +303,8 @@ ngx_console_handler(u_long type) { char *msg; + ngx_cycle_t *cycle; +cycle = (ngx_cycle_t *) ngx_cycle; switch (type) { @@ -316,6 +318,7 @@ case CTRL_CLOSE_EVENT: msg = console closing, exiting; + ngx_terminate_worker_processes(cycle); break; case CTRL_LOGOFF_EVENT: Илья Шипицин ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: патч для nginx/win32
давайте разбираться. если запускать nginx в консоли (это штатный режим, так работают назначенные задания), то завершение задания с точки зрения мастер-процесса выглядит, как CTRL_CLOSE_EVENT в функции-обработчике ngx_console_handler worker-процесс в это время залипает в функции ngx_worker_process_cycle в цикле ev=WaitForMultipleObjects() соответственно, закрытие мастера путем закрывания не приводит к тому, что в данном месте возникает какое-то событие. варианты - либо существенно переделывать логику и протаскивать сюда еще одно событие, либо жестко закрыть worker через ngx_terminate_worker_processes. чем чреват второй вариант ? ну ок, закроются текущие сессии. завершая задание, мы, вероятно, этого и добиваемся. 26 марта 2013 г., 17:27 пользователь Maxim Dounin mdou...@mdounin.ruнаписал: Hello! On Tue, Mar 26, 2013 at 05:03:30PM +0600, Илья Шипицин wrote: Добрый день! мы достаточно плотно используем nginx для Windows, запускаем его через назначенное задание (scheduled tasks). Для этого в конфиге надо сделать daemon off и дальше менеджер заданий следит за мастер-процессом, запущенным на терминале. это, кстати, удобнее, чем служба Windows (вообще, назначенные задания более удобны и мы чаще используем их, чем службы). в этом сценарии есть один недостаток, при завершении мастер-процесса, остается запущенный worker-процесс. насколько я понял, в случае Windows это штатная ситуация (при такой работе с процессами, которая используется в nginx), для исправления предлагаю такой патч (сделан для 1.3.14): --- src/os/win32/ngx_process_cycle.c2013-03-26 16:57:20.0 +0600 +++ src/os/win32/ngx_process_cycle.c.new2013-03-26 16:57:00.987341331 +0600 @@ -303,6 +303,8 @@ ngx_console_handler(u_long type) { char *msg; + ngx_cycle_t *cycle; +cycle = (ngx_cycle_t *) ngx_cycle; switch (type) { @@ -316,6 +318,7 @@ case CTRL_CLOSE_EVENT: msg = console closing, exiting; + ngx_terminate_worker_processes(cycle); break; case CTRL_LOGOFF_EVENT: Звать ngx_terminate_worker_processes() - это не очень хорошая идея, это всё-таки аварийный механизм, и может приводить к нехорошему. Тут имеет смысл как минимум попытаться штатно завершить рабочие процессы. -- Maxim Dounin http://nginx.org/en/donation.html ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: патч для nginx/win32
Hello! On Tue, Mar 26, 2013 at 05:43:21PM +0600, Илья Шипицин wrote: давайте разбираться. если запускать nginx в консоли (это штатный режим, так работают назначенные задания), то завершение задания с точки зрения мастер-процесса выглядит, как CTRL_CLOSE_EVENT в функции-обработчике ngx_console_handler worker-процесс в это время залипает в функции ngx_worker_process_cycle в цикле ev=WaitForMultipleObjects() соответственно, закрытие мастера путем закрывания не приводит к тому, что в данном месте возникает какое-то событие. То, что это плохо - вопросов не вызывает. По Ctrl-C всё должно штатно закрываться, а не висеть вечно. варианты - либо существенно переделывать логику и протаскивать сюда еще одно событие, либо жестко закрыть worker через ngx_terminate_worker_processes. чем чреват второй вариант ? ну ок, закроются текущие сессии. завершая задание, мы, вероятно, этого и добиваемся. Например, могут остаться полусохранённые файлы в кеше/proxy_store - если рабочий процесс прервали в процессе копирования временного файла в целевой каталог. (Документация по TerminateProcess() и различные code checker'ы любят пугать про the state of global data maintained by dynamic-link libraries (DLLs) may be compromised. Но это, насколько я понимаю, в данном случае к nginx'у неприменимо - по крайней мере, в отсутствии сторонних модулей.) 26 марта 2013 г., 17:27 пользователь Maxim Dounin mdou...@mdounin.ruнаписал: Hello! On Tue, Mar 26, 2013 at 05:03:30PM +0600, Илья Шипицин wrote: Добрый день! мы достаточно плотно используем nginx для Windows, запускаем его через назначенное задание (scheduled tasks). Для этого в конфиге надо сделать daemon off и дальше менеджер заданий следит за мастер-процессом, запущенным на терминале. это, кстати, удобнее, чем служба Windows (вообще, назначенные задания более удобны и мы чаще используем их, чем службы). в этом сценарии есть один недостаток, при завершении мастер-процесса, остается запущенный worker-процесс. насколько я понял, в случае Windows это штатная ситуация (при такой работе с процессами, которая используется в nginx), для исправления предлагаю такой патч (сделан для 1.3.14): --- src/os/win32/ngx_process_cycle.c2013-03-26 16:57:20.0 +0600 +++ src/os/win32/ngx_process_cycle.c.new2013-03-26 16:57:00.987341331 +0600 @@ -303,6 +303,8 @@ ngx_console_handler(u_long type) { char *msg; + ngx_cycle_t *cycle; +cycle = (ngx_cycle_t *) ngx_cycle; switch (type) { @@ -316,6 +318,7 @@ case CTRL_CLOSE_EVENT: msg = console closing, exiting; + ngx_terminate_worker_processes(cycle); break; case CTRL_LOGOFF_EVENT: Звать ngx_terminate_worker_processes() - это не очень хорошая идея, это всё-таки аварийный механизм, и может приводить к нехорошему. Тут имеет смысл как минимум попытаться штатно завершить рабочие процессы. -- Maxim Dounin http://nginx.org/en/donation.html ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru -- Maxim Dounin http://nginx.org/en/donation.html ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
nginx as TCP proxy
Коллеги, Пытаюсь использовать nginx-devel-1.3.14 (из портов FreeBSD) как tcp load balancer. Почему-то тест конфига не проходит с сообщением: Performing sanity check on nginx configuration: nginx: [warn] upstream test may not have port 80 in /usr/local/etc/nginx/nginx.conf:34 nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed Что я делаю не так? Заранее спасибо. Полный конфиг приведён ниже. worker_processes 1; events { worker_connections 1024; } tcp { upstream test { # simple round-robin server localhost:783; server murka:783; check interval=3000 rise=2 fall=5 timeout=1000; } server { listen 7783; proxy_pass test ; } } -- Victor Sudakov, VAS4-RIPE, VAS47-RIPN sip:suda...@sibptus.tomsk.ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
nginx-1.3.15
Изменения в nginx 1.3.15 26.03.2013 *) Изменение: открытие и закрытие соединения без отправки в нём каких-либо данных больше не записывается в access_log с кодом ошибки 400. *) Добавление: модуль ngx_http_spdy_module. Спасибо Automattic за спонсирование разработки. *) Добавление: директивы limit_req_status и limit_conn_status. Спасибо Nick Marden. *) Добавление: директива image_filter_interlace. Спасибо Ивану Боброву. *) Добавление: переменная $connections_waiting в модуле ngx_http_stub_status_module. *) Добавление: теперь почтовый прокси-сервер поддерживает IPv6-бэкенды. *) Исправление: при повторной отправке запроса на бэкенд тело запроса могло передаваться неправильно; ошибка появилась в 1.3.9. Спасибо Piotr Sikora. *) Исправление: в директиве client_body_in_file_only; ошибка появилась в 1.3.9. *) Исправление: ответы могли зависать, если использовались подзапросы и при обработке подзапроса происходила DNS-ошибка. Спасибо Lanshun Zhou. *) Исправление: в процедуре учёта использования бэкендов. -- Maxim Dounin http://nginx.org/en/donation.html ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
nginx за nginx
Добрый день. Нужно сделать связку: Nginx + nginx + apache В первом nginx сделал proxy_pass http://ip:80 , сайт работает. Проблема заключается в том что второй nginx видит не мой IP , а IP первого сервера , но апач видит уже мой IP в X-Forwarded-For и X-Real-IP Конфиг на первом nginx: location / { proxy_pass http://ip:80/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP$remote_addr; } Конфиг на втором сервере такой же , кроме ip Posted at Nginx Forum: http://forum.nginx.org/read.php?21,237807,237807#msg-237807 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: nginx за nginx
на первом nginx proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $http_x_forwarded_for; на втором nginx proxy_set_header X-Real-IP $http_x_real_ip; proxy_set_header X-Forwarded-For $http_x_forwarded_for; в апаче (если 2,2) LoadModule rpaf_module modules/mod_rpaf.so RPAFenable On RPAFproxy_ips 127.0.0.1 ваши другие ip через пробел RPAFsethostname Off RPAFheader X-Real-IP в апаче (если 2,4) LoadModule remoteip_module modules/mod_remoteip.so RemoteIPHeader X-Real-IP Работает, проверено. Соблюдать строго по тексту, никаких других строк, как везде в интернете понаписано, не вставлять. Вторник, 26 марта 2013, 11:28 -04:00 от baltazor nginx-fo...@nginx.us: Добрый день. Нужно сделать связку: Nginx + nginx + apache В первом nginx сделал proxy_pass http://ip:80 , сайт работает. Проблема заключается в том что второй nginx видит не мой IP , а IP первого сервера , но апач видит уже мой IP в X-Forwarded-For и X-Real-IP Конфиг на первом nginx: location / { proxy_pass http://ip:80/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP$remote_addr; } Конфиг на втором сервере такой же , кроме ip Posted at Nginx Forum: http://forum.nginx.org/read.php?21,237807,237807#msg-237807 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: nginx за nginx
On Tuesday 26 March 2013 19:45:57 baltazor wrote: Не заработало, т.е. на apache IP показывается тот что нужно , а вот на втором nginx IP в логах показывается сервера А вы соответствующий модуль включили? http://nginx.org/ru/docs/http/ngx_http_realip_module.html -- Валентин Бартенев http://nginx.org/en/donation.html ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: nginx за nginx
Прошу прощения, действительно, думал у вас c Apache проблема. Тогда вам уже дали совет выше: http://nginx.org/ru/docs/http/ngx_http_realip_module.html Вторник, 26 марта 2013, 14:50 -04:00 от baltazor nginx-fo...@nginx.us: Пробовал так, проблема в том что apache видит нужный IP адрес, а вот nginx второй видит IP не мой а IP первого nginx sofiamay Wrote: --- на первом nginx proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $http_x_forwarded_for; на втором nginx proxy_set_header X-Real-IP $http_x_real_ip; proxy_set_header X-Forwarded-For $http_x_forwarded_for; в апаче (если 2,2) LoadModule rpaf_module modules/mod_rpaf.so RPAFenable On RPAFproxy_ips 127.0.0.1 ваши другие ip через пробел RPAFsethostname Off RPAFheader X-Real-IP в апаче (если 2,4) LoadModule remoteip_module modules/mod_remoteip.so RemoteIPHeader X-Real-IP Работает, проверено. Соблюдать строго по тексту, никаких других строк, как везде в интернете понаписано, не вставлять. Вторник, 26 марта 2013, 11:28 -04:00 от baltazor nginx-fo...@nginx.us : Добрый день. Нужно сделать связку: Nginx + nginx + apache В первом nginx сделал proxy_pass http://ip:80 , сайт работает. Проблема заключается в том что второй nginx видит не мой IP , а IP первого сервера , но апач видит уже мой IP в X-Forwarded-For и X-Real-IP Конфиг на первом nginx: location / { proxy_passhttp://ip:80/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP$remote_addr; } Конфиг на втором сервере такой же , кроме ip Posted at Nginx Forum: http://forum.nginx.org/read.php?21,237807,237807#msg-237807 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru Posted at Nginx Forum: http://forum.nginx.org/read.php?21,237807,237817#msg-237817 ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: патч для nginx/win32
вот такой вариант ? --- src/os/win32/ngx_process_cycle.c.orig 2013-03-27 09:53:48.0 +0600 +++ src/os/win32/ngx_process_cycle.c2013-03-27 09:48:56.0 +0600 @@ -303,6 +303,8 @@ ngx_console_handler(u_long type) { char *msg; + ngx_cycle_t *cycle; + cycle = (ngx_cycle_t *) ngx_cycle; switch (type) { @@ -316,6 +318,8 @@ case CTRL_CLOSE_EVENT: msg = console closing, exiting; + ngx_quit = 1; +ngx_quit_worker_processes(cycle, 0); break; case CTRL_LOGOFF_EVENT: 26 марта 2013 г., 18:08 пользователь Maxim Dounin mdou...@mdounin.ruнаписал: Hello! On Tue, Mar 26, 2013 at 05:43:21PM +0600, Илья Шипицин wrote: давайте разбираться. если запускать nginx в консоли (это штатный режим, так работают назначенные задания), то завершение задания с точки зрения мастер-процесса выглядит, как CTRL_CLOSE_EVENT в функции-обработчике ngx_console_handler worker-процесс в это время залипает в функции ngx_worker_process_cycle в цикле ev=WaitForMultipleObjects() соответственно, закрытие мастера путем закрывания не приводит к тому, что в данном месте возникает какое-то событие. То, что это плохо - вопросов не вызывает. По Ctrl-C всё должно штатно закрываться, а не висеть вечно. варианты - либо существенно переделывать логику и протаскивать сюда еще одно событие, либо жестко закрыть worker через ngx_terminate_worker_processes. чем чреват второй вариант ? ну ок, закроются текущие сессии. завершая задание, мы, вероятно, этого и добиваемся. Например, могут остаться полусохранённые файлы в кеше/proxy_store - если рабочий процесс прервали в процессе копирования временного файла в целевой каталог. (Документация по TerminateProcess() и различные code checker'ы любят пугать про the state of global data maintained by dynamic-link libraries (DLLs) may be compromised. Но это, насколько я понимаю, в данном случае к nginx'у неприменимо - по крайней мере, в отсутствии сторонних модулей.) 26 марта 2013 г., 17:27 пользователь Maxim Dounin mdou...@mdounin.ru написал: Hello! On Tue, Mar 26, 2013 at 05:03:30PM +0600, Илья Шипицин wrote: Добрый день! мы достаточно плотно используем nginx для Windows, запускаем его через назначенное задание (scheduled tasks). Для этого в конфиге надо сделать daemon off и дальше менеджер заданий следит за мастер-процессом, запущенным на терминале. это, кстати, удобнее, чем служба Windows (вообще, назначенные задания более удобны и мы чаще используем их, чем службы). в этом сценарии есть один недостаток, при завершении мастер-процесса, остается запущенный worker-процесс. насколько я понял, в случае Windows это штатная ситуация (при такой работе с процессами, которая используется в nginx), для исправления предлагаю такой патч (сделан для 1.3.14): --- src/os/win32/ngx_process_cycle.c2013-03-26 16:57:20.0 +0600 +++ src/os/win32/ngx_process_cycle.c.new2013-03-26 16:57:00.987341331 +0600 @@ -303,6 +303,8 @@ ngx_console_handler(u_long type) { char *msg; + ngx_cycle_t *cycle; +cycle = (ngx_cycle_t *) ngx_cycle; switch (type) { @@ -316,6 +318,7 @@ case CTRL_CLOSE_EVENT: msg = console closing, exiting; + ngx_terminate_worker_processes(cycle); break; case CTRL_LOGOFF_EVENT: Звать ngx_terminate_worker_processes() - это не очень хорошая идея, это всё-таки аварийный механизм, и может приводить к нехорошему. Тут имеет смысл как минимум попытаться штатно завершить рабочие процессы. -- Maxim Dounin http://nginx.org/en/donation.html ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru -- Maxim Dounin http://nginx.org/en/donation.html ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru