Назад | Перейти на главную страницу

Директива Nginx map соответствует только по умолчанию

Я использую директиву Nginx map для маршрутизации пользователей на стабильные или бета-серверы в зависимости от значения настраиваемого заголовка http. Однако Nginx будет соответствовать только значению по умолчанию, даже если я подтвердил, что заголовок - «ТЕСТ».

worker_processes  2;

events {
    worker_connections  1024;
}


http {
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$http_x_cp_client_class" $upstream';

access_log  logs/access.log  main;

upstream dataserver_stable {
    server localhost:8081;
}

upstream dataserver_beta {
    server localhost:8082 fail_timeout=1m;
}

map $http_x-cp-client-class $upstream {
    TEST "dataserver_beta";
    # STABLE "dataserver_stable"; technically redundant I think
    default "dataserver_stable";
}

server {
    listen       81;
    server_name  localhost;

    location / {
            proxy_set_header Host $host;
            add_header My-Upstream $upstream;

            proxy_pass       http://$upstream;
            proxy_connect_timeout 5s;
            proxy_read_timeout 10s;
    }
}
}

Заголовки:

Req:

GET /pages/widgets/calendar/tradeDateCalendar.tpl.html HTTP/1.1
Host: ny7wlpmurray:81
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
X-CP-Client-Class: TEST
Referer: http://ny7wlpmurray:81/pages/dashboard/dashboard.html
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: _ga=GA1.1.1629631386.1511812518; _gid=GA1.1.892280347.1511812518

Res:

HTTP/1.1 200
Server: nginx/1.12.2
Date: Wed, 29 Nov 2017 21:33:54 GMT
Content-Type: text/html
Content-Length: 594
Connection: keep-alive
Accept-Ranges: bytes
ETag: W/"594-1511969617175"
Last-Modified: Wed, 29 Nov 2017 15:33:37 GMT
My-Upstream: dataserver_stable

Я что-то не так написал? Я пробовал ТЕСТ, ~ ТЕСТ, "ТЕСТ" и "~ ТЕСТ", ни один из них не работал.

При преобразовании заголовков HTTP-запросов в имена переменных nginx будет преобразовать дефисы в символы подчеркивания. Таким образом, переменная, представляющая X-CP-Client-Class заголовок будет $http_x_cp_client_class.

Это говорит о том, что ваш map следует объявить следующим образом:

map $http_x_cp_client_class $upstream {