Re: comet бэкенды и location /

Maxim Dounin mdounin на mdounin.ru
Вт Окт 25 12:53:47 UTC 2011


Hello!

On Tue, Oct 25, 2011 at 05:23:13AM -0400, igor.goncharenko wrote:

> Hi!
> 
> Есть у меня несколько comet бэкендов,
> 
> upstream  comet_be  {
>   server  comet_be1 :7045;
>   server  comet_be2 :7045;
>   }
> 
> upstream  main_be  {
>   server  main_be1:80;
>   }
> 
> 
> #root 
> 
>   location /
>   {
>    proxy_pass          http://main_be;
>   }
> 
> 
> #описаны как:
>  
>     location ~* ^/cm-.* {
>            proxy_pass         http://comet_be;
> 
>            server_name_in_redirect off;
>            proxy_redirect off;
>            proxy_set_header Host $host;
>            proxy_set_header X-Real-IP $remote_addr;
>            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
>            proxy_set_header X-Forwarded-Protocol $scheme;
>            proxy_next_upstream   error  timeout;
> 
>            proxy_max_temp_file_size 0;
> 
>            client_max_body_size       10m;
>            client_body_buffer_size    128k;
> 
>            proxy_buffering            off;
>      }
> 
> Так вот. Запрос обрабатывается в  location ~*
> ^/cm-.*, однако, если оба комет сервера
> лежат, запрос после 2-х connection refused,
> уходит на location / чего бы не хотелось (nginx
> 1.0.8).  То-есть, получается что location не
> валидный и nginx использует /. Однако, как
> мне просто отдать клиенту ошибку и не
> пытаться использовать / location?

error_page 502 смотрит куда?

Если конфиг выглядит как-то так (error_page может быть на уровне 
http, не суть важно):

    server {
        ...

        error_page 502 /502.html;

        location / {
            proxy_pass http://main_be;
        }

        location ... {
            proxy_pass http://comet_be;
        }
    }

То при ошибке общения с comet_be будет внутренний редирект на 
/502.html, и он отправится на main_be.  При этом при использовании 
proxy_pass без uri - отправится с тем uri, который был у исходного 
запроса.

Наверное, это всё-таки надо поправить.

Пока workaround такой (note "/" после main_be):

        location / {
            proxy_pass http://main_be/;
        }

Ну либо под 5xx ошибки выделить отдельный location и положить туда 
статику, тоже сработает.  Это, в принципе, в любом случае полезно 
сделать.

Maxim Dounin



Подробная информация о списке рассылки nginx-ru