호스트 이름을 기반으로 한 동적 nginx 도메인 루트 경로?

필요에 따라 무제한 ___.framework.loc도메인만들 수 있도록 기본 master / catch-all vhost 구성으로 개발 nginx / PHP 서버를 설정하려고 합니다.

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;
}

그러나 nginx는이 설정에 대해 404 오류로 응답합니다. nginx와 PHP가 작동하고 있으며 사용중인 localhost구성 이 제대로 작동하기 때문에 권한 이 있습니다.

server {
        listen 80 default;
        server_name localhost;
        root /var/www/localhost;
        index index.html index.htm index.php;

        include /etc/nginx/php.conf;
}

문제를 찾기 위해 무엇을 확인해야합니까? 다음은 둘 다로드하는 php.conf의 사본입니다.

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;

}


답변

왜 사용하지 않습니까?

server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;

답변

Nginx 설정은 프로그램이 아니며 선언입니다. 다음과 같이 구성을 사용하는 경우 :

server {
        server_name ~^(.+)\.frameworks\.loc$;
        ...
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;
}

set지시문이 전에 실행 되도록 할 방법이 없습니다 root.

그러나 map내가 사용하고 싶은 지시문 에는 속임수가 있습니다. map이전에 평가 된 사실에 의존location

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}

답변

위대한 DukeLion의 답변 외에도 줄을 바꿔야했습니다.

~^(.?<mypath>+)\.frameworks\.loc$ $mypath;

~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;

여기에/etc/nginx/nginx.conf 제안 된대로 내 파일에 .

첨가

root /var/www/frameworks/$rootpath

/etc/nginx/sites-available/default그 후 벌금을했다.


답변

어쩌면 당신은 lighttpd를 볼 수도 있습니다. 여기에 정확히 무엇을 요구하는지에 대한 지원 기능이 내장되어 있습니다. 그것은 전화입니다 mod_evhost .

evhost 활성화

lighttpd.conf에 다음 줄을 추가하십시오. 데비안 / 우분투 기본 배포판을 사용하는 경우 소프트 링크 또는에서 /etc/lighttpd/conf-available/10-evhost.conf로 복사하십시오 /etc/lighttpd/conf-enabled/.

    # http://redmine.lighttpd.net/wiki/1/Docs:ModEVhost
    server.modules + = ( "mod_evhost")
    evhost.path-pattern = "/ home / www / % _"

%_evhost.path-patten 의 (와일드 카드)는 전체 도메인 이름 (예 : www.example.com)을 사용함을 의미합니다. www.example.com에 대한 요청은 자동으로 document-root로 연결 /home/www/www.example.com/됩니다.

/home/www전체 도메인 이름으로 다른 디렉토리를 만드는 것만 큼 사이트를 추가하는 것은 쉽습니다 . Lighttpd 구성 파일을 변경하지 않았습니다.

다른 와일드 카드가 있으며 디렉토리 구조를 빌드하는 데 사용할 수 있습니다. 그들은 다음과 같습니다

    %% => % 부호
    % 0 => 도메인 이름 + tld
    % 1 => tld
    % 2 => tld가없는 도메인 이름
    % 3 => 하위 도메인 1 이름
    % 4 => 하위 도메인 2 이름
    % _ => 전체 도메인 이름

자세한 정보는 여기에 있습니다 .

추신 : 데비안 / 우분투 플랫폼을 사용하는 경우 PHP를 사용하는 것도 쉽습니다. 10-fastcgi.conf과를 활성화하십시오 15-fastcgi-php.conf.


답변

NGINX는 PCRE 정규식 라이브러리를 사용합니다.
NGINX v0.8.25부터 server_name지시문은 명명 된 캡처를 허용 합니다 .

정규식의 명명 된 캡처 는 나중에 다른 지시문에서 사용할 수있는 변수 ( 0.8.25 )를 만듭니다. 명명 된 괄호를 사용하는 동안 NGINX는 서버 이름을 평가하는 동안 명명 된 각 괄호에 대한 변수를 자동으로 설정합니다 (추정).

다음 스 니펫을 사용하여 개발자 환경을 “울타리”합니다. «user»는 자신의 사용자 이름과«proj»가 작업하는 프로젝트를 나타냅니다.

# ...
server_name ~^(?<user>[^.]+)\.(?<proj>[^.]+).dev.local-server.com;
root /home/$user/www/$proj;
# ...

nginx 구성은 선언적이므로 정적 선언은 런타임 계산 값 및 변수에 비해 항상 빠를 수 있습니다. 정규 표현식 평가는 상대적으로 비용이 많이 들기 때문에로드가 많은 (생산) 환경에서 parsimony와 함께 사용해야한다고 생각합니다.