如果浏览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;