патч для nginx/win32

2013-03-26 Пенетрантность Илья Шипицин
Добрый день!

мы достаточно плотно используем 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

2013-03-26 Пенетрантность Илья Шипицин
давайте разбираться. если запускать 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

2013-03-26 Пенетрантность Maxim Dounin
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

2013-03-26 Пенетрантность Victor Sudakov
Коллеги,

Пытаюсь использовать 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

2013-03-26 Пенетрантность Maxim Dounin
Изменения в 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

2013-03-26 Пенетрантность baltazor
Добрый день. Нужно сделать связку:
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

2013-03-26 Пенетрантность sdfasdf asdfasdf
 на первом 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

2013-03-26 Пенетрантность Валентин Бартенев
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

2013-03-26 Пенетрантность sdfasdf asdfasdf
 Прошу прощения, действительно, думал у вас 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

2013-03-26 Пенетрантность Илья Шипицин
вот такой вариант ?

--- 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