Proxy local Nginx - curinga upstream?

1

Se estiver navegando web.dev/test2 , ele procurará /var/www/testsite/test2.local/public . Tudo feito por meio de proxy local.

Abaixo, reescreva a execução perfeitamente para test2 :

upstream site.local {
    server 127.0.0.1;
}
server {
    server_name web.dev;
    root   /var/www/web.dev/public;
    index  index.php;
    try_files $uri $uri/ /index.php?$args;
    location ~ \.php$ {
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
    }
    location /test2 {
        proxy_pass http://site.local/;
    }
}
server {
    server_name site.local;
    root /var/www/testsite/test2.local/public;
    index  index.php;
    try_files $uri $uri/ /index.php?$args;
    location ~ \.php$ {
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
    }
}

Tenho centenas de /test3 , /test4 e assim por diante. Não quero escrever a diretiva server individual para cada uma delas porque será muito longa e tediosa.

Abaixo está o que eu fiz até agora para criar curinga:

upstream *.local {
    server 127.0.0.1;
}
server {
    server_name web.dev;
    root   /var/www/web.dev/public;
    index  index.php;
    try_files $uri $uri/ /index.php?$args;
    location ~ \.php$ {
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
    }
    location /(?<mytestsite>[^/]+) {
        proxy_pass http://$mytestsite.local/;
    }
}
server {
    server_name *.local;
    root /var/www/testsite/$host/public;
    index  index.php;
    try_files $uri $uri/ /index.php?$args;
    location ~ \.php$ {
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
    }
}

Não vai funcionar. upstream não aceita curinga. Use regex .* on upstream também não funciona.

    
por Isak Pontus 30.11.2017 / 08:34

1 resposta

0

Tente usar um mapa. Algo como

map $http_host $backend {
   host1 backend1;
   host2 backend2;
   default backend1;
}

upstream backend {
    server $backend.site.tld # nginx won't recognise .local unless in DNS
}

pode funcionar. Não posso garantir isso, pois não posso testá-lo no momento, mas é a rota geral para trabalhar com variáveis em um nível baixo.

Atualizado: nginx precisa saber sobre seus backends na inicialização, então você os define na sua diretiva upstream:

upstream backend {
    server server1.site.tld;
    server server2.site.tld;
    ...
}

Em seguida, defina seu proxy_pass no mapa:

proxy_pass   $backend;
    
por 30.11.2017 / 08:59