Если просматриваете 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;