Re: Конфигурация nginx: proxy_pass, include в if, именованные локации, auth_basic
Denis F. Latypoff
denis at gostats.ru
Tue Nov 27 14:16:59 MSK 2007
Hello Анатолий,
Tuesday, November 27, 2007, 4:41:11 PM, you wrote:
> Приветствую!
>
> Proxy_pass не понимает переменные, ни в качестве всего URI, ни в качестве порта.
>
> Пример:
> map $http_host $my_port {
> game.rnd.example.com 8001;
> admin.rnd.example.com 8081;
>
> game.msk.example.com 8004;
> admin.msk.example.com 8084;
>
> game.test.example.com 8003;
> admin.test.example.com 8083;
>
> game.new.example.com 8002;
> admin.new.example.com 8082;
> }
>
> location / {
> if ($my_port) {
> proxy_pass http://127.0.0.1:$my_port;
> break;
> }
> }
>
> Что не так?
>
>
> Решил обойти проблему.
> location / {
> if ($http_host ~ rnd\.example\.com$) {
> include /path/rnd.example.com/nginx.conf;
> }
> ...
> }
> Так не работает, пишет, что include не определен в if.
>
> Попробовал через именованный локации, только не знаю как их вызвать.
> Вызвал через error_page, но только GET запросы попадают через error_page на именованную локацию, остальные – ошибка 405.
> location / {
> if ($http_host ~ rnd\.example\.com$) {
> error_page 404 = @rnd;
> }
> ...
> }
> location @rnd {
> include /path/rnd.example.com/nginx.conf;
> }
> …
>
> В итоге написал в лоб, но решение мне не нравится:
>
> if ($http_host ~ ^game\.rnd\.example\.com$) {
> proxy_pass http://127.0.0.1:8001;
> break;
> }
> if ($http_host ~ ^admin\.rnd\.example\.com$) {
> proxy_pass http://127.0.0.1:8081;
> break;
> }
>
> …
>
> if ($http_host ~ ^game\.test\.example\.com$) {
> proxy_pass http://127.0.0.1:8003;
> break;
> }
> if ($http_host ~ ^admin\.test\.example\.com$) {
> proxy_pass http://127.0.0.1:8083;
> break;
> }
>
> Плюс auth_basic использовать в if нельзя, т.е. не получится сделать для каждого субдомена свою авторизацию, только общую.
>
>
> Что посоветуете?
посоветую всё хозяйтво разруливать server'ами
server {
listen xxx.xxx.xxx.xxx:8001;
server_name game.rnd.example.com
location / {
proxy_pass http://127.0.0.1:8001;
}
}
server {
listen xxx.xxx.xxx.xxx:8081;
server_name game.rnd.example.com
location / {
proxy_pass http://127.0.0.1:8081;
}
}
server {
listen xxx.xxx.xxx.xxx:8004;
server_name game.msk.example.com;
location / {
proxy_pass http://127.0.0.1:8004;
}
}
...
ни одного if'а :)
можно auth_basic для каждого из субдоменов свой прописать.
--
Best regards,
Denis mailto:denis at gostats.ru
More information about the nginx-ru
mailing list