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


11

필요에 따라 무제한 ___.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;

}

답변:


12

왜 사용하지 않습니까?

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

이것은 내가 찾던 것입니다!
Xeoncross

13

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
}

이것은 재미있을 것 같습니다, 나는 지금 맵으로 더 많은 것을 할 계획입니다. 또한 구성 파일이 선형 방식으로 처리되지 않았다는 것을 알지 못했습니다.
Xeoncross

$mypath여기서 요점이 뭐야? 어디서나 사용되지 않습니다.
kodeart 2016 년

@kodeart는 $mypath정규식의 결과 그룹 ~^(.?<mypath>+)\.frameworks\.loc$$rootpath전체지도 트릭에 대한 결과입니다.
Fabio Montefuscolo 2016 년

4

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

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

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

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

첨가

root /var/www/frameworks/$rootpath

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


0

어쩌면 당신은 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.


0

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와 함께 사용해야한다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.