호스트를 기반으로 nginx 루트 경로를 설정하는 방법

호스트를 기반으로 nginx 루트 경로를 설정하는 방법

nginx에서 특정 루트 경로를 사용하도록 방문자 호스트를 어떻게 설정할 수 있습니까?

IP 1.1.1.1 방문자는 다음을 사용합니다.

root /srv/web1

다른 모든 방문자는

root /srv/web2

답변1

이 질문은 약간의 연구를 수행하고 문서를 읽어보면 쉽게 대답할 수 있지만(가급적이면초보자 가이드그런 다음nginx가 요청을 처리하는 방법) 어쨌든 대답하겠습니다.

두 개 이상의 네트워크 인터페이스와 IP 주소가 있는 서버가 있다고 가정합니다. 여기서 1.1.1.1 주소는 하나의 인터페이스에 할당되고 다른 주소는 해당 인터페이스에 할당됩니다.

Nginx는 이와 관련하여 매우 유연합니다. 실제로 servernginx가 다른 서버 블록과 일치할 수 없을 때 기본값으로 사용되는 블록이 항상 있습니다. 이는 파일의 server_name첫 번째 블록이거나 해당 지시문 에 지정된 블록입니다. . 그리고 그걸 기억해serverdefault_serverlistenlisten지시문 에 IP를 지정할 수 있습니다.

이는 귀하의 경우 다음을 의미합니다.

server {
    listen 80 default_server;
    root /srv/web2;
    [...]
}
server {
    listen 1.1.1.1:80;
    root /srv/web1;
    [...]
}

위의 예에서 볼 수 있듯이 첫 번째 server블록은 포트 80의 모든 인터페이스를 수신하는 반면 두 번째 블록은 포트 80의 1.1.1.1 인터페이스만 수신합니다. 따라서 1.1.1.1 네트워크 인터페이스를 통해 사이트를 방문하는 모든 사람은 HTTP 요청의 호스트 필드(즉, URL 표시줄에 기록된 도메인 이름)와는 별도로 /srv/web1에서 파일을 받습니다.

server_name다음과 같이 지시문 에 IP 주소를 입력하면 또 다른 유사한 동작을 얻을 수 있습니다 .

server {
    listen 80;
    server_name 1.1.1.1;
    [...]
}
* 이 마지막 server블록은 도메인 이름이 아닌 실제 IP 주소에 대한 요청만 포착합니다.

이것이 귀하의 질문에 대한 답변이 되기를 바랍니다. 다음번에는 현재 설정에 대한 추가 정보를 입력하고 조사해 보시기 바랍니다.

업데이트

설명된 동작을 얻으려면 다음을 사용할 수 있습니다.지역기준 치수설명된 대로이 질문:

geo $client {
    default web2;
    1.1.1.1 web1;
}
server {
    [...]
    root /srv/$client;
    [...]
}
이 구성은지역$client클라이언트의 IP 주소를 기반으로 변수( )를 설정하는 모듈입니다 . 해당 변수는 기본값 중 하나로 설정됩니다.웹2아니면 구체적인웹1그런 다음 지시문에서 대체됩니다 root.

지시문은 블록 이 아닌 블록 geo내부에 있어야 합니다 . 위의 스니펫은 있는 그대로 작동하지만 테스트하지 않았으므로 아무 것도 보장하지 않습니다.httpserver

관련 정보