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