필요에 따라 무제한 ___.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와 함께 사용해야한다고 생각합니다.