Caminho da raiz do domínio nginx dinâmico com base no nome do host?

8

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;

}
    
por Xeoncross 11.12.2012 / 22:09

5 respostas

10

Por que não usar apenas:

server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;
    
por 19.12.2012 / 21:55
11

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
}
    
por 20.12.2012 / 07:07
3

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.

    
por 05.09.2015 / 13:57
0

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 .

    
por 20.12.2012 / 03:35
0

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).

    
por 12.12.2016 / 12:09