Nginx 本地代理-上游通配符?

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不起作用。

答案1

尝试使用地图。例如

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 backend {
    server server1.site.tld;
    server server2.site.tld;
    ...
}

proxy_pass然后从地图上设置您的:

proxy_pass   $backend;

相关内容