LINUX.ORG.RU
ФорумAdmin

Фигня какая-то с порядком серверов в nginx

 ,


0

1

Есть три фрагмента nginx-конфигов:

# 1

server {
    server_name service1.domain.tld;

    location / {

        proxy_pass        http://127.0.0.1:8888;
        proxy_http_version  1.1;
        proxy_set_header    Host        $host;
        proxy_set_header    X-Real-IP   $remote_addr;
        if_modified_since   before;

        proxy_read_timeout  120s;
        proxy_send_timeout  120s;

        access_log        off;
    }
}

# 2 

server {
    server_name service2.domain.tld;

    location / {

        proxy_pass        http://127.0.0.1:48080;
        proxy_http_version  1.1;
        proxy_set_header    Host        $host;
        proxy_set_header    X-Real-IP   $remote_addr;
        if_modified_since   before;

        proxy_read_timeout  120s;
        proxy_send_timeout  120s;

        access_log        off;
    }
}

# 3

server {
    server_name *.domain.tld;

    location / {
        proxy_pass        http://comtainer.lxc;
        proxy_http_version  1.1;
        proxy_set_header    Host        $host;
        proxy_set_header    X-Real-IP   $remote_addr;
        if_modified_since   before;

        proxy_read_timeout  120s;
        proxy_send_timeout  120s;

        access_log        off;
    }
}

server {
    server_name domain.tld;
    rewrite ^(.*) http://www.domain.tld$1 permanent;
    access_log      off;
}

Т.е. логика простая — для двух конкретных доменных имён проксируем запросы к двум сервисам, а всё остальное переадресуем в LXC-контейнер.

Эти куски раскиданы по файлам, но порядок их загрузки такой, как указано выше.

Так вот, веселье.

1. Сервис 1 работает всегда.

2. Сервис 2 вызывается только когда отключен фрагмент # 3 с прямым обращением к LXC-контейнеру. Если включен код проксирования к контейнеру, то вместо сервиса 2 отдаётся запрос к контейнеру.

3. Какое-то время назад всё работало в этой конфигурации. Не скажу точно, когда, но неделю или две назад было всё ок. Но бинарник nginx последний раз модифицировался 30 апреля. Так что с обновлением это не связано.

Есть мысли, куда копать? Я бы ещё понял, если бы nginx вопреки заявленному порядку обработки server_name грузил бы сперва wildcards. Но нет, service 1 работает корректно :-/

★★★★★

Лучше сделай так:

# 1
server {
    server_name service1.domain.tld;
    # ...
}

# 2
server {
    server_name service2.domain.tld;
    # ...
}

# 3
server {
    server_name www.domain.tld;
    # ...
}

server {
    server_name .domain.tld;
    return 301 $schema://www.domain.tld$request_uri;
}
beastie ★★★★★
()
Ответ на: комментарий от beastie

server_name .domain.tld;
return 301 $schema://www.domain.tld$request_uri;

Не-не, так нельзя :) *.domain.tld — это реально разные домены разных проектов, а не алиас для www. Просто различает их уже контейнер.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Ещё, попробуй поменять везде

proxy_set_header    Host        $host;
на
proxy_set_header    Host        $http_host;
Ибо: $host — это то, что определено в конфиге (первая запись), $http_host — то, что прилетело с запросом. В случае wildcard хостов это важно.

Может из-за этого у тебя бекенд с ума сходит.

PS: вот тебе мой 1000% рабочий proxy_params

proxy_set_header Host $http_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-Proto $scheme;
И делаешь везде вместо proxy_set_...
include proxy_params;

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 3)
Ответ на: комментарий от beastie

Попробую, но с $host работает уже много лет на десятке машин и многих десятках виртхостах :-/

KRoN73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.