map uri fastcgi_pass

Валентин Бартенев vbart at nginx.com
Wed Sep 17 08:47:05 UTC 2014


On Wednesday 17 September 2014 04:25:08 Nikolay wrote:
> Здравствуйте, есть задача: перенаправить запрос c uri вида
> /some/path/03_dfsakfa на бекенд server03.domain.tld с номером 03(берется из
> uri).
> Все остальные запросы надо отправлять на upstream fpm.
> 
> OS Debian 7.6
> nginx version: nginx/1.2.1
> 
> При перезапуске nginx получаю ошибку:
> Restarting nginx: nginx: [emerg] invalid number of the map parameters in
> /etc/nginx/nginx.conf
> 
> Подскажите, что я делаю неправильно, где ошибка?
> 
> nginx.conf
> 
> http {
> ...
> ...
>         upstream fpm {
>                 server 1.1.1.1:9001;
>                 server 2.2.2.2:9001;
>         }
> 
>         map $uri $back {
>         default "fpm";
>         ~*"/some/path/(?<key>^\d{2})$(.+)$" server$key\.domain\.tld;
> 
>         }
[..]

Только в этом месте их сразу три:

 1. /some/path/(?<key>^\d{2})$(.+)$
    - не похоже на правильное регулярное выражение.

    Вероятно хотелось этого:
    ^/some/path/(?<key>\d{2})_.+$

 2. Чтобы экранировать строку с { } - необходимо её всю
    брать в кавычки:

    "~*^/some/path/(?<key>\d{2})_.+$"

    а не только часть.

 3. Внутри блока map во второй части может находится
    только одна переменная, а не строка:

    server$key\.domain\.tld

    Читайте http://nginx.org/r/map/ru


А самое главное, это чрезвычайно странный способ решения проблемы.

Правильнее будет как-то так:

  location ~* "^/some/path/(?<key>\d{2})_.+$" {
      fastcgi_pass  server$key\.domain\.tld;
      ...
  }

--
Валентин Бартенев


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