Por que não usar apenas:
server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;
Eu estou tentando configurar meu servidor nginx / PHP de desenvolvimento com uma configuração vhost básica / master-catch para que eu possa criar% co_de ilimitado % domínios conforme necessário.
server {
listen 80;
index index.html index.htm index.php;
# Test 1
server_name ~^(.+)\.frameworks\.loc$;
set $file_path $1;
root /var/www/frameworks/$file_path/public;
include /etc/nginx/php.conf;
}
No entanto, o nginx responde com um erro 404 para esta configuração. Eu sei que o nginx e o PHP estão funcionando e têm permissão porque o ___.framework.loc
config que estou usando funciona bem.
server {
listen 80 default;
server_name localhost;
root /var/www/localhost;
index index.html index.htm index.php;
include /etc/nginx/php.conf;
}
O que devo verificar para encontrar o problema? Aqui está uma cópia do php.conf que ambos estão carregando.
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_index index.php;
# Keep these parameters for compatibility with old PHP scripts using them.
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Some default config
fastcgi_connect_timeout 20;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_pass 127.0.0.1:9000;
}
Nginx config não é um programa, é uma declaração. Quando você está usando config assim:
server {
server_name ~^(.+)\.frameworks\.loc$;
...
set $file_path $1;
root /var/www/frameworks/$file_path/public;
}
Não há como garantir que sua diretiva set
seja executada antes de root
.
Mas há um truque com a diretiva map
que gosto de usar. Depende do fato de que map
é avaliado antes de location
http {
map $http_host $rootpath {
~^(.?<mypath>+)\.frameworks\.loc$ $mypath;
default / ;
}
....
root /var/www/frameworks/$rootpath
}
Além da grande resposta do DukeLion , precisei mudar de linha
~^(.?<mypath>+)\.frameworks\.loc$ $mypath;
para
~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;
no meu arquivo /etc/nginx/nginx.conf
como sugerido aqui .
Adicionando
root /var/www/frameworks/$rootpath
em /etc/nginx/sites-available/default
funcionou bem depois disso.
Talvez você possa olhar para o lighttpd também. Ele tem suporte para exatamente o que você está perguntando aqui. É chamar mod_evhost .
Ativar o evhost
Adicione as seguintes linhas no seu lighttpd.conf. Se você estiver usando a distribuição base Debian / Ubuntu, apenas faça um link ou copie de /etc/lighttpd/conf-available/10-evhost.conf
para /etc/lighttpd/conf-enabled/
.
# http://redmine.lighttpd.net/wiki/1/Docs:ModEVhost server.modules += ( "mod_evhost" ) evhost.path-pattern = "/home/www/%_"
O %_
(curinga) em evhost.path-patten significa usar o nome de domínio completo (por exemplo, www.example.com). Uma solicitação para www.example.com direcionará automaticamente para a raiz do documento /home/www/www.example.com/
.
Adicionar site adicional é tão fácil quanto criar outro diretório em /home/www
com nome de domínio completo. Nenhuma mudança no arquivo de configuração do Lighttpd.
Existem outros curingas e podem ser usados para criar a estrutura de diretórios. Eles são como segue
%% => % sign %0 => domain name + tld %1 => tld %2 => domain name without tld %3 => subdomain 1 name %4 => subdomain 2 name %_ => full domain name
As informações detalhadas são aqui .
PS: A ativação do PHP também é fácil se você estiver na plataforma debian / ubuntu. Basta ativar 10-fastcgi.conf
e 15-fastcgi-php.conf
.
O NGINX usa a biblioteca de expressão regular PCRE.
A partir do NGINX v0.8.25 server_name
directive permite capturas nomeadas .
Named captures in regular expressions create variables (0.8.25) that can later be used in other directives While using named parenthesis, NGINX automatically sets a variable for each named parenthesis, during server names evaluation (I guess).
Eu uso o seguinte trecho para "cercar" os ambientes dos desenvolvedores. «Utilizador» refere-se ao seu nome de utilizador e «proj» ao projecto em que trabalham:
# ...
server_name ~^(?<user>[^.]+)\.(?<proj>[^.]+).dev.local-server.com;
root /home/$user/www/$proj;
# ...
Observe que a configuração do nginx é declarativa e, como tal, as declarações estáticas podem sempre ser mais rápidas em comparação com valores e variáveis calculados em tempo de execução. A avaliação de expressões regulares é relativamente cara, acho que tem que ser usada com parcimônia em ambientes carregados (produção).
Tags php nginx virtualhost