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

Локальный прокси-сервер Nginx - подстановочный знак восходящего потока?

Если просматриваете web.dev/test2, он будет смотреть в /var/www/testsite/test2.local/public. Все через локальный прокси.

Ниже переписан отлично работает для 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;
    }
}

У меня сотни /test3, /test4, и так далее. Я не хочу писать индивидуально server директива для каждого из них, потому что это будет слишком долго и утомительно.

Вот что я сделал до сих пор, чтобы использовать подстановочные знаки:

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;
    }
}

Это не сработает. upstream не принимает подстановочные знаки. Использовать регулярное выражение .* на upstream тоже не работает.

Попробуйте использовать карту. Что-то вроде

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

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

может работать. Я не могу этого гарантировать, так как пока не могу протестировать, но это общий способ работы с переменными на низком уровне.

Обновлено: nginx должен знать о своих бэкэндах при запуске, поэтому вы определяете их в своей директиве upstream:

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

Затем установите свой proxy_pass с карты:

proxy_pass   $backend;