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

Регулярное выражение nginx в блоке местоположения?

Итак, я использую Nginx в качестве обратного прокси, и моя текущая конфигурация стала очень длинной, так как у меня около 12 поддоменов, и это число будет продолжать расти. Я ищу способ очистить свою конфигурацию, и я думаю, что нашел способ, но не могу заставить его работать. Вот что я пытаюсь:

server {
  server_name  ~^(.+)\.domain\.com$;
  ssl  on;

  location ~ domain1 {
    proxy_pass  http://192.168.1.50:4040/;
  }

  location ~ domain2 {
    proxy_pass  http://192.168.1.60:4040/;
  }
}

Но это дает мне ошибку, в которой говорится

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except"

И я понимаю, о чем он говорит, но не знаю, как это решить. Если я уберу косую черту в конце proxy_pass директивы, Nginx запустится без ошибок, но ни один из поддоменов не будет работать.

Правильно ли я поступаю? Есть ли способ лучше?

Заранее спасибо!

Как упоминалось в комментариях, лучший способ (самый читаемый и самый быстрый) - вручную настроить каждый домен. Это связано с тем, что NGINX создает статические объекты в памяти, чтобы избежать обработки каждого запроса во время выполнения.

Однако, если вы действительно хотите это сделать (proxy_pass в разные места для разных поддоменов), вы можете сделать это:

Например.

map $http_host $my_upstream {
    default http://192.168.1.1:8080;
    domain1.* http://172.0.0.1:8081;
    domain2.* http://10.0.0.1:80802;
}

server {
    server_name ~(.+)\.domain\.com;

    location / {
        proxy_pass $my_upstream;
    }
}

Обратите внимание, что map должно быть вне серверный блок