upstream keepalive + Host override : problem?

Maxim Dounin mdounin at mdounin.ru
Mon Apr 29 10:59:50 UTC 2013


Hello!

On Mon, Apr 29, 2013 at 02:53:19PM +0400, Azarov Alexander wrote:

> Добрый день,
> 
> Конфиг у меня выглядит вот так:
> 
> upstream playapp {
>   server …:9000;
>   keepalive 16;
> }
> 
> server {
>   listen ... ssl;
>   server_name …;
> 
>   proxy_set_header Host $server_name;
> 
>   location / {
>     limit_conn byConn 14;
>     limit_req zone=byReq burst=50;
> 
>     proxy_pass http://playapp;
>     proxy_http_version 1.1;
>     proxy_set_header Connection "";
>   }
> }
> 
> Проблема:
> 
> 2013/04/29 14:19:02 [debug] 21900#0: *1013606439 http proxy header:
> "GET /pic/2034583 HTTP/1.1
> Host: playapp
> Cache-Control: max-age=0
> Pragma: no-cache
> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31
> 
> Т.е. на бэкенд уходит "Host: playapp" вместо "Host: 
> $server_name". Если убрать proxy_http_version и proxy_set_header 
> Connection, все нормализуется, бэкенд видит "Host: $server_name"

http://nginx.org/r/proxy_set_header/ru:

: Директивы наследуются с предыдущего уровня при условии, что на 
: данном уровне не описаны свои директивы proxy_set_header.

Т.е. правильно будет написать так:

    server {
        ...
        proxy_set_header Host $server_name;

        location / {
            ...
            proxy_set_header Host $server_name;
            proxy_set_header Connection "";
        }
    }

или так:

    server {
        ...
        proxy_set_header Host $server_name;
        proxy_set_header Connection "";

        location / {
            ...
        }
    }

-- 
Maxim Dounin
http://nginx.org/en/donation.html



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